Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
1834 | 16级钟煜奇 | 【S】T1最大后缀值个数 | C++ | 内存超限 | 10 | 538 MS | 192388 KB | 2754 | 2020-11-16 11:38:51 |
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int mmax=1e6+5; const int MAX=1e7+5; int bin[mmax],a[mmax],rt[mmax],ans[mmax]; int fa[mmax]; int nxt[mmax<<1],to[mmax<<1],head[mmax],cnt; inline void add(int x,int y){ ++cnt; nxt[cnt]=head[x],to[cnt]=y,head[x]=cnt; ++cnt; nxt[cnt]=head[y],to[cnt]=x,head[y]=cnt; } bool subtask=1; int n; int sum[MAX],ls[MAX],rs[MAX],cc; bool tag[MAX]; inline void pushdown(int rt){ if(tag[rt]){ tag[ls[rt]]=tag[rs[rt]]=1; sum[ls[rt]]=sum[rs[rt]]=0; tag[rt]=0; } } inline void pushup(int rt){ sum[rt]=sum[ls[rt]]+sum[rs[rt]]; } int flag; void modify(int rt1,int rt2,int l,int r,int aim){ if(flag)cout<<l<<" "<<r<<" "<<rt2<<endl; ls[rt2]=ls[rt1],rs[rt2]=rs[rt1]; if(l==r){sum[rt2]=sum[rt1]+1;return ;} int mid=(l+r)>>1; pushdown(rt2); if(aim<=mid){ ls[rt2]=++cc,modify(ls[rt1],ls[rt2],l,mid,aim); }else { rs[rt2]=++cc,modify(rs[rt1],rs[rt2],mid+1,r,aim); } pushup(rt2),pushup(rt1); } void clear(int rt,int l,int r,int ql,int qr){ if(ql<=l && r<=qr){tag[rt]=1,sum[rt]=0;return ;} int mid=(l+r)>>1; pushdown(rt); if(ql<=mid && ls[rt]){ ls[cc+1]=ls[ls[rt]]; rs[cc+1]=rs[ls[rt]]; tag[cc+1]=tag[ls[rt]]; sum[cc+1]=sum[ls[rt]]; ls[rt]=++cc; clear(ls[rt],l,mid,ql,qr); } if(mid<qr && rs[rt]){ ls[cc+1]=ls[rs[rt]]; rs[cc+1]=rs[rs[rt]]; tag[cc+1]=tag[rs[rt]]; sum[cc+1]=sum[rs[rt]]; rs[rt]=++cc; clear(rs[rt],mid+1,r,ql,qr); } pushup(rt); } int query(int rt,int l,int r,int ql,int qr){ if(ql<=l && r<=qr)return sum[rt]; int mid=(l+r)>>1,ret=0; pushdown(rt); if(ql<=mid && ls[rt])ret+=query(ls[rt],l,mid,ql,qr); if(mid<qr && rs[rt])ret+=query(rs[rt],mid+1,r,ql,qr); return ret; } void dfs(int now,int father){ modify(rt[father],rt[now],1,n,a[now]); flag=false; ans[now]=query(rt[now],1,n,a[now],n); if(a[now]>1)clear(rt[now],1,n,1,a[now]-1); for(int aim,i=head[now];i;i=nxt[i]){ aim=to[i]; if(aim!=father)dfs(aim,now); } } int main(){ scanf("%d",&n); for(int i=2;i<=n;i++){ scanf("%d",&fa[i]); if(fa[i]!=i-1)subtask=false; add(i,fa[i]); } for(int i=1;i<=n;i++)scanf("%d",&a[i]),bin[++bin[0]]=a[i]; sort(bin+1,bin+bin[0]+1); bin[0]=unique(bin+1,bin+bin[0]+1)-bin-1; /*if(subtask){ for(int i=1;i<=n;i++){ a[i]=lower_bound(bin+1,bin+bin[0]+1,a[i])-bin; modify(1,1,n,a[i]); printf("%d ",query(1,1,n,a[i],n)); if(a[i]>1)clear(1,1,n,1,a[i]-1); } return 0; }*/ for(int i=1;i<=n;i++)a[i]=lower_bound(bin+1,bin+bin[0]+1,a[i])-bin,rt[i]=++cc; dfs(1,0); for(int i=1;i<=n;i++)printf("%d ",ans[i]); //cout<<unique(bin+1,bin+4+1)-bin-1; //cout<<lower_bound(bin+1,bin+3+1,5)-bin; return 0; }