社区讨论

求助

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m3nu7b80
此快照首次捕获于
2024/11/19 10:30
去年
此快照最后确认于
2025/11/04 14:26
4 个月前
查看原帖
像这组阳历
CPP
1
15
5 3 7 2 4 13 11 6 5 5 3 5 12 8 13
里面的7改成 x(不于其它的相同),x<3 可对 ,x>3 对不了
CPP
#include <bits/stdc++.h>
#define ll long long 
using namespace std;
const int N=2e5+5;
int dp[N],n,a[N],t,ans,op,u,len=0,b[N];

namespace WeightLineTree{
	#define lt (cur<<1)
	#define rt ((cur<<1)|1)
	#define mid ((R+L)>>1)
	const int M=N<<2;
	int maxn[M],lz[M],Pos[M];
	void sq(int cur,int w){
		maxn[cur]+=w;
		lz[cur]+=w;
	}
	void down(int cur){
		sq(lt,lz[cur]);
		sq(rt,lz[cur]);
		lz[cur]=0;
	}
	void up(int cur){
		if(maxn[lt]>=maxn[rt])
			Pos[cur]=Pos[lt];
		else 	
			Pos[cur]=Pos[rt];
		maxn[cur]=max(maxn[lt],maxn[rt]);
	}
	void add(int cur,int l,int r,int L,int R,int w){
		if(l<=L&&R<=r){
			sq(cur,w);
		}else if(!(l>R||L>r)){
			down(cur);
			add(lt,l,r,L,mid,w);
			add(rt,l,r,mid+1,R,w);
			up(cur);
		}
	}
	void gai_max(int cur,int L,int R,int x,int w){
		if(L==R){
			maxn[cur]=max(maxn[cur],w);
			return ;
		}
		if(x<=mid)
			gai_max(lt,L,mid,x,w);
		else 
			gai_max(rt,mid+1,R,x,w);
		up(cur);
	}
	void build(int cur,int L,int R){
		lz[cur]=0;
		if(L==R){
			Pos[cur]=L;
			maxn[cur]=(b[L]!=0)*-1e9;
			return ;
		}
		build(lt,L,mid);
		build(rt,mid+1,R);
		up(cur);
	}
	int Q(int x){
		int L=0,R=len+1;
		while(L+1<R){
			if(b[mid]<=x)
				L=mid;
			else
				R=mid;
		}
		return L;
	}
}
using namespace WeightLineTree;
/*
dp[j]定义为与i最近j不同
*/
void work(){
	len=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	b[n+1]=0;
	sort(b+1,b+2+n);
	for(int i=1;i<=n+1;i++){
		if(b[i]!=b[i+1])
			b[++len]=b[i];
	}
	build(1,1,len);
	for(int i=2;i<=n;i++){
		u=Q(a[i]);
		add(1,u,u,1,len,a[i]);
		dp[i-1]=maxn[1];
		cout<<b[Pos[1]]<<' '<<a[i]<<' '<<dp[i-1]<<'\n';
		add(1,u,u,1,len,-a[i]);			
		add(1,1,len,1,len,(a[i]==a[i-1])*a[i]);
		gai_max(1,1,len,Q(a[i-1]),dp[i-1]);
	}		
	cout<<maxn[1]<<'\n';
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>t;
	while(t--){
		work();
	}
	return 0;
}


回复

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

正在加载回复...