bzoj 1782: [Usaco2010 Feb]slowdown 慢慢游 (线段树+DFS序)
来源:互联网 发布:movist for mac 编辑:程序博客网 时间:2024/05/17 17:41
题目描述
传送门
题目大意:给出一颗n个节点的树,按照一定的顺序激活每个点,并询问每个点到根的路径上经过了多少个已经激活的点。
题解
这题应该是一眼树链剖分吧。不过拿树链剖分来做其实有点大材小用了。直接线段树+DFS就可以。
每次单点查询,将子树对应的dfs序中的区间+1.
代码
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define N 200003using namespace std;int n,point[N],nxt[N],v[N],l[N],pos[N],r[N];int tr[N*4],delta[N*4],tot,sz;void add(int x,int y){ tot++; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; tot++; nxt[tot]=point[y]; point[y]=tot; v[tot]=x; }void dfs(int x,int fa){ l[x]=++sz; pos[sz]=x; for (int i=point[x];i;i=nxt[i]) { if (v[i]==fa) continue; dfs(v[i],x); } r[x]=sz;}void pushdown(int now){ if (delta[now]) { tr[now<<1]+=delta[now]; tr[now<<1|1]+=delta[now]; delta[now<<1]+=delta[now]; delta[now<<1|1]+=delta[now]; delta[now]=0; }}int find(int now,int l,int r,int x){ if (l==r) return tr[now]; int mid=(l+r)/2; pushdown(now); if (x<=mid) return find(now<<1,l,mid,x); else return find(now<<1|1,mid+1,r,x);}void qjchange(int now,int l,int r,int ll,int rr){ if (ll<=l&&r<=rr) { tr[now]++; delta[now]++; return; } int mid=(l+r)/2; pushdown(now); if (ll<=mid) qjchange(now<<1,l,mid,ll,rr); if (rr>mid) qjchange(now<<1|1,mid+1,r,ll,rr);}int main(){ freopen("a.in","r",stdin); scanf("%d",&n); for (int i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); add(x,y); } dfs(1,0); for (int i=1;i<=n;i++) { int x; scanf("%d",&x); printf("%d\n",find(1,1,n,l[x])); qjchange(1,1,n,l[x],r[x]); }}
0 0
- bzoj 1782: [Usaco2010 Feb]slowdown 慢慢游 (线段树+DFS序)
- [bzoj1782][Usaco2010 Feb]slowdown 慢慢游 dfs序+线段树
- [BZOJ1782][Usaco2010 Feb]slowdown 慢慢游(dfs序+线段树)
- 【bzoj 1782】: [Usaco2010 Feb]slowdown 慢慢游
- bzoj 1782: [Usaco2010 Feb]slowdown 慢慢游
- BZOJ 1782 [Usaco2010 Feb]slowdown 慢慢游 dfs序,树状数组
- BZOJ 1782 [Usaco2010 Feb]slowdown慢慢游 树状数组
- 1782: [Usaco2010 Feb]slowdown 慢慢游
- 【洛谷2982】[Usaco2010 Feb]慢下来Slowdown(dfs序+线段树)
- bzoj1782: [Usaco2010 Feb]slowdown 慢慢游
- [BZOJ1782] [Usaco2010 Feb]slowdown 慢慢游
- bzoj1782[Usaco2010 Feb]slowdown 慢慢游
- bzoj 4551(DFS序+线段树)
- BZOJ 2015: [Usaco2010 Feb]Chocolate Giving spfa
- bzoj 2015: [Usaco2010 Feb]Chocolate Giving
- bzoj 1593: [Usaco2008 Feb]Hotel 旅馆 (线段树)
- bzoj 1828: [Usaco2010 Mar]balloc 农场分配 (贪心+线段树)
- BZOJ 1828: [Usaco2010 Mar]balloc 农场分配 线段树 贪心
- angular1与jquery结合使用注意项
- Linux 进程通信之 命名管道
- 交换瓶子 蓝桥杯
- Centos7 安装Mysql5.7
- SDN控制器-POX学习(一)
- bzoj 1782: [Usaco2010 Feb]slowdown 慢慢游 (线段树+DFS序)
- OC中char/short/int/float/double在64位系统中所占字节数
- pat乙级1024
- 版本管理-SVN冲突爆红后如何通过颜色和快捷键准确无误地合并代码(一)
- Gym
- 学习随笔——Java制作简单截图工具
- 【机房重构】——数据库设计
- c++primer第十四章c++代码重用(二)
- hql增删改查