社区讨论

萌新刚学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 条回复,欢迎继续交流。

正在加载回复...