其实这道题其实可以转化为这样一个问题

给定n-1对点,将这两点x,y间简单路径上的点(包括起点终点)权值+1

(最后再把除了起点外的点的权值-1,注意终点没糖吃)

求每个点的权值

首先想到的是先找LCA然后暴力的对权值加,显然这样效率不够好

想到了树状数组完成区间修改和单点求值,是先将[l,r]中a[l]++,然后a[r+1]--;

这样就避免了对每个数都修改;

以此类推,我们可以假定路径使x-->root-->y上的点+1,

这样每个点的权值即为其所在子树和

设lca(x,y)=z 同样的道理,我们只要对a[x]++,a[y]++,然后对a[z]--,a[fa[z]]--

因为每个点的权值即为其所在子树和,所以只有x-->y的简单路径上的点权值+1了

这样的话我们可以做一遍LCA-tarjan就可以搞出来了(当然也可以再单独扫一遍)

 type node=record
po,next:longint;
can:boolean;
end; var a,q:array[..] of node;
fa,f,p,w,ans,g:array[..] of longint;
v:array[..] of boolean;
st,i,j,n,m,x,y,t:longint; function getf(x:longint):longint;
begin
if fa[x]<>x then fa[x]:=getf(fa[x]);
exit(fa[x]);
end; procedure addq(x,y:longint);
begin
inc(m);
q[m].po:=y;
q[m].next:=w[x];
w[x]:=m;
end; procedure add(x,y:longint);
begin
inc(t);
a[t].po:=y;
a[t].next:=p[x];
p[x]:=t;
end; procedure tarjan(x:longint);
var i,y,z:longint;
begin
i:=p[x];
v[x]:=true;
while i<> do
begin
y:=a[i].po;
if not v[y] then
begin
f[y]:=x;
tarjan(y);
fa[y]:=x;
end;
i:=a[i].next;
end;
i:=w[x];
while i<>- do
begin
y:=q[i].po;
if v[y] and not q[i].can then
begin
z:=getf(y);
q[i].can:=true;
q[i xor ].can:=true;
inc(g[z]);
inc(g[f[z]]);
end;
i:=q[i].next;
end;
ans[x]:=ans[x]-g[x];
ans[f[x]]:=ans[f[x]]+ans[x];//做到这已经说明x的子树已经被访问完了,x的权值已经确定,直接加即可,不需要再dfs一遍
end; begin
m:=-;
fillchar(w,sizeof(w),);
readln(n);
read(x);
st:=x;
ans[x]:=;
for i:= to n- do
begin
read(y);
addq(x,y);
addq(y,x);
inc(ans[y]);
if i<>n- then inc(ans[y]);
x:=y;
end;
for i:= to n- do
begin
readln(x,y);
add(x,y);
add(y,x);
end;
for i:= to n do
fa[i]:=i; tarjan();
for i:= to n do
begin
if i<>st then dec(ans[i]);
writeln(ans[i]);
end;
end.

bzoj3631的更多相关文章

  1. 【BZOJ3631】松树的新家 树链剖分

    BZOJ3631 松树的新家 Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  2. 【BZOJ3631】松鼠的新家 树链剖分

    BZOJ3631 松鼠的新家 Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  3. [BZOJ3631][JLOI2014]松鼠的新家(树链剖分)

    [BZOJ3631] 树剖模板题了, Code #include <cstdio> #include <algorithm> #define MID int mid=(l+r) ...

  4. bzoj3631树链剖分

    虽然是水题1A的感觉太爽了O(∩_∩)O~ 题意相当于n-1次树上路径上每个点权值+1,最后问每个点的权值 本来想写线段树,写好了change打算框架打完了再来补,结果打完发现只是区间加和单点查 前缀 ...

  5. bzoj3631: [JLOI2014]松鼠的新家(LCA+差分)

    题目大意:一棵树,以一定顺序走完n个点,求每个点经过多少遍 可以树链剖分,也可以直接在树上做差分序列的标记 后者打起来更舒适一点.. 具体实现: 先求x,y的lca,且dep[x]<dep[y] ...

  6. BZOJ3631: [JLOI2014]松鼠的新家

    传送门 树上的差分优化,很简单的一道题,应该属于NOIP2015TGD2T3的子问题. //BZOJ 3631 //by Cydiater //2016.10.25 #include <iost ...

  7. 【BZOJ-3631】松鼠的新家 树形DP?+ 倍增LCA + 打标记

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1231  Solved: 620[Submit][Stat ...

  8. 【bzoj3631】[JLOI2014]松鼠的新家

    题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树"上.松 ...

  9. BZOJ3631[JLOI2014]松鼠的新家 题解

    题目大意: 给你一棵树,要从编号为a[1]的节点走到编号为a[2]的节点再走到编号为a[3]的节点……一直走到编号为a[n]的节点.问每个节点最少访问多少次. 思路: 将其进行轻重链剖分,则从a[i] ...

随机推荐

  1. nginx同时监听本机ipv4/ipv6端口

    修改nginx.conf配置文件 server { listen ; listen [::]:; } 0.0.0.0  表示本机所有ipv4地址,需要监听特定地址替换即可 [::]  表示本机所有ip ...

  2. python np.linspace

    该函数的形式为: linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 作用为:在规定的时间内,返回固定间隔的 ...

  3. UESTCOJ-BiliBili, ACFun… And More!(水题)

    BiliBili, ACFun… And More! Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Ja ...

  4. DOM 之 document 查找元素方法

    DOM 之 document 查找元素方法 getElementById("idName"); // 始终取得第一个 idName 的元素 getElementsByTagName ...

  5. oracle新建表空间及用户

    本文介绍命令模式(管理员权限): 1.以管理员权限打开命令控制台,输入下面命令: Sqlplus sys/管理员账户名称(就是DBA账户) as sysdba;(记得分号哦,有时没有的话会报错) 2. ...

  6. java 使用substring 截取特殊字符串的后一位或者数字

    关于截取特殊的字符串的后一位或者数字 需求:截取特殊字符为  .   后一位 String[] str = uri.split("/"); String str1 = str[st ...

  7. jQuery提供的小方法

    jQuery提供的小方法: 1.选择器 + 事件 + 函数 = 复杂的交互 2.循环处理与选择器匹配的各个元素:each() $("#").each(function(){     ...

  8. frameset标签代码实现网站跳转

    js代码1: document.writeln("<frameset rows=\"0, *\">"); document.writeln(&quo ...

  9. InstallShield 创建自己的Dialog

    1.在"User Interface"-"Dialogs"下,在All Dialogs右击"New Dialogs-"创建自己的Dialog ...

  10. Mysql主从复制,读写分离

    一个简单完整的 Mysql 主从复制,读写分离的示意图. 1. 首先搭建 Mysql 主从架构,实现 将 mater 数据自动复制到 slave MySQL 复制的工作方式很简单,一台服务器作为主机, ...