社区讨论

我疯了,悬赏10rmb

P8330[ZJOI2022] 众数参与者 5已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@lugywdll
此快照首次捕获于
2024/04/01 21:09
2 年前
此快照最后确认于
2024/04/02 06:28
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
inline void out(int x){
    if(x==0){putchar('0');return;}
	int len=0,k1=x,c[1000005];
	if(k1<0)k1=-k1,putchar('-');
	while(k1)c[len++]=k1%10+'0',k1/=10;
	while(len--)putchar(c[len]);
	puts("");
}
const int N=2e5+5;
int a[N],b[N],s[N],maj[N],cnt[N],ans;
bool flag[N];
vector<int>v[N],can; 
inline void upd(int v, int c){
	if(ans<v){
		ans=v,can[0]=c;
		can.resize(1); 
	}
	else if(ans==v)can.push_back(c);
}
inline void add(const int &col){
	if(v[col].size()>470)return;
	for(int i=cnt[col]-1,j=1;~i;i--,j++){
		for(int k=v[col][i];k>0&&maj[k]<j;k--){
			maj[k]=j;
		}
	}
}
inline void check(const int &col){
	if(v[col].size()>470)return;
	for(int i=cnt[col]-1,k=0;~i;i--,k++){
		const int vv=maj[v[col][i]+1]-k;
		upd(v[col].size()+vv,col);
	}
}
signed main(){
	int T=read();
	while(T--){
		int n=read();ans=0;
		can.resize(0); 
		for(int i=1;i<=n;i++)a[i]=b[i]=read();
		sort(b+1,b+n+1);
		int num=unique(b+1,b+n+1)-b-1;
		for(int i=1;i<=num;i++)v[i].resize(0);
		for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+num+1,a[i])-b;
		for(int i=1;i<=n;i++)v[a[i]].push_back(i);
		for(int k=1;k<=num;k++){
			if(v[k].size()>470){
				memset(s+1,0,n<<2);
				for(const int &i:v[k])s[i]++;
				for(int i=2;i<=n;i++)s[i]+=s[i-1];
				int now=1;
				for(int i=1;i<=num;i++){
					if(i!=k){
						int len=v[i].size(),m=0,m2=0,t=1;
						for(int j=0;j<len;j++){
							if(m>=j-s[v[i][j]])m=j-s[v[i][j]];
							else now=max(now,j+1-s[v[i][j]]-m);
							if(m2>=s[v[i][j]]-j)m2=s[v[i][j]]-j-1;
							else t=max(t,s[v[i][j]]-j-m2);
						}
						t=max(t,s[n]-len-m2);
						upd(t+len,i);
					}
					upd(now+s[n],k);
				} 
			}
		}
		memset(maj+1,0,n<<2);
		memset(cnt+1,0,n<<2);
		for(int r=1;r<=n;r++){
			cnt[a[r]]++;
			add(a[r]);
			if(a[r]==a[r+1])continue;
			check(a[r+1]);
			upd(maj[1]-cnt[a[r+1]]+v[a[r+1]].size(),a[r+1]);
		}
		for(int i=1;i<=num;i++){
			if(i!=a[n])check(i);
		}
		out(ans);
		memset(flag,0,n<<2);
		for(const int &i:can)flag[i]=1;
		for(int i=1;i<=num;i++){
			if(flag[i])out(b[i]);
		}
	} 
	return 0;
}

回复

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

正在加载回复...