| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 41387 | baka24 | 【BJ】T3 | C++ | 通过 | 100 | 935 MS | 149604 KB | 1542 | 2026-04-22 18:16:42 |
#include<bits/stdc++.h> // #include<bits/extc++.h> using namespace std; // using namespace __gnu_pbds; #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back const int MAXN=1000010; 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<<1)+(x<<3)+(c^48),c=getchar();return x*f;} int n,m,ans,a[MAXN],h[MAXN],id[MAXN],rk[MAXN],siz[MAXN]; char c[MAXN]; int fa[MAXN]; int fid(int x){return fa[x]==x?x:fa[x]=fid(fa[x]);} void mrge(int x,int y){ x=fid(x),y=fid(y); if(siz[x]>siz[y])swap(x,y); if(x!=y)fa[x]=y,siz[y]+=siz[x]; } vector<int>G[MAXN]; unordered_set<int>mp[MAXN]; void slv(){ n=read(); if(n==1){puts("a");return;} for(int i=1;i<=n;i++)rk[a[i]=read()]=i,fa[i]=i,siz[i]=1; for(int i=2;i<=n;i++)h[i]=read(); for(int i=1,k=0;i<=n;i++){ if(k)k--; if(h[rk[i]]==-1)continue; while(k<h[rk[i]])mrge(i+k,a[rk[i]-1]+k),k++; if(i+k<=n&&a[rk[i]-1]+k<=n)G[i+k].pb(a[rk[i]-1]+k); } for(int i=1;i<=n;i++)for(auto j:G[i])mp[fid(i)].insert(fid(j)),mp[fid(j)].insert(fid(i)); char x='a'; c[a[1]]='a'; for(int i=2;i<=n;i++){ if(rk[a[i]+1]<rk[a[i-1]+1]||mp[fid(a[i])].count(fid(a[i-1])))x++; c[a[i]]=x; } for(int i=1;i<=n;i++)putchar(c[i]); } signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; }