LuoguP3948数据结构 10-20
是比较裸的差分题目,但是要注意在线查询的时候开始傻了,每次都暴力地从1到n搞一遍,还存在数组中每次都要清空...结果T了很多点。
其实在线查询的时候直接用变量+扫到r就行了。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 5 using namespace std; 6 typedef long long ll; 7 8 int n,opt,tot,fin; 9 char doit[5]; 10 ll sjt,minn,maxx; 11 ll cha[100000],sta[100000],sum[100000]; 12 13 int main() 14 { 15 scanf("%d%d",&n,&opt); 16 scanf("%lld%lld%lld",&sjt,&minn,&maxx); 17 for(int i=1;i<=opt;i++) 18 { 19 int l=0,r=0;ll x=0; 20 scanf("%s",doit+1); 21 if(doit[1]=='A') 22 { 23 scanf("%d%d%lld",&l,&r,&x); 24 cha[l]+=x,cha[r+1]-=x; 25 } 26 else 27 { 28 scanf("%d%d",&l,&r); 29 ll noww=0,cnt=0; 30 for(int i=1;i<=r;i++) 31 { 32 noww+=cha[i]; 33 ll cmp=noww*i%sjt; 34 if(i>=l&&cmp>=minn&&cmp<=maxx) cnt++; 35 } 36 printf("%lld\n",cnt); 37 } 38 } 39 for(int i=1;i<=n;i++) sta[i]=sta[i-1]+cha[i]; 40 for(int i=1;i<=n;i++) 41 { 42 sum[i]=sum[i-1]; 43 ll cmp=sta[i]*i%sjt; 44 if(cmp>=minn&&cmp<=maxx) sum[i]++; 45 } 46 scanf("%d",&fin); 47 for(int i=1;i<=fin;i++) 48 { 49 int l=0,r=0; 50 scanf("%d%d",&l,&r); 51 printf("%lld\n",sum[r]-sum[l-1]); 52 } 53 return 0; 54 }