社区讨论

萌新求助

P11233[CSP-S 2024] 染色参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhiylkms
此快照首次捕获于
2025/11/03 17:50
4 个月前
此快照最后确认于
2025/11/03 17:50
4 个月前
查看原帖
猎奇 O(Tnlogn)O(Tn\log n) 做法,求卡常qwq(只有60pts)。
CPP
#include<bits/stdc++.h>
using namespace std;
const int MAXN=200005;
#define int long long
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}

struct Tree{
	int maxn,lazytag;
}tree[MAXN*4];
struct data{
	int num,id;
}a[MAXN];
int dp[MAXN],n;
void build(int id,int l,int r){
	tree[id].lazytag=0;
	if(l==r){
		tree[id].maxn=dp[l];
		return;
	}
	int mid=(l+r)>>1;
	build(id*2,l,mid),build(id*2+1,mid+1,r);
	tree[id].maxn=max(tree[id*2].maxn,tree[id*2+1].maxn);
	return;
}
void pushdown(int id){
	if(tree[id].lazytag==0)return;
	tree[id*2].lazytag+=tree[id].lazytag;
	tree[id*2+1].lazytag+=tree[id].lazytag;
	if(tree[id*2].maxn!=LLONG_MAX)tree[id*2].maxn+=tree[id].lazytag;
	if(tree[id*2+1].maxn!=LLONG_MAX)tree[id*2+1].maxn+=tree[id].lazytag;
	tree[id].lazytag=0; 
}
void add(int ql,int qr,int k,int id,int l,int r){
	if(l>qr||r<ql)return;
	if(l>=ql&&r<=qr){
		if(tree[id].maxn!=LLONG_MAX)tree[id].maxn+=k;
		tree[id].lazytag+=k;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(id);
	add(ql,qr,k,id*2,l,mid),add(ql,qr,k,id*2+1,mid+1,r);
	tree[id].maxn=max(tree[id*2].maxn,tree[id*2+1].maxn);
	return;
}
void update(int qx,int k,int id,int l,int r){
	if(l>qx||r<qx)return;
	if(l==qx&&r==qx){
		tree[id].maxn=k;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(id);
	update(qx,k,id*2,l,mid),update(qx,k,id*2+1,mid+1,r);
	tree[id].maxn=max(tree[id*2].maxn,tree[id*2+1].maxn);
	return;
}
inline bool cmp(data a,data b){
	if(a.num!=b.num)return a.num<b.num;
	return a.id<b.id;
}
inline bool cmp2(data a,data b){
	return a.id<b.id;
}
int T;
int new_id[MAXN],new_c[MAXN],cid[MAXN],sz,l[MAXN],r[MAXN];
signed main(){
	//freopen("color.in","r",stdin);
	//freopen("color.out","w",stdout);
	cin>>T;
	while(T--){
		n=read();
		n++;
		for(int i=2;i<=n;i++){
			a[i].num=read();
			a[i].id=i;
			dp[i]=LLONG_MIN;
		}
		dp[1]=0;	
		sort(a+2,a+n+1,cmp);
		for(int i=1;i<=n;i++){
			if(a[i].id==2){
				dp[i]=0;
				break;
			}
		}
		build(1,1,n); 
		sz=1;
		l[1]=r[1]=1;
		new_id[1]=1;
		for(int i=2;i<=n;i++){
			new_id[a[i].id]=i;
			if(a[i].num!=a[i-1].num){
				sz++;
				l[sz]=i;
			}
			if(i==n||a[i].num!=a[i+1].num)r[sz]=i;
			new_c[a[i].id]=sz;
		}
		sort(a+2,a+n+1,cmp2); 
	//	for(int i=2;i<=n;i++)cout<<new_id[i]<<" ";
	//	cout<<endl;
		for(int i=3;i<=n;i++){
		//	print_tree();
		//	cout<<new_c[a[i].id]<<" "<<l[new_c[a[i].id]]<<" "<<r[new_c[a[i].id]]<<endl;
			add(l[new_c[a[i].id]],r[new_c[a[i].id]],a[i].num,1,1,n);
			int tmp=tree[1].maxn;
			add(l[new_c[a[i].id]],r[new_c[a[i].id]],-a[i].num,1,1,n);
			if(a[i].num==a[i-1].num)add(1,n,a[i].num,1,1,n); 
			update(new_id[a[i-1].id],tmp,1,1,n);
		//	cout<<tmp<<endl;
		}
		//print_tree();
		int ans=0;
		printf("%lld\n",tree[1].maxn);
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...