立志成为饮水机!

洛谷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 }
复制代码

 

posted @   寒冰大大  阅读(203)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示