【BZOJ3631】[JLOI2014]松鼠的新家
来源:互联网 发布:广州淘宝村在哪里 编辑:程序博客网 时间:2024/04/26 06:08
题目大意:从编号1到n遍历图(中间经过点不算遍历过),求每个点经过了几次
树剖,每次i到i+1都相当于一次链上修改,最后单点查询就行。
#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#define N 300009#define inf 0x7fffff#define ll long longusing namespace std;int n,number=0,cnt=0,first[N],father[N],top[N],dfn[N],size[N],Mson[N],now[N*4],deep[N],a[N];struct edge{int to,next;void add(int x,int y){to=y,next=first[x],first[x]=number;}}e[2*N];void dfs1(int x){size[x]=1;deep[x]=deep[father[x]]+1;for (int i=first[x];i;i=e[i].next)if (father[x]!=e[i].to){father[e[i].to]=x;dfs1(e[i].to);size[x]+=size[e[i].to];if (size[e[i].to]>size[Mson[x]])Mson[x]=e[i].to;}}void dfs2(int x,int y){top[x]=y;dfn[x]=++cnt;if (Mson[x]) dfs2(Mson[x],y);for (int i=first[x];i;i=e[i].next)if (father[x]!=e[i].to&&Mson[x]!=e[i].to)dfs2(e[i].to,e[i].to);}void ins(int l,int r,int L,int R,int k){if (L<=l&&R>=r){now[k]++;return;}int mid=l+r>>1;if (L<=mid) ins(l,mid,L,R,k<<1);if (R>mid) ins(mid+1,r,L,R,k<<1|1);}int qry(int l,int r,int x,int k){if (l==r) return now[k];int mid=l+r>>1;int ans=now[k];if (x<=mid) ans+=qry(l,mid,x,k<<1);else ans+=qry(mid+1,r,x,k<<1|1);return ans;}void add(int x,int y){for (;top[x]!=top[y];x=father[top[x]]){if (deep[top[x]]<deep[top[y]]) swap(x,y);ins(1,n,dfn[top[x]],dfn[x],1);}if (dfn[x]>dfn[y]) swap(x,y);ins(1,n,dfn[x],dfn[y],1);}int main(){scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%d",&a[i]);for (int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);e[++number].add(x,y);e[++number].add(y,x);}father[1]=0;deep[0]=0;dfs1(1);dfs2(1,1);for (int i=1;i<n;i++){int x=a[i];int y=a[i+1];add(x,y);}for (int i=1;i<=n;i++)if (i==a[1]) printf("%d\n",qry(1,n,dfn[i],1));else printf("%d\n",qry(1,n,dfn[i],1)-1);return 0;}
0 0
- 【BZOJ3631】[JLOI2014]松鼠的新家 树链剖分
- [BZOJ3631] [JLOI2014] 松鼠的新家
- Bzoj3631【JLOI2014】松鼠的新家
- 【BZOJ3631】[JLOI2014]松鼠的新家
- bzoj3631: [JLOI2014]松鼠的新家
- BZOJ3631: [JLOI2014]松鼠的新家
- bzoj3631[JLOI2014]松鼠的新家 树链剖分
- BZOJ3631 [JLOI2014]松鼠的新家
- BZOJ3631: [JLOI2014]松鼠的新家
- [BZOJ3631]JLOI2014松鼠的新家|树上差分
- BZOJ3631 [JLOI2014]松鼠的新家(树链剖分)
- [BZOJ3631][JLOI2014]松鼠的新家(链剖)
- [BZOJ3631][洛谷P3258][JLOI2014]松鼠的新家
- 链剖——BZOJ3631/Luogu3258 [JLOI2014]松鼠的新家
- bzoj3631[JLOI2014 松鼠的新家 倍增lca+差分
- bzoj3631: [JLOI2014]松鼠的新家 树链剖分||树形dp
- bzoj3631: [JLOI2014]松鼠的新家 (树上差分)
- [bzoj3631][JLOI2014]松鼠的新家 树上差分
- IT项目经理如何学习
- 句子逆序
- ios支付宝流程
- Android AVD 创建设置中参数详解
- 停更
- 【BZOJ3631】[JLOI2014]松鼠的新家
- 数组的遍历方法
- Java初学者项目考核–小说管理系统
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- AFNetworking解析(四)
- Android通用流行框架大全
- 左旋转字符串
- jQuery事件:mouseleave 与 mouseout 的不同
- SQL注入速查表