Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
30502 | LYLAKIOI | 【S】T3 | C++ | 通过 | 100 | 863 MS | 266436 KB | 2113 | 2024-07-19 16:22:51 |
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back typedef long long ll; using namespace std; const int maxn=3e6+10,mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,a[maxn],ss[maxn];bool s[maxn]; int dfn[maxn],low[maxn],bel[maxn],scc,ct,stk[maxn],instk[maxn],tp; vector<int>v[maxn]; int hd[maxn],nxt[maxn],to[maxn],C; int HD[maxn*10],NXT[maxn*10],TO[maxn*10],CC; void lk(int x,int y){ ++C;nxt[C]=hd[x],hd[x]=C,to[C]=y; } void l_k(int x,int y){ ++CC;NXT[CC]=HD[x],HD[x]=CC,TO[CC]=y; } int nbel[maxn]; int res[maxn]; int T[maxn]; int g(int x){ return ((1<<20)-1)^x; } void dfs(int u){ dfn[u]=low[u]=++ct,instk[u]=1,stk[++tp]=u; for(int w=HD[u];w;w=NXT[w]){ int x=TO[w]; if(!dfn[x])dfs(x),low[u]=min(low[u],low[x]); else if(instk[x])low[u]=min(low[u],dfn[x]); } if(dfn[u]==low[u]){ ++scc; while(tp){ int x=stk[tp--];bel[x]=scc;instk[x]=0; ss[scc]+=s[x]; if(x==u)break; } } } void slv(){ n=read();up(i,1,n)a[i]=read(),s[a[i]]=1; up(i,1,(1<<20)-1)if(s[i])l_k(i,g(i)); up(i,1,(1<<20)-1){ down(j,19,0){ if(!((i>>j)&1))continue; int nxt=i^(1<<j); l_k(i,nxt); } } up(i,1,(1<<20)-1)if(!dfn[i])dfs(i); down(i,n,1)if(ss[bel[a[i]]]==1)res[i]=a[i];else nbel[i]=bel[a[i]],lk(nbel[i],i); up(i,1,scc){ int tp=0,w=hd[i]; for(;w;w=nxt[w])T[tp++]=a[to[w]];w=hd[i]; sort(T,T+tp); for(int j=0;w;w=nxt[w],j++)res[to[w]]=T[j]; } up(i,1,n)printf("%d ",res[i]); }int main(){ // freopen("seq.in","r",stdin),freopen("seq.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }