社区讨论
我疯了,悬赏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 条回复,欢迎继续交流。
正在加载回复...