样例不过求条
查看原帖
样例不过求条
999274
CNS_5t0_0r2楼主2024/10/4 17:28
#include<bits/stdc++.h>
#define mid ((l + r) >> 1)
using namespace std;
const int N = 4e6 + 9,INF = 0x3f3f3f;
int n,m;
int a[N]; 
struct node{
	int val;
	int sum,Max,lsum,rsum;
	int pri;
	int lc,rc;
	int siz;
	int rev_tag,mod_tag;
} t[N];
int node_cnt,root;

void push_up(int u){
	t[u].siz = t[t[u].lc].siz + t[t[u].rc].siz + 1;
	t[u].sum = t[t[u].lc].sum + t[t[u].rc].sum + t[u].val;//不要漏了t[u].val!!! 
	t[u].Max = max(t[u].val + t[t[u].lc].rsum + t[t[u].rc].lsum,t[u].val);
	if(t[u].lc)
		t[u].Max = max(t[u].Max,t[t[u].lc].Max);
	if(t[u].rc)
		t[u].Max = max(t[u].Max,t[t[u].rc].Max);
	//不要漏了t[u].val!!! 
	t[u].lsum = max(max(t[t[u].lc].lsum,t[t[u].lc].sum + t[u].val + t[t[u].rc].lsum),0);
	t[u].rsum = max(max(t[t[u].rc].rsum,t[t[u].rc].sum + t[u].val + t[t[u].lc].rsum),0);
}
void make_rev_tag(int u){
	t[u].rev_tag ^= 1;
	swap(t[u].lc,t[u].rc);
	swap(t[u].lsum,t[u].rsum);
}
void make_mod_tag(int u,int v){
	t[u].val = t[u].mod_tag = v;
	t[u].sum = v * t[u].siz;
	t[u].Max = max(v,t[u].sum);
	t[u].lsum = t[u].rsum = max(t[u].sum,0);
} 
void push_down(int u){
	if(t[u].rev_tag){
		make_rev_tag(t[u].lc);
		make_rev_tag(t[u].rc);
		t[u].rev_tag = 0;
	}
	if(t[u].mod_tag != -INF){
		make_mod_tag(t[u].lc,t[u].mod_tag);
		make_mod_tag(t[u].rc,t[u].mod_tag);
		t[u].mod_tag = -INF;
	}
}

void split(int u,int x,int &L,int &R){//将以u为根的子树分裂成以L,R为根的两棵子树满足左子树所大小为x,
	if(u == 0){
		L = R = 0;
		return;
	}
	push_down(u);
	if(t[t[u].lc].siz < x){
		L = u;
		split(t[u].rc,x - t[t[u].lc].siz - 1,t[u].rc,R);
	}
	else{
		R = u;
		split(t[u].lc,x,L,t[u].lc);
	}
	push_up(u);
}
int merge(int u,int v){//将以u为根的树和以v为根的子树合并并返回合并后的根 
	if(!u || !v)//如果其中一个根为空那么合并后的根就是另一个根 
		return u | v;
	push_down(u);
	push_down(v);
	if(t[u].pri > t[v].pri){//u优先级大于v优先级,则u应为v的父亲(大根堆性质) 
		t[u].rc = merge(t[u].rc,v);//t[t[u].lc].val <= t[u].val <= t[v].val,所以合并t[u].rc和v
		push_up(u);
		return u;
	}
	else{//否则v应为u的父亲 
		t[v].lc = merge(u,t[v].lc);//t[t[v].rc].val >= t[v].val >= t[u].val,所以合并u和t[v].lc 
		push_up(v);
		return v;
	}
}

int new_node(int x){
	t[++node_cnt] = (node){
						x,
						x,x,max(x,0),max(x,0),
						rand() * rand(),
						0,0,
						1,
						0,-INF
	};
	return node_cnt;
}

int build(int l,int r){
	if(l == r)
		return new_node(a[l]);
	int u = merge(build(l,mid),build(mid + 1,r));
	//push_up(u);
	return u;
}

void Insert(int pos,int tot){
	int u,v;
	split(root,pos,u,v);
//	while(tot--){
//		int tmp;
//		cin >> tmp;
//		new_node(tmp);
//		root = merge(root,node_cnt);
//	}
	for(int i = 1;i <= tot;i++)
		cin >> a[i];
	root = merge(merge(u,build(1,tot)),v);
}
void Delete(int l,int r){
	int u,v,w;
	split(root,r,u,w);
	split(u,l - 1,u,v);
	root = merge(u,w);
}
void Modify(int l,int r,int k){
	int u,v,w;
	split(root,r,u,w);
	split(u,l - 1,u,v);
	make_mod_tag(v,k);
	root = merge(merge(u,v),w);
}
void Reverse(int l,int r){
	int u,v,w;
	split(root,r,u,w);
	split(u,l - 1,u,v);
	make_rev_tag(v);
	root = merge(merge(u,v),w);
}


int query_sum(int l,int r){
	int u,v,w;
	split(root,r,u,w);
	split(u,l - 1,u,v);
	int ret = t[v].sum;
	root = merge(merge(u,v),w);
	return ret;
}

int query_Max(int l,int r){
	int u,v,w;
	split(root,r,u,w);
	split(u,l - 1,u,v);
	int ret = t[v].Max;
	root = merge(merge(u,v),w);
	return ret;
}

signed main(){
	srand(time(0));
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> n;
	for(int i = 1;i <= n;i++)
		cin >> a[i];
	root = merge(root,build(1,n));
	cin >> m;
	while(m--){
		string op;
		int pos,l,r;
		cin >> op;
		if(op == "I"){
			cin >> pos;
			Insert(pos,1);
		}
		else if(op == "D"){
			cin >> pos;
			Delete(pos,pos);
		}
		else if(op == "R"){
			int v;
			cin >> pos >> v;
			Modify(pos,pos,v);
		}
		else if(op == "Q"){
			cin >> l >> r;
			cout << query_Max(l,r) << '\n';
		}
	}
	return 0;
}
2024/10/4 17:28
加载中...