博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P3605 [USACO17JAN]Promotion Counting晋升者计数
阅读量:6067 次
发布时间:2019-06-20

本文共 2084 字,大约阅读时间需要 6 分钟。

思路

线段树合并的板子。。

和子节点合并之后在值域线段树上查询即可

代码

#include 
#include
#include
using namespace std;const int MAXN = 1000100;int n,Nodecnt,root[MAXN],u[MAXN<<1],v[MAXN<<1],cnt,fir[MAXN],nxt[MAXN<<1],ans[MAXN],ax[MAXN],w_p[MAXN],nx;struct Node{ int lson,rson,sz;}Seg[MAXN<<2];int merge(int x,int y,int l,int r){ if(x*y==0) return x+y; if(l==r){ int t=++Nodecnt; Seg[t].sz=Seg[x].sz+Seg[y].sz; return Nodecnt; } int g=++Nodecnt; Seg[g].sz=Seg[x].sz+Seg[y].sz; int mid=(l+r)>>1; Seg[g].lson=merge(Seg[x].lson,Seg[y].lson,l,mid); Seg[g].rson=merge(Seg[x].rson,Seg[y].rson,mid+1,r); return g;}int query(int l,int r,int o,int val){ if(l==r){ return 0; } int mid=(l+r)>>1; if(val<=mid) return query(l,mid,Seg[o].lson,val)+Seg[Seg[o].rson].sz; else return query(mid+1,r,Seg[o].rson,val);}void build(int l,int r,int &o,int val){ if(!o) o=++Nodecnt; Seg[o].sz++; if(l==r) return; int mid=(l+r)>>1; if(val<=mid) build(l,mid,Seg[o].lson,val); else build(mid+1,r,Seg[o].rson,val);}void addedge(int ui,int vi){ ++cnt; u[cnt]=ui; v[cnt]=vi; nxt[cnt]=fir[ui]; fir[ui]=cnt;}void dfs(int u,int fa){ for(int i=fir[u];i;i=nxt[i]){ if(v[i]==fa) continue; dfs(v[i],u); root[u]=merge(root[v[i]],root[u],1,n); } ans[u]=query(1,n,root[u],w_p[u]);}void init(void){ sort(ax+1,ax+n+1); nx=unique(ax+1,ax+n+1)-ax-1;// printf("%d\n",nx); for(int i=1;i<=n;i++){ w_p[i]=lower_bound(ax+1,ax+nx+1,w_p[i])-ax;// printf("%d!\n",w_p[i]); } for(int i=1;i<=n;i++){ build(1,n,root[i],w_p[i]); }} int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&w_p[i]),ax[i]=w_p[i]; } for(int i=2;i<=n;i++){ int x; scanf("%d",&x); addedge(i,x); addedge(x,i); } init(); dfs(1,0); for(int i=1;i<=n;i++) printf("%d\n",ans[i]); return 0;}

转载于:https://www.cnblogs.com/dreagonm/p/10555166.html

你可能感兴趣的文章
SIP入门(二):建立SIPserver
查看>>
Servlet3.0的异步
查看>>
WebService连接postgresql( 失败尝试)
查看>>
从头认识java-13.11 对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?...
查看>>
Python-MacOSX下SIP引起的pip权限问题解决方案(非取消SIP机制)
查看>>
从MFQ方法到需求分析
查看>>
android.view.WindowManager$BadTokenException: Unable to add window
查看>>
HDU5012:Dice(bfs模板)
查看>>
iphone openssh
查看>>
Linux下MEncoder的编译
查看>>
Xamarin使用ListView开启分组视图Cell数据展示bug处理
查看>>
Javascript中闭包(Closure)的探索(一)-基本概念
查看>>
spark高级排序彻底解秘
查看>>
ylbtech-LanguageSamples-PartialTypes(部分类型)
查看>>
福建省促进大数据发展:变分散式管理为统筹集中式管理
查看>>
开发环境、生产环境、测试环境的基本理解和区别
查看>>
tomcat多应用之间如何共享jar
查看>>
Flex前后台交互,service层调用后台服务的简单封装
查看>>
技术汇之物联网设备网关技术架构设计
查看>>
OSX10.11 CocoaPods 升级总结
查看>>