国内做香港视频网站/在线代理浏览国外网站
链接:点击打开链接
题意:给出n,k,w,然后给出一个n位的数字,询问w次,每次输入一个l,r,问需要改动几次使得区间内的数字满足条件(要求l+k-1,l+2*k-1,l+3*k-1......r位的数字为1,其余每一位都必须是0,每次改动只能改动一位)
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,k,w;
int s[15][100005],sign[100005],sum[100005];
int main(){ //n的范围特别大,但是k的范围最大为10,因为是每隔k个数是1int i,j,l,r,temp; //因此无论起点是哪一位,都可以转换为从1-k作为起点开始char c; //所以用一个二维数组记录所有情况while(scanf("%d%d%d",&n,&k,&w)!=EOF){getchar();memset(sign,0,sizeof(sign));memset(sum,0,sizeof(sum));memset(s,0,sizeof(s));for(i=1;i<=n;i++){scanf("%c",&c);if(c=='1')sign[i]=1;sum[i]=sum[i-1]+sign[i]; //k==1时无论哪一位都是1,只要记录1的个数}for(i=0;i<k;i++)for(j=1;j<=n;j++){s[i][j]=s[i][j-1];if((j-i+1+k)%k==0&&sign[j]==0)s[i][j]++;else if((j-i+1+k)%k!=0&&sign[j]==1)s[i][j]++;}
// for(i=0;i<k;i++){
// for(j=1;j<=n;j++)
// cout<<s[i][j]<<" ";
// cout<<endl;
// }while(w--){scanf("%d%d",&l,&r);if(k==1){printf("%d\n",(r-l+1)-(sum[r]-sum[l-1]));continue;}temp=l%k;printf("%d\n",s[temp][r]-s[temp][l-1]);}}return 0;
}