我发现了一个很奇怪的问题,而且每次错都是这样错

P3373 【模板】线段树 2

@[所有人](/space/show?uid=88789)
by Brandon鹏 @ 2018-08-15 14:33:47


@everyone
by Brandon鹏 @ 2018-08-15 14:34:42


@[Planet6174](/space/show?uid=29762)
by Brandon鹏 @ 2018-08-15 14:36:34


@[lzc2001](/space/show?uid=19195)
by Brandon鹏 @ 2018-08-15 14:37:29


@[所有人](/space/show?uid=88789) @[所有人](/space/show?uid=88789) @[所有人](/space/show?uid=88789)
by Juanzhang @ 2018-08-15 14:39:25


@[小光](/space/show?uid=73934) 求救,大佬不要见死不救啊
by Brandon鹏 @ 2018-08-15 14:49:32


@[Brandon鹏](/space/show?uid=86154) ```cpp #include<cstdio> struct node { int l; int r; int sum; int ts; int tm; }tree[100001*4]; int a[100001]; int n,m; int p; void se(int root,int s,int e) { tree[root].l=s; tree[root].r=e; tree[root].ts=0; tree[root].tm=1; if(s==e) { tree[root].sum=a[s]; } else { se(root*2,s,(s+e)/2); se(root*2+1,(s+e)/2+1,e); tree[root].sum=(tree[root*2].sum+tree[root*2+1].sum)%p; } } void pushdown(int root) { tree[root*2].sum=(tree[root*2].sum*tree[root].tm+tree[root].ts*(tree[root*2].r-tree[root*2].l+1))%p; tree[root*2+1].sum=(tree[root*2+1].sum*tree[root].tm+tree[root].ts*(tree[root*2+1].r-tree[root*2+1].l+1))%p; tree[root*2].tm=(tree[root].tm*tree[root*2].tm)%p; tree[root*2+1].tm=(tree[root].tm*tree[root*2+1].tm)%p; tree[root*2].ts=(tree[root*2].ts*tree[root].tm+tree[root].ts)%p; tree[root*2+1].ts=(tree[root*2+1].ts*tree[root].tm+tree[root].ts)%p; tree[root].ts=0; tree[root].tm=1; } void mul(int root,int s,int e,int num) { if(tree[root].l==s&&tree[root].r==e) { tree[root].sum=(tree[root].sum*num)%p; tree[root].ts=(tree[root].ts*num)%p; tree[root].tm=(tree[root].tm*num)%p; return; } pushdown(root); if(e<=tree[root*2].r) { mul(root*2,s,e,num); } else { if(s>=tree[root*2+1].l) { mul(root*2+1,s,e,num); } else { mul(root*2,s,tree[root*2].r,num); mul(root*2+1,tree[root*2+1].l,e,num); } } tree[root].sum=(tree[root*2].sum+tree[root*2+1].sum)%p; } void add(int root,int s,int e,int num) { if(tree[root].l==s&&tree[root].r==e) { tree[root].sum=(tree[root].sum+num*(e-s+1))%p; tree[root].ts=(tree[root].ts+num)%p; return; } pushdown(root); if(e<=tree[root*2].r) { add(root*2,s,e,num); } else { if(s>=tree[root*2+1].l) { add(root*2+1,s,e,num); } else { add(root*2,s,tree[root*2].r,num); add(root*2+1,tree[root*2+1].l,e,num); } } tree[root].sum=(tree[root*2].sum+tree[root*2+1].sum)%p; } int que(int root,int s,int e) { if(tree[root].l==s&&tree[root].r==e) { return tree[root].sum; } pushdown(root); int ans=0; if(e<=tree[root*2].r) { ans=(que(root*2,s,e))%p; } else { if(s>=tree[root*2+1].l) { ans=(que(root*2+1,s,e))%p; } else { ans=(que(root*2,s,tree[root*2].r)+ans)%p; ans=(que(root*2+1,tree[root*2+1].l,e))%p; } } return ans; } int main() { scanf("%d%d%d",&n,&m,&p); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } se(1,1,n); for(int i=1;i<=m;i++) { int k; scanf("%d",&k); if(k==1) { int s,e,num; scanf("%d%d%d",&s,&e,&num); mul(1,s,e,num); } if(k==2) { int s,e,num; scanf("%d%d%d",&s,&e,&num); add(1,s,e,num); } if(k==3) { int s,e; scanf("%d%d",&s,&e); printf("%d\n",que(1,s,e)); } } return 0; } ```
by Brandon鹏 @ 2018-08-15 14:49:57


