杂题选录

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 }
View Code

猜你喜欢

转载自www.cnblogs.com/nopartyfoucaodong/p/9822775.html