Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
38344 氩_wjy 【S】T2 C++ 通过 100 409 MS 34300 KB 2521 2025-10-03 14:21:46

Tests(88/88):


#include<bits/stdc++.h> #define lc(p) ((p)<<1) #define rc(p) ((p)<<1|1) #define PII pair<int,int> #define fir first #define sec second using namespace std; const int N=3e5+7; int n,a[N],tk[N]; vector<int> Ps[N]; int Ban; int Ans[N],cnt; inline int g(int c,int k){return k>=Ps[c].size()?1e9:Ps[c][k];} inline PII Cmp(PII x,PII y){ return x.fir<=y.fir?x:y; } struct SGT{ struct Node{ int Maxc,Xc; int Minp,Np; }d[N<<2]; inline void pu(int p){ d[p].Maxc=max(d[lc(p)].Maxc,d[rc(p)].Maxc); d[p].Xc=(d[p].Maxc==d[lc(p)].Maxc?d[lc(p)].Xc:d[rc(p)].Xc); d[p].Minp=min(d[lc(p)].Minp,d[rc(p)].Minp); d[p].Np=(d[p].Minp==d[lc(p)].Minp?d[lc(p)].Np:d[rc(p)].Np); }inline void Build(int p,int l,int r){ if(l==r)return void(d[p]=(Node){(int)Ps[l].size(),l,g(l,tk[l]),l}); int mid=l+r>>1; Build(lc(p),l,mid);Build(rc(p),mid+1,r); pu(p); }inline void Take(int p,int l,int r,int x){ if(l==r){ ++cnt; Ans[cnt]=Ps[l][tk[l]];tk[l]++; d[p].Maxc--;d[p].Minp=g(l,tk[l]); Ban=l; return; }int mid=l+r>>1; (x<=mid?Take(lc(p),l,mid,x):Take(rc(p),mid+1,r,x)); pu(p); }inline PII FindMin(int p,int l,int r,int L,int R){ if(L<=l&&r<=R)return PII(d[p].Minp,d[p].Np); int mid=l+r>>1;PII ret=PII(1e9,0); if(L<=mid)ret=Cmp(ret,FindMin(lc(p),l,mid,L,R)); if(R>mid)ret=Cmp(ret,FindMin(rc(p),mid+1,r,L,R)); return ret; } }T; signed main(){ // freopen("food.in","r",stdin); // freopen("food.out","w",stdout); cin>>n; for(int i=1;i<=n;i++)cin>>a[i],Ps[a[i]].push_back(i); T.Build(1,1,n); for(int i=1;i<=n;i++){ // cout<<i<<endl; int Maxc=T.d[1].Maxc,Xc=T.d[1].Xc; if(Maxc>((n-i+2)>>1)){ cout<<-1<<endl; return 0; }else if(((n-i+1)&1)&&(Maxc==((n-i+2)>>1))){ // cout<<"CH3"<<endl; T.Take(1,1,n,Xc); }else{ // cout<<"CH4"<<endl; PII pr=(Ban>1?T.FindMin(1,1,n,1,Ban-1):PII(1e9,0)); PII su=(Ban<n?T.FindMin(1,1,n,Ban+1,n):PII(1e9,0)); // cout<<pr.fir<<" "<<pr.sec<<endl; // cout<<su.fir<<" "<<su.sec<<endl; PII F=Cmp(pr,su); // cout<<F.sec<<endl; T.Take(1,1,n,F.sec); } }for(int i=1;i<=n;i++)cout<<Ans[i]<<" "; cout<<endl; }


测评信息: