提交时间:2024-07-19 16:34:52

运行 ID: 30513

#include<bits/stdc++.h> using namespace std; #define pb push_back #define inx int I=h[u],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v inline int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int M=20,MN=1<<M,MAXN=1000010+(1<<M),Mod=1000000007; int n,a[MAXN],p[MAXN]; struct Edge{int v,nx;}edge[MAXN*M+10];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;} priority_queue<int>q[MAXN]; int low[MAXN],bel[MAXN],k,stk[MAXN],dfn[MAXN],cnt; int st[MAXN],C; void tg(int u){ stk[u]=1;dfn[u]=++cnt; low[u]=dfn[u];st[++C]=u; for(inx){ if(stk[v]){ low[u]=min(low[u],dfn[v]); continue; } if(!dfn[v]){ tg(v); low[u]=min(low[u],low[v]); } } if(low[u]==dfn[u]){ k++; while(st[C]!=u){ bel[st[C]]=k; stk[st[C]]=0; C--; } bel[st[C]]=k; stk[u]=0; st[C]; } } void slv(){ n=read(); for(int i=1;i<=n;i++)a[i]=read(),add_side(MN+i,(1<<M)-1-a[i]),add_side(a[i],MN+i); for(int i=0;i<1<<M;i++){ for(int j=0;j<M;j++){ if(i&(1<<j))add_side(i,i^(1<<j)); } } for(int i=0;i<=MN+n;i++){ if(!dfn[i])tg(i); } for(int i=1;i<=n;i++)p[i]=bel[i+MN],q[p[i]].push(-a[i]); for(int i=1;i<=n;i++){ printf("%d ",-q[p[i]].top()); q[p[i]].pop(); } } signed main(){ // freopen("seq.in","r",stdin);freopen("seq.out","w",stdout); slv(); return 0; }