acm-(线段树)2020ICPC·小米 网络选拔赛第二场 C.Data Structure Problem

题面
传送门
首先 c x = m a x 0 ≤ i ≤ x { a [ i ] + s u m [ x ] − s u m [ i ] } = s u m [ x ] + m a x 0 ≤ i ≤ x { a [ i ] − s u m [ i ] } c_x=max_{0\le i\le x}\{a[i]+sum[x]-sum[i]\}=sum[x]+max_{0\le i\le x}\{a[i]-sum[i]\} cx=max0ix{a[i]+sum[x]sum[i]}=sum[x]+max0ix{a[i]sum[i]},于是用线段树考虑维护 a [ i ] − s u m [ i ] a[i]-sum[i] a[i]sum[i]这个值即可,第一个操作对应修改 a [ x ] a[x] a[x],是单点修改,第二个操作对应修改 s u m [ x ∼ n ] sum[x\sim n] sum[xn],是区间修改,第三个操作是查询 a [ i ] − s u m [ i ] a[i]-sum[i] a[i]sum[i]在区间 x ∼ n x\sim n xn上的最大值,这三个操作都很好用线段树维护。

int a[maxn],b[maxn];
ll t[maxn<<2],sum[maxn],lz[maxn<<2];
void pushup(int rt){
	t[rt]=max(t[rt<<1],t[rt<<1|1]);
}
void pushdown(int rt){
	if(lz[rt]){
		lz[rt<<1]+=lz[rt];
		lz[rt<<1|1]+=lz[rt];
		t[rt<<1]+=lz[rt];
		t[rt<<1|1]+=lz[rt];
		lz[rt]=0;
	}
}
void build(int rt,int l,int r){
	lz[rt]=0;
	if(l==r){
		t[rt]=a[l]-sum[l];
		return ;
	}
	int mid=l+r>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	pushup(rt);
} 
void cg(int rt,int l,int r,int ql,int qr,int ad){
	if(l>=ql && r<=qr){
		t[rt]+=ad;
		lz[rt]+=ad;
		return;
	}
	pushdown(rt);
	int mid=l+r>>1;
	if(l<=qr && mid>=ql)cg(rt<<1,l,mid,ql,qr,ad);
	if(mid+1<=qr && r>=ql)cg(rt<<1|1,mid+1,r,ql,qr,ad);
	pushup(rt);
}
ll qry(int rt,int l,int r,int ql,int qr){
	if(l>=ql && r<=qr){
		return t[rt];
	}
	int mid=l+r>>1;
	pushdown(rt);
	ll ans=-INF;
	if(l<=qr && mid>=ql)ans=qry(rt<<1,l,mid,ql,qr);
	if(mid+1<=qr && r>=ql)ans=max(ans,qry(rt<<1|1,mid+1,r,ql,qr));
	pushup(rt);
	return ans;
}
int main(){
	int n=rd(),m=rd();
	while(n && m){
		FOR(i,1,n+1)a[i]=rd();
		FOR(i,1,n+1){
			b[i]=rd();
			sum[i]=sum[i-1]+b[i];
		}
		build(1,1,n);
		while(m--){
			int op=rd(),x,y;
			if(op==1){
				x=rd(),y=rd();
				cg(1,1,n,x,x,y-a[x]);
				a[x]=y; 
			}else if(op==2){
				x=rd(),y=rd();
				cg(1,1,n,x,n,b[x]-y);
				b[x]=y;
			}else if(op==3){
				x=rd();
				wrn(a[x]-qry(1,1,n,x,x)+max(0ll,qry(1,1,n,1,x)));
			}
		}
		n=rd(),m=rd();
	} 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值