洛谷P2023 [AHOI2009]维护序列

数据比线段树2要毒瘤,一直60分的原因是:

1.long long 没开

2.没有边做边%或者像我P3373一样写了个看着像的边做边%

3.要看注释的话可以跳到P3373

上代码

  1 #include<iostream>
  2 #include<cmath> 
  3 #include<cstdio>
  4 #include<cstring>
  5 #include<queue>
  6 #define lson i*2,l,mid
  7 #define rson i*2+1,mid+1,r
  8 using namespace std;
  9 
 10 struct tree{
 11     long long mul;
 12     long long add;
 13     long long sum;
 14     long long l,r; 
 15 }t[400860];
 16 
 17 long long n,m,a[100860],p;
 18 
 19 void build_tree(long long i,long long l,long long r)
 20 {
 21     t[i].l=l;
 22     t[i].r=r;
 23     t[i].mul=1;
 24     t[i].sum=0;
 25     t[i].add=0; 
 26     if(l==r)
 27     {
 28         t[i].sum=a[l]%p;
 29         return ;
 30     }
 31     long long mid=(l+r)/2;
 32     build_tree(lson);
 33     build_tree(rson);
 34     t[i].sum=(t[i*2].sum+t[i*2+1].sum)%p;
 35 }
 36 
 37 void pushdown2(long long i)
 38 {
 39     t[i*2].mul=t[i].mul%p*t[i*2].mul%p;
 40     t[i*2+1].mul=t[i].mul%p*t[i*2+1].mul%p;
 41     t[i*2].add=(t[i*2].add%p*t[i].mul%p+t[i].add)%p;
 42     t[i*2+1].add=(t[i*2+1].add%p*t[i].mul%p+t[i].add)%p;
 43     t[i*2].sum=(t[i].mul%p*t[i*2].sum%p+t[i].add%p*(t[i*2].r-t[i*2].l+1))%p;
 44     t[i*2+1].sum=(t[i].mul%p*t[i*2+1].sum+t[i].add%p*(t[i*2+1].r-t[i*2+1].l+1))%p;
 45     t[i].add=0;
 46     t[i].mul=1;
 47 }
 48 void pushdown(long long i)
 49 {
 50     t[i*2].mul=t[i].mul%p*t[i*2].mul%p;
 51     t[i*2+1].mul=t[i*2+1].mul%p*t[i].mul%p;
 52     t[i*2].add=(t[i*2].add%p*t[i].mul%p+t[i].add)%p;
 53     t[i*2+1].add=(t[i*2+1].add%p*t[i].mul%p+t[i].add)%p;
 54     t[i*2].sum=(t[i].mul%p*t[i*2].sum%p+t[i].add%p*(t[i*2].r-t[i*2].l+1))%p;
 55     t[i*2+1].sum=(t[i].mul%p*t[i*2+1].sum%p+t[i].add%p*(t[i*2+1].r-t[i*2+1].l+1))%p;
 56     t[i].add=0;
 57     t[i].mul=1;
 58 }
 59 void mul_tree(long long i,long long l,long long r,long long x,long long y,long long a)
 60 {
 61     if(l>=x&&r<=y)
 62     {
 63         t[i].sum*=a%p;
 64         t[i].sum%=p; 
 65         t[i].mul*=a%p;
 66         t[i].mul%=p; 
 67         t[i].add*=a%p;
 68         t[i].mul%=p; 
 69         return ;
 70     }
 71     pushdown(i);
 72     long long mid=(l+r)/2;
 73     if(x<=mid) mul_tree(lson,x,y,a);
 74     if(y>mid) mul_tree(rson,x,y,a);
 75     t[i].sum=(t[i*2].sum+t[i*2+1].sum)%p;
 76 }
 77 void add_tree(long long i,long long l,long long r,long long x,long long y,long long a)
 78 {
 79     if(l>=x&&r<=y)
 80     {
 81         //t[i].mul*=a%p;    
 82         t[i].add+=a%p;
 83         t[i].add%=p;
 84         t[i].sum+=(t[i].r-t[i].l+1)*a%p;
 85         t[i].sum%=p;
 86         return ;
 87     }
 88     pushdown(i);
 89     long long mid=(l+r)/2;
 90     if(x<=mid) add_tree(lson,x,y,a);
 91     if(y>mid) add_tree(rson,x,y,a);
 92     t[i].sum=(t[i*2].sum+t[i*2+1].sum)%p;
 93  } 
 94  
 95 long long query_tree(long long i,long long l,long long r,long long a,long long b)
 96 {
 97      if(l>=a&&r<=b)
 98      {
 99          return t[i].sum%p;
100     }
101     long long mid=(l+r)/2;
102     long long ans=0;
103     pushdown(i);
104     if(a<=mid) ans+=query_tree(lson,a,b)%p;
105     if(b>mid) ans+=query_tree(rson,a,b)%p;
106     return ans%p;
107     
108 }
109 int main()
110 {
111     scanf("%lld %lld ",&n,&p);
112     long long i,j;
113     for(i=1;i<=n;i++)
114     scanf("%lld ",&a[i]); 
115     scanf("%lld ",&m);
116     build_tree(1,1,n);
117     for(i=1;i<=m;i++)
118     {
119         long long k;
120         long long t1,t2,t3;
121         scanf("%lld ",&k);
122         if(k==1)
123         {
124             scanf("%lld %lld %lld ",&t1,&t2,&t3);
125             mul_tree(1,1,n,t1,t2,t3);    
126             //printf("%lld \n",query_tree(1,1,n,t1,t2)%p);
127         }
128         if(k==2)
129         {
130             scanf("%lld %lld %lld ",&t1,&t2,&t3);
131             add_tree(1,1,n,t1,t2,t3);
132             //printf("%lld \n",query_tree(1,1,n,t1,t2)%p);
133         }
134         if(k==3)
135         {
136             scanf("%lld %lld ",&t1,&t2);
137             printf("%lld \n",query_tree(1,1,n,t1,t2)%p);
138         }
139      } 
140      return 0;
141 }
原文地址:https://www.cnblogs.com/zsx6/p/10347083.html