60pts 求助嘤嘤嘤
查看原帖
60pts 求助嘤嘤嘤
203008
山田リョウ楼主2024/4/30 20:49

写不会一点线段树,破大防了/ll

讨论区说的各种 hack 大致都对过一遍了,好像没找到错/ng

// Problem: P4314 CPU 监控
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4314
// Memory Limit: 128 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<stdio.h>
const int inf=0x7fffffff;
struct{
	int Mx,mx,add,Add,psh;
	bool flag;
}tr[400001];
int max(int a,int b){return a>b?a:b;}
void pushup(int u){
	tr[u].Mx=max(max(tr[u<<1].Mx,tr[u<<1|1].Mx),tr[u].mx=max(tr[u<<1].mx,tr[u<<1|1].mx));
}
void _add(int u,int v,int k){
	if(!tr[u].flag)tr[u].Add=max(tr[u].Add,tr[u].add+k);
	else tr[u].psh=max(tr[u].psh,tr[u].mx+k);
	tr[u].Mx=max(tr[u].Mx,tr[u].mx+k),tr[u].mx+=v,tr[u].add+=v;
}
void _push(int u,int v,int k){
	tr[u].Mx=max(tr[u].Mx,tr[u].psh=max(tr[u].psh,k)),tr[u].mx=v,tr[u].add=0,tr[u].flag=true;
}
void pushdown(int u){
	if(tr[u].flag)_push(u<<1,tr[u].mx,tr[u].psh),_push(u<<1|1,tr[u].mx,tr[u].psh);
	else _add(u<<1,tr[u].add,tr[u].Add),_add(u<<1|1,tr[u].add,tr[u].Add);
    tr[u].flag=false,tr[u].Add=tr[u].add=0,tr[u].psh=-inf;
}
void build(int u,int l,int r){
	if(l<r){
		int mid=l+r>>1;
		build(u<<1,l,mid),build(u<<1|1,mid+1,r),pushup(u);
	}else scanf("%d",&tr[u].mx),tr[u].Mx=tr[u].mx,tr[u].flag=1;
	tr[u].psh=-inf;
}
void add(int ql,int qr,int v,int u,int l,int r){
	if(ql<=l&&r<=qr)return _add(u,v,v);
	int mid=l+r>>1;pushdown(u);
	if(ql<=mid)add(ql,qr,v,u<<1,l,mid);
	if(qr>mid)add(ql,qr,v,u<<1|1,mid+1,r);
	pushup(u);
}
void push(int ql,int qr,int v,int u,int l,int r){
	if(ql<=l&&r<=qr)return _push(u,v,v);
	int mid=l+r>>1;pushdown(u);
	if(ql<=mid)push(ql,qr,v,u<<1,l,mid);
	if(qr>mid)push(ql,qr,v,u<<1|1,mid+1,r);
	pushup(u);
}
int querymax(int ql,int qr,int u,int l,int r){
	if(ql<=l&&r<=qr)return tr[u].mx;
	int mid=l+r>>1,res=-inf;pushdown(u);
	if(ql<=mid)res=max(res,querymax(ql,qr,u<<1,l,mid));
	if(qr>mid)res=max(res,querymax(ql,qr,u<<1|1,mid+1,r));
	return res;
}
int queryMax(int ql,int qr,int u,int l,int r){
	if(ql<=l&&r<=qr)return tr[u].Mx;
	int mid=l+r>>1,res=-inf;pushdown(u);
	if(ql<=mid)res=max(res,queryMax(ql,qr,u<<1,l,mid));
	if(qr>mid)res=max(res,queryMax(ql,qr,u<<1|1,mid+1,r));
	return res;
}
int main(){
	int n,m,l,r,x;char c;
	scanf("%d",&n);
	build(1,1,n);
	for(scanf("%d",&m);m--;){
		scanf(" %c%d%d",&c,&l,&r);
		if(c=='Q')printf("%d\n",querymax(l,r,1,1,n));
		else if(c=='A')printf("%d\n",queryMax(l,r,1,1,n));
		else{
			scanf("%d",&x);
			if(c=='P')add(l,r,x,1,1,n);
			else push(l,r,x,1,1,n);
		}
	}
	return 0;
}
2024/4/30 20:49
加载中...