【洛谷3948】数据结构

题面

分析

看着数据规模很大,实际上Q只有1000组,后面都是无修改的询问了。

于是考虑到差分区间修改,可以达到O(1)的效率,而每次查询的时候再O(N)计算差分数组的前缀和即可。

对于后面不带修改的询问,只需要O(N)维护前缀和

时间复杂度O(N*Q)。其实感觉就是个暴力qvq

代码

  1. #include<bits/stdc++.h>  
  2. using namespace std;  
  3. #define N 800080  
  4. #define ll long long  
  5. ll minx,maxx,mod,n,q,l,r,x,ans,now,final;  
  6. char op[10];  
  7. ll a[N],c[N],sum[N];  
  8. template<class T>  
  9. inline void read(T &x)  
  10. {  
  11.     x=0;ll f=1;static char c=getchar();   
  12.     while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}  
  13.     while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}  
  14.     x*=f;  
  15. }  
  16. int main()  
  17. {  
  18.     read(n);read(q);read(mod);read(minx);read(maxx);  
  19.     while(q--)  
  20.     {  
  21.         scanf("%s",op);  
  22.         if(op[0]=='A')  
  23.         {  
  24.             read(l),read(r),read(x);  
  25.             c[l]+=x;c[r+1]-=x;  
  26.         }  
  27.         else  
  28.         {  
  29.             ans=0;now=0;  
  30.             read(l);read(r);  
  31.             for(ll i=1;i<=r;i++)  
  32.             {  
  33.                 now+=c[i];  
  34.                 if(i>=l&&(now*i)%mod>=minx&&(now*i)%mod<=maxx)  
  35.                     ans++;  
  36.             }     
  37.             printf("%lld ",ans);  
  38.         }  
  39.     }  
  40.     read(final);  
  41.     for(ll i=1;i<=n;i++)  
  42.     {  
  43.         a[i]=a[i-1]+c[i];  
  44.         if((a[i]*i)%mod>=minx&&(a[i]*i)%mod<=maxx)sum[i]=sum[i-1]+1;  
  45.         else sum[i]=sum[i-1];  
  46.     }  
  47.     while(final--)  
  48.     {  
  49.         read(l);read(r);  
  50.         printf("%lld ",sum[r]-sum[l-1]);  
  51.     }  
  52.     return 0;  
  53. }   
原文地址:https://www.cnblogs.com/NSD-email0820/p/9852916.html