求调,悬赏一个关注
查看原帖
求调,悬赏一个关注
727076
hexz01楼主2023/12/14 20:28
#include <iostream>
using namespace std;
const int N=1e5+7, K=27;
const int oo=1e9;
int n, m;
int a[N];
struct node{
	int dp[4][K];
}tree[N];
node pushup(node x, node y){
	node ans;
	for(int i=0;i<=3;i++)
		for(int j=0;j<=20;j++)
			ans.dp[i][j]=-oo;
	for(int i=0;i<=20;i++)
		for(int j=0;j<=20;j++){
			if(i+j<=20){
				ans.dp[0][i+j]=max(max(max(ans.dp[0][i+j], x.dp[0][i]+y.dp[0][j]), x.dp[2][i]+y.dp[0][j]), x.dp[0][i]+y.dp[1][j]);
				ans.dp[1][i+j]=max(max(max(ans.dp[1][i+j], x.dp[1][i]+y.dp[0][j]), x.dp[3][i]+y.dp[0][j]), x.dp[3][i]+y.dp[1][j]);
				ans.dp[2][i+j]=max(max(max(ans.dp[2][i+j], x.dp[0][i]+y.dp[2][j]), x.dp[2][i]+y.dp[2][j]), x.dp[0][i]+y.dp[3][j]);
				ans.dp[3][i+j]=max(max(max(ans.dp[3][i+j], x.dp[1][i]+y.dp[2][j]), x.dp[3][i]+y.dp[2][j]), x.dp[1][i]+y.dp[3][j]);
			}
			if(i+j<=21){
				ans.dp[0][i+j-1]=max(x.dp[2][i]+y.dp[1][j], ans.dp[0][i+j-1]);
				ans.dp[1][i+j-1]=max(ans.dp[1][i+j-1], x.dp[3][i]+y.dp[1][j]);
				ans.dp[2][i+j-1]=max(ans.dp[2][i+j-1], x.dp[2][i]+y.dp[3][j]);
				ans.dp[3][i+j-1]=max(ans.dp[3][i+j-1], x.dp[3][i]+y.dp[3][j]);
			}
		}
	return ans;
}
void init(int x, int val){
	tree[x].dp[0][0]=0;
	tree[x].dp[3][1]=val;
	for(int i=0;i<=3;i++)
		for(int j=0;j<=n;j++)
			if(!(i==0 && j==0) && !(i==3 && j==1))
				tree[x].dp[i][j]=-oo;
}
void build(int x, int l, int r){
	if(l==r){
		init(x, a[l]);
	}else{
		int mid=(l+r)>>1;
		build(x<<1, l, mid);
		build(x<<1|1, mid+1, r);
		tree[x]=pushup(tree[x<<1], tree[x<<1|1]);
	}
}
void update(int x, int l, int r, int were, int val){
	if(l==r){
		init(x, val);
	}else{
		int mid=(l+r)>>1;
		if(were<=mid)
			update(x<<1, l, mid, were, val);
		else
			update(x<<1|1, mid+1, r, were, val);
		tree[x]=pushup(tree[x<<1], tree[x<<1|1]);
	}
}
node query(int x, int l, int r, int L, int R){
	if(L<=l && r<=R){
		return tree[x];
	}else{
		int mid=(l+r)>>1;
		if(R<=mid)
			return query(x<<1, l, mid, L, R);
		else if(L>mid)
			return query(x<<1|1, mid+1, r, L, R);
		else{
			node s1=query(x<<1, l, mid, L, R);
			node s2=query(x<<1|1, mid+1, r, L, R);
			return pushup(s1, s2);
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1, 1, n);
	cin>>m;
	while(m--){
		int c;
		cin>>c;
		if(c==0){
			int were, val;
			cin>>were>>val;
			update(1, 1, n, were, val);
		}else{
			int l, r, k;
			cin>>l>>r>>k;
			node tmp=query(1, 1, n, l, r);
			int ans=0;
			for(int i=0;i<=k;i++)
				for(int j=0;j<=3;j++)
					ans=max(ans, tmp.dp[j][i]);
			cout<<ans<<endl;
		}
	}
	return 0;
}

WA

2023/12/14 20:28
加载中...