求助纯线段树,无差分,只为证明其正确性而求调

P1438 无聊的数列

重点是pushdown ,实在找不到错误或者纰漏,但是下面的样例对拍出错
by cmrhhh @ 2024-04-27 21:34:35


pushdown第三行(r-l)应该不用+1,手模下试试
by 汪汪队队长1 @ 2024-04-29 19:51:25


@[汪汪队队长1](/user/554644) %%%感谢巨佬
by cmrhhh @ 2024-04-30 21:34:14


我的AC 代码,但是有一点疑惑,就是改错的第三条,我的思路就是最朴素的维护kd懒tag。求助QwQ ```cpp #include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=1e5+10; int n,m,opt,a[MAXN]; struct Lazy{ int k,d; }lazy[MAXN<<2]; struct Tree{ int l,r,sum; }tr[MAXN<<2]; void pushup(int x){ tr[x].sum=tr[x<<1].sum+tr[x<<1|1].sum; } void build(int x,int l,int r){ tr[x]=(Tree){l,r,a[l]}; if(l==r)return ; int m=(l+r)>>1; build(x<<1,l,m); build(x<<1|1,m+1,r); pushup(x); } void pushdown(int x){ lazy[x<<1].k+=lazy[x].k; lazy[x<<1].d+=lazy[x].d; lazy[x<<1|1].k+=lazy[x].k+lazy[x].d*(tr[x<<1].r-tr[x<<1].l+1); lazy[x<<1|1].d+=lazy[x].d; tr[x<<1].sum+=(2*lazy[x].k+lazy[x].d*(tr[x<<1].r-tr[x<<1].l))*(tr[x<<1].r-tr[x<<1].l+1)>>1; tr[x<<1|1].sum+=(2*lazy[x].k+2*lazy[x].d*(tr[x<<1].r-tr[x<<1].l+1)+lazy[x].d*(tr[x<<1|1].r-tr[x<<1|1].l))*(tr[x<<1|1].r-tr[x<<1|1].l+1)>>1; lazy[x]=(Lazy){0,0}; // if(475<=tr[x<<1].l&&tr[x<<1].r<=738&&tr[x<<1].l==tr[x<<1].r)cout<<"pushdown "<<x<<" "<<tr[x<<1].l<<" "<<tr[x<<1].r<<" "<<lazy[x<<1].k<<" "<<(tr[x<<1].l-475)*9+10<<"\n"; // if(475<=tr[x<<1|1].l&&tr[x<<1|1].r<=738&&tr[x<<1|1].l==tr[x<<1|1].r)cout<<"pushdown "<<x<<" "<<tr[x<<1|1].l<<" "<<tr[x<<1|1].r<<" "<<lazy[x<<1|1].k<<" "<<(tr[x<<1|1].l-475)*9+10<<"\n"; } void upd(int x,int l,int r,int k,int d){ if(l<=tr[x].l&&tr[x].r<=r){ lazy[x].k+=k; lazy[x].d+=d; tr[x].sum+=(2*k+(tr[x].r-tr[x].l)*d)*(tr[x].r-tr[x].l+1)>>1; // cout<<"upd "<<tr[x].l<<" "<<lazy[x].k<<" "<<(tr[x].l-475)*9+10<<"\n"; return ; } int m=(tr[x].l+tr[x].r)>>1; pushdown(x); if(l<=m)upd(x<<1,l,r,k,d); if(m<r){ if(l<=m)upd(x<<1|1,m+1,r,k+(m-l+1)*d,d); else upd(x<<1|1,l,r,k,d); } pushup(x); } int query(int x,int l,int r){ if(l<=tr[x].l&&tr[x].r<=r){ return tr[x].sum; } int m=(tr[x].l+tr[x].r)>>1; pushdown(x);int s=0; if(l<=m)s+=query(x<<1,l,r); if(m<r)s+=query(x<<1|1,l,r); return s; } signed main(){ int l,r,K,D,p; // freopen("1.in","r",stdin); scanf("%lld%lld",&n,&m); for(int i=1;i<=n;++i)scanf("%lld",&a[i]); build(1,1,n); for(int i=1;i<=m;++i){ scanf("%lld",&opt); if(opt==1){ scanf("%lld%lld%lld%lld",&l,&r,&K,&D); upd(1,l,r,K,D); } if(opt==2){ scanf("%lld",&p); printf("%lld\n",query(1,p,p)); } } return 0; } /* 1000 2 -8 5 0 9 -7 3 8 10 -4 -4 3 0 3 -2 4 1 1 -2 -4 4 8 8 -4 -7 -1 10 8 0 7 -6 3 -6 -9 -4 0 1 1 10 0 8 9 -2 4 4 -8 -6 10 1 9 4 3 5 8 3 8 -4 3 -6 5 1 -2 -1 -7 1 5 5 -6 -10 -5 -7 -3 -7 -7 -8 -2 -5 2 -3 -9 -8 10 -3 9 10 -4 0 5 2 5 -8 5 -9 6 2 -6 -9 -6 -5 -8 3 0 -8 0 0 -7 -10 6 1 5 1 -1 0 -1 -5 -7 -3 -5 0 -3 1 -2 -2 -6 1 -2 0 9 -7 -2 -3 -7 -9 10 -5 -7 -1 -9 -8 -1 8 -2 -7 7 -3 4 0 -4 -3 -4 -3 -1 7 -5 5 -3 4 -2 3 -6 9 -8 -9 4 -6 -10 -1 -7 6 10 3 10 2 -9 -8 -3 1 -5 10 10 9 -5 1 -10 -9 9 8 9 -3 1 -6 10 2 7 -9 3 4 -5 3 0 6 -7 5 -6 -7 9 -4 -5 4 0 4 -8 0 10 2 -10 6 -6 6 4 -7 1 -4 7 -10 -7 10 5 -5 0 -1 -9 7 -6 -2 -5 -9 6 -7 6 8 1 10 3 8 10 0 10 -2 -4 -2 6 -10 5 -7 2 1 4 -5 7 -8 -1 -7 6 2 2 -8 -5 7 3 0 1 -8 -9 -10 7 -9 1 3 -3 -6 4 -3 -4 7 -8 6 8 -6 -6 -9 -10 -2 -7 7 1 6 4 4 5 10 -10 8 -4 -5 6 4 -8 0 -10 4 4 -2 2 -3 -10 -5 -3 4 -5 8 -5 5 -7 3 -2 -8 -5 -6 -1 -10 -4 -2 0 3 -2 -4 -7 4 -7 4 8 -1 -6 -1 9 2 -2 -1 3 -6 7 -7 1 4 3 4 -8 7 5 -9 -1 7 -3 -8 -7 8 5 -9 -3 6 6 -5 9 3 -3 -2 8 2 -6 -6 10 -2 -4 3 3 9 -4 7 3 -7 10 8 8 9 0 9 9 -8 4 10 -8 -1 0 7 -1 5 10 -9 -1 -8 7 -5 -8 5 7 -10 7 7 9 6 -5 2 9 -1 8 -7 8 6 -10 -10 2 1 6 -10 -6 0 -1 -3 -5 -3 3 -1 -2 -8 3 6 0 0 -7 -4 10 10 8 8 10 5 4 8 -10 -1 -2 1 4 7 -9 1 -6 -3 3 -10 -4 2 -9 7 4 2 -5 9 -3 -7 4 0 -7 -10 10 -1 -9 9 10 0 -9 -2 3 0 -2 5 3 5 -6 -5 -4 8 -9 3 9 -3 -3 -7 8 9 7 -7 -5 -6 -8 -7 -7 8 0 -9 9 -7 9 -6 1 0 10 -5 -2 -4 1 -2 3 0 8 -7 8 1 8 6 6 -6 -1 -4 -6 -8 5 6 7 5 10 4 -6 -9 2 -6 1 8 -3 -2 3 5 9 2 1 -10 -3 -8 6 -4 -1 6 -9 -5 -7 7 -1 -6 9 -5 1 -1 1 -7 -1 -2 -9 9 6 3 8 9 7 -4 -4 -3 1 -6 -6 -8 -8 7 1 -8 -9 8 -7 0 8 10 5 -3 -4 0 4 -8 5 5 0 4 -3 -9 -6 3 9 -9 0 -6 -1 -7 -9 8 -3 1 -8 10 -7 -1 -1 -4 -5 10 9 -5 0 0 -6 1 -3 7 9 -2 -4 10 3 1 -9 -4 -9 -2 4 -2 1 3 9 -9 9 8 0 -4 4 3 -1 -1 -5 -10 1 -8 -3 -9 -6 7 1 5 -4 -6 -3 -2 -10 5 6 -1 6 4 -6 -1 -10 10 -7 5 7 -3 5 0 -5 -5 -5 2 5 5 3 -9 -6 -8 9 4 10 -8 -7 -1 9 1 7 10 5 9 2 3 8 9 5 6 1 0 -10 10 4 1 -1 -5 -4 9 9 0 -1 3 -3 -7 4 -4 -8 10 -8 8 -1 0 8 4 -10 -6 8 8 -3 -5 9 4 -2 6 8 1 0 -3 3 10 -3 7 -4 1 0 9 3 -10 -10 6 3 5 -8 -6 9 -6 -2 -5 4 4 -4 -8 6 -8 -6 10 -1 -3 -9 -5 9 2 2 10 4 2 -2 -6 -2 -2 -1 0 8 -7 1 0 -7 7 -6 -7 10 0 4 -6 1 -6 -4 -3 5 3 7 -5 -10 3 10 -8 1 0 9 8 0 2 2 7 -1 -9 -8 -5 8 4 5 7 -6 4 -4 8 -10 -1 6 5 -10 -10 2 0 4 -5 -2 -8 -1 -2 -3 5 -1 8 6 0 2 -5 -1 -9 9 3 -6 0 6 4 -3 5 3 -8 -2 -3 10 -6 -7 7 -5 8 -9 4 3 -9 -2 2 10 2 -3 9 -5 9 6 2 9 10 -7 -7 5 3 -2 4 3 10 -1 3 -4 7 -3 0 9 -7 5 1 -5 -2 3 8 -5 -6 -2 -9 -10 -1 -5 -2 9 -8 1 9 -10 6 -10 -1 -8 10 5 -2 -2 -7 8 -9 10 -9 -3 6 -8 4 3 3 4 8 10 6 3 -4 10 9 8 -7 8 -7 4 -6 9 -4 -3 1 1 -9 -9 10 -4 -2 3 -2 4 7 1 475 738 10 9 2 647 */ //1552 /* 错误(已改):1.upd 37 的 sum 用新增 kd更新 2.43 的特判 3.upd 47 的 if(l<=m)upd(x<<1|1,m+1,r,k+(m-l+1)*d,d); l->m+1 至于为什么我不理解,ctrl z 没撤销完意外通过 */ ```
by cmrhhh @ 2024-04-30 21:35:50


@[汪汪队队长1](/user/554644) 最近玉环教育网不好,前天甚至断网了,现在回家力
by cmrhhh @ 2024-04-30 21:36:54


行号有点错位(
by cmrhhh @ 2024-04-30 21:38:05


@[cmrhhh](/user/572587) 你说的对,但台州最强集中营五一不放假,变成放周五下午到周日下午(或上午)
by 汪汪队队长1 @ 2024-04-30 21:39:56


我好像懂了(第三条,能问出这个问题~~可见我的弱小~~)。这件事告诉我们不要赌气去写过于朴素,有奇技淫巧赶快用(bushi
by cmrhhh @ 2024-04-30 21:41:15


|