Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
1840 16级钟煜奇 【S】T1最大后缀值个数 C++ 运行超时 50 1000 MS 23712 KB 2039 2020-11-16 11:45:14

Tests(5/10):


#include <iostream> #include <cstdio> #include <algorithm> #define int long long using namespace std; const int MAX=1e6+5; int bin[MAX],a[MAX]; int fa[MAX]; /*int nxt[MAX<<1],to[MAX<<2],head[MAX],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<<2],tag[MAX<<2]; inline void clear(int rt){ sum[rt<<1]=sum[rt<<1|1]=0; tag[rt<<1]=tag[rt<<1|1]=1; } inline void pushdown(int rt){ if(tag[rt])clear(rt),tag[rt]=0; } inline void pushup(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void modify(int rt,int l,int r,int aim){ if(l==r){sum[rt]++;return ;} int mid=(l+r)>>1; pushdown(rt); if(aim<=mid)modify(rt<<1,l,mid,aim); else modify(rt<<1|1,mid+1,r,aim); pushup(rt); } 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)clear(rt<<1,l,mid,ql,qr); if(mid<qr)clear(rt<<1|1,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)ret+=query(rt<<1,l,mid,ql,qr); if(mid<qr)ret+=query(rt<<1|1,mid+1,r,ql,qr); return ret; } signed main(){ scanf("%lld",&n); for(int i=2;i<=n;i++){ scanf("%lld",&fa[i]); if(fa[i]!=i-1)subtask=false; //add(i,fa[i]); } for(int i=1;i<=n;i++)scanf("%lld",&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("%lld ",query(1,1,n,a[i],n)); if(a[i]>1)clear(1,1,n,1,a[i]-1); } return 0; } for(int ans,i=1;i<=n;i++){ ans=0; for(int amax=a[i],j=i;j;j=fa[j]){ amax=max(amax,a[j]); if(amax==a[j])ans++; } printf("%lld ",ans); } //cout<<unique(bin+1,bin+4+1)-bin-1; //cout<<lower_bound(bin+1,bin+3+1,5)-bin; return 0; }


测评信息: