HeRaNO's NOIP CSP Round Day 2 T3 ginkgo
睡醒后我第一眼:这不主席树裸题吗?
先统计dfs序,把树上问题转化为区间问题
区间大于等于某个数的个数。。。主席树模板?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include<bits/stdc++.h> #define re register #define inc(i,j,k) for(re int i=j;i<=k;++i) #define dec(i,j,k) for(re int i=j;i>=k;--i) #define ra(i,u) for(re int i=head[u];i;i=e[i].nxt) using namespace std; const int maxn=200010; inline int read() { re int x=0,f=1; char ch=getchar(); while (ch< '0' ||ch> '9' ) { if (ch== '-' ) f=-1; ch=getchar();} while (ch>= '0' &&ch<= '9' ) {x=x*10+(ch^48); ch=getchar();} return x*f; } int L[maxn*20],R[maxn*20],sum[maxn*20]; int T[maxn],b[maxn],a[maxn],size[maxn],dfn[maxn<<1],head[maxn]; int n,m,tot,num,tim,cnt; struct node { int to,nxt; }e[maxn<<1]; inline void add( int u, int v) { e[++cnt].to=v; e[cnt].nxt=head[u]; head[u]=cnt; } inline int update( int pre, int l, int r, int v) { re int p=++tot; L[p]=L[pre]; R[p]=R[pre]; sum[p]=sum[pre]+1; if (l==r) return p; re int mid=(l+r)>>1; if (v<=mid) L[p]=update(L[pre],l,mid,v); else R[p]=update(R[pre],mid+1,r,v); return p; } inline int query( int p, int pre, int l, int r, int x, int y) { if (x<=l && r<=y) return sum[p]-sum[pre]; re int mid=(l+r)>>1; re int res=0; if (x<=mid) res+=query(L[p],L[pre],l,mid,x,y); if (y>mid) res+=query(R[p],R[pre],mid+1,r,x,y); return res; } inline void dfs( int u, int fa) { size[u]=1; dfn[u]=++tim; T[tim]=update(T[tim-1],0,num+1,a[u]); ra(i,u) { re int v=e[i].to; if (v==fa) continue ; dfs(v,u); size[u]+=size[v]; } } int main() { // freopen("123.in","r",stdin); re int xx,yy; n=read(); inc(i,2,n) { xx=read(); add(xx,i); } inc(i,1,n) a[i]=read(),b[i]=a[i]; sort(b+1,b+n+1); num=unique(b+1,b+n+1)-b-1; inc(i,1,n) { a[i]=lower_bound(b+1,b+num+1,a[i])-b; } dfs(1,0); inc(i,1,n) { xx=T[dfn[i]]; yy=T[dfn[i]+size[i]-1]; // cout<<xx<<" "<<yy<<endl; printf( "%d %d %d\n" ,query(yy,xx,0,num+1,0,a[i]-1),query(yy,xx,0,num+1,a[i],a[i]),query(yy,xx,0,num+1,a[i]+1,num+1)); } } |
小(大)插曲
考完试。
老师:诶要不hxx你来讲讲这套题吧,你为啥答得这么快啊
hxx(这是位初四的可爱弟弟):因为这套题太水了,我本来看我迟到了以为答不完了,结果还好在一个多小时写完了。。。
完。
(Orz hxx JULAO
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了