社区讨论
萌新刚学OI,性别武装直升机求调/kel
CF739C Alyona and towers参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lp0z5pif
- 此快照首次捕获于
- 2023/11/16 17:14 2 年前
- 此快照最后确认于
- 2023/11/16 19:05 2 年前
111rt,萌新求调代码 WAon#4
CPP// LUOGU_RID: 135389320
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
struct zz{
int l,r;
int lval,rval;
int lline,rline;
int lans,rans;
int tag;
int sum;
int len;
};
zz operator +(const zz x,const zz y){
zz now;
now.l=x.l,now.r=y.r;
now.lval=x.lval,now.rval=y.rval;
now.len=x.len+y.len;
now.tag=0;
if(x.lline==x.len){
if(x.rval>y.lval) now.lline=x.len+y.lline;
else now.lline=x.len;
}
else now.lline=x.lline;
if(y.rline==y.len){
if(x.rval<y.lval) now.rline=y.len+x.rline;
else now.rline=y.len;
}
else now.rline=y.rline;
now.lans=x.lans;
if(x.lans==x.len&&x.rval>y.lval) now.lans=max(now.lans,x.len+y.lline);
if(x.lline==x.len&&x.rval<y.rval) now.lans=max(now.lans,x.len+y.lans);
now.rans=y.rans;
if(y.rans==y.len&&x.rval<y.lval) now.rans=max(now.rans,x.rline+y.len);
if(y.rline==y.len&&x.rval>y.lval) now.rans=max(now.rans,x.rans+y.len);
now.sum=max(x.sum,y.sum);
if(x.rval>y.lval) now.sum=max(now.sum,x.rans+y.lline);
if(x.rval<y.lval) now.sum=max(now.sum,x.rline+y.lans);
return now;
}
int a[300006];
int n;
struct Tree{
#define lc p<<1
#define rc p<<1|1
zz t[2000005];
void Push_Down(int p){
if(!t[p].tag) return ;
t[lc].lval+=t[p].tag,t[rc].lval+=t[p].tag;
t[lc].rval+=t[p].tag,t[rc].rval+=t[p].tag;
t[lc].tag+=t[p].tag,t[rc].tag+=t[p].tag;
t[p].tag=0;
}
void Build_Tree(int p,int l,int r){
t[p].l=l,t[p].r=r,t[p].tag=0,t[p].len=r-l+1;
// printf("?%d %d %d:%d %d\n",p,l,r,t[p].l,t[p].r);
if(t[p].l==t[p].r) return t[p].lval=t[p].rval=a[l],t[p].sum=t[p].lline=t[p].rline=t[p].lans=t[p].rans=t[p].sum=1,void();
int mid=(t[p].l+t[p].r)>>1;
Build_Tree(lc,l,mid),Build_Tree(rc,mid+1,r);
t[p]=t[lc]+t[rc];
}
void Change_Tree(int p,int l,int r,int val){
// printf("%d %d %d %d %d\n",p,l,r,t[p].l,t[p].r);
if(l<=t[p].l&&t[p].r<=r) return t[p].lval+=val,t[p].rval+=val,t[p].tag+=val,void();
Push_Down(p);
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid) Change_Tree(lc,l,r,val);
if(mid+1<=r) Change_Tree(rc,l,r,val);
t[p]=t[lc]+t[rc];
}
}T;
signed main(){
cin>>n;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
T.Build_Tree(1,1,n);
int q;cin>>q;
for(int i=1,l,r,val;i<=q;i++){
scanf("%lld%lld%lld",&l,&r,&val);
T.Change_Tree(1,l,r,val);
// printf("%d %d %d %d %d\n",T.t[1].lans,T.t[1].lline,T.t[1].sum,T.t[1].rline,T.t[1].rans);
printf("%lld\n",T.t[1].sum);
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...