@[Brandon鹏](/space/show?uid=86154) ```cpp #include<cstdio> struct node { int l; int r; int sum; int ts; int tm; }tree[100001*4]; int a[100001]; int n,m; int p; void se(int root,int s,int e) { tree[root].l=s; tree[root].r=e; tree[root].ts=0; tree[root].tm=1; if(s==e) { tree[root].sum=a[s]; } else { se(root*2,s,(s+e)/2); se(root*2+1,(s+e)/2+1,e); tree[root].sum=(tree[root*2].sum+tree[root*2+1].sum)%p; } } void pushdown(int root) { tree[root*2].sum=(tree[root*2].sum*tree[root].tm+tree[root].ts*(tree[root*2].r-tree[root*2].l+1))%p; tree[root*2+1].sum=(tree[root*2+1].sum*tree[root].tm+tree[root].ts*(tree[root*2+1].r-tree[root*2+1].l+1))%p; tree[root*2].tm=(tree[root].tm*tree[root*2].tm)%p; tree[root*2+1].tm=(tree[root].tm*tree[root*2+1].tm)%p; tree[root*2].ts=(tree[root*2].ts*tree[root].tm+tree[root].ts)%p; tree[root*2+1].ts=(tree[root*2+1].ts*tree[root].tm+tree[root].ts)%p; tree[root].ts=0; tree[root].tm=1; } void mul(int root,int s,int e,int num) { if(tree[root].l==s&&tree[root].r==e) { tree[root].sum=(tree[root].sum*num)%p; tree[root].ts=(tree[root].ts*num)%p; tree[root].tm=(tree[root].tm*num)%p; return; } pushdown(root); if(e<=tree[root*2].r) { mul(root*2,s,e,num); } else { if(s>=tree[root*2+1].l) { mul(root*2+1,s,e,num); } else { mul(root*2,s,tree[root*2].r,num); mul(root*2+1,tree[root*2+1].l,e,num); } } tree[root].sum=(tree[root*2].sum+tree[root*2+1].sum)%p; } void add(int root,int s,int e,int num) { if(tree[root].l==s&&tree[root].r==e) { tree[root].sum=(tree[root].sum+num*(e-s+1))%p; tree[root].ts=(tree[root].ts+num)%p; return; } pushdown(root); if(e<=tree[root*2].r) { add(root*2,s,e,num); } else { if(s>=tree[root*2+1].l) { add(root*2+1,s,e,num); } else { add(root*2,s,tree[root*2].r,num); add(root*2+1,tree[root*2+1].l,e,num); } } tree[root].sum=(tree[root*2].sum+tree[root*2+1].sum)%p; } int que(int root,int s,int e) { if(tree[root].l==s&&tree[root].r==e) { return tree[root].sum; } pushdown(root); int ans=0; if(e<=tree[root*2].r) { ans=(que(root*2,s,e))%p; } else { if(s>=tree[root*2+1].l) { ans=(que(root*2+1,s,e))%p; } else { ans=(que(root*2,s,tree[root*2].r)+ans)%p; ans=(que(root*2+1,tree[root*2+1].l,e))%p; } } return ans; } int main() { scanf("%d%d%d",&n,&m,&p); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } se(1,1,n); for(int i=1;i<=m;i++) { int k; scanf("%d",&k); if(k==1) { int s,e,num; scanf("%d%d%d",&s,&e,&num); mul(1,s,e,num); } if(k==2) { int s,e,num; scanf("%d%d%d",&s,&e,&num); add(1,s,e,num); } if(k==3) { int s,e; scanf("%d%d",&s,&e); printf("%d\n",que(1,s,e)); } } return 0; } ```
by Brandon鹏 @ 2018-08-15 14:50:16


~~printf(“难受”);~~
by Brandon鹏 @ 2018-08-15 15:00:43


膜拜前排dalao
by Tarjan90° @ 2018-08-15 15:45:06


| 下一页