Codeforce 390C

来源:互联网 发布:mac os x能玩剑网三吗? 编辑:程序博客网 时间:2024/05/21 13:43

链接:点击打开链接

题意:给出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个数是1    int 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;}

0 0
原创粉丝点击