洛谷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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?