这题是预处理的题。
ans=(当前区间内的总糖果数-当前区间内放对位置的糖果数)+(需要放的糖果数-当前区间内放对位置的糖果数)
前者是需要拿走的,后者是需要放入的。
当前区间内的糖果数是需要枚举计算n+count*k-1(1<=n<=k)到n的区间内放对位置的糖果数的累计和。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int a[100005]; bool b[100005]; int d[100005]; int main() { int n,k,w; char c; scanf("%d%d%d",&n,&k,&w); memset(b,0,sizeof(b)); getchar(); int num=0; a[0]=0; for(int i=1;i<=n;i++) { scanf("%c",&c); if(c=='1') { b[i]=true; num++; } a[i]=num; } memset(d,0,sizeof(d)); for(int i=1;i<=k;i++) { int tot=0; for(int count=1;i+count*k-1<=n;count++) { if(b[i+count*k-1]) { tot++; } d[i+count*k-1]=tot; } } //for(int i=1;i<=n;i++) printf("%d ",d[i]); while(w--) { int l,r; scanf("%d%d",&l,&r); int cnt=(r-l+1)/k; printf("%d\n",a[r]-a[l-1]+cnt-2*(d[r]-d[l-1])); } return 0; }