题目来源:http://www.lydsy.com/JudgeOnline/problem.php?id=4719

镇楼图:

noip滚粗后、、订正的第一题。

题目大意:

有若干条路径在一棵树上,问每个点恰为多少条路径起点出发Ti长度处。

解题方略:

这题可以O(n)。。结果shy非常有趣地在考场上码80分暴力、结果还爆QAQ(这题,80分做法,比100分做法难吧。。)

考虑把询问分成不同的两个链。但是,如果有链的话,就不可避免要树剖。然而其实不必。利用DFS的性质,可以知道,在一个点打标记,可以影响到它的子树(相对地,也可以是所有父亲)。那么,我们考虑暴力,就是询问每个点x,子树里有多少个d[u]=d[x]+t[x]或d[v]-len[u,v]=d[x]-t[x],复杂度O(n*子树大小)。那么,这个只要一个桶就可以记录。求LCA只要tarjan离线就可以O(n+m),这里暂时把并查集的复杂度也看成常数倍。那么,有些人就会卡在子树的合并上。其实并不用合并。因为,一个点退出时,我们即知,其子树的操作都已经实施过(添加/删除),那么,我们只需在进入时算一遍Ans、退出时算一遍Ans,两者的差就是子树的贡献。

AC代码:

这里bzoj之前数据有漏导致WA了,事情咋那么多呢TAT。

 {$M 100000000,0,100000000}
type
Chitose=record
e:longint;
head :array[..]of longint;
next,node:array[..]of longint
end;
Chitoge=array[-..]of longint;
var
n,m,i,u,v:longint;
t,d,z,s,Ans:array[..]of longint;
p,q:Chitoge;
o,a:Chitose;
f,g:array[..]of Chitose; procedure ad(var x:Chitose;u,v:longint);
begin
with x do
begin
inc(e);
next[e]:=head[u];
head[u]:=e;
node[e]:=v
end
end; function fd(x:longint):longint;
begin if x<>z[x] then z[x]:=fd(z[x]); exit(z[x]) end; procedure sk(u:longint);
var i,v,w,x,y,c:longint;
begin
z[u]:=u;
i:=o.head[u];
while i<> do
begin
v:=o.node[i];
if d[v]= then begin d[v]:=d[u]+; sk(v); z[v]:=u end;
i:=o.next[i]
end;
i:=a.head[u];
while i<> do
begin
w:=a.node[i]>>;
if s[w]= then s[w]:=u
else begin v:=s[w];
c:=fd(v);
s[w]:=d[v]+d[u]-*d[c];
if odd(a.node[i]) then begin x:=v; y:=u end
else begin x:=u; y:=v end;
ad(f[],x,d[x]);
ad(f[],c,d[x]);
ad(g[],y,d[y]-s[w]);
ad(g[],c,d[y]-s[w]) end;
i:=a.next[i]
end
end; procedure __Claris(u:longint);
var i,v:longint;
begin
z[u]:=;
Ans[u]:=p[d[u]+t[u]]+q[d[u]-t[u]];
i:=f[].head[u]; while i<> do begin inc(p[f[].node[i]]); i:=f[].next[i] end;
i:=g[].head[u]; while i<> do begin inc(q[g[].node[i]]); i:=g[].next[i] end;
i:=o.head[u];
while i<> do
begin
v:=o.node[i];
if z[v]<> then __Claris(v);
i:=o.next[i]
end;
i:=f[].head[u]; while i<> do begin dec(p[f[].node[i]]); i:=f[].next[i] end; Ans[u]:=p[d[u]+t[u]]+q[d[u]-t[u]]-Ans[u];
i:=g[].head[u]; while i<> do begin dec(q[g[].node[i]]); i:=g[].next[i] end;
end; begin
read(n,m);
for i:= to n do
begin
read(u,v);
ad(o,u,v);
ad(o,v,u)
end;
for i:= to n do read(t[i]);
for i:= to m do
begin
read(u,v);
ad(a,u,i<<);
ad(a,v,i<<+)
end;
d[]:=;
sk();
__Claris();
write(Ans[]); for i:= to n do write(' ',Ans[i])
end.

[NOIP2016-day1-T2]天天爱跑步running_题解的更多相关文章

  1. [NOIP2016 DAY1 T2]天天爱跑步-[差分+线段树合并][解题报告]

    [NOIP2016 DAY1 T2]天天爱跑步 题面: B[NOIP2016 DAY1]天天爱跑步 时间限制 : - MS 空间限制 : 565536 KB 评测说明 : 2s Description ...

  2. Luogu P1600[NOIP2016]day1 T2天天爱跑步

    号称是noip2016最恶心的题 基本上用了一天来搞明白+给sy讲明白(可能还没讲明白 具体思路是真的不想写了(快吐了 如果要看,参见洛谷P1600 天天爱跑步--题解 虽然这样不好但我真的不想写了 ...

  3. NOIP2016 DAY1 T2天天爱跑步

    传送门 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 ...

  4. NOIP2016 Day1 T2 天天爱跑步(树上差分,LCA)

    原文链接 原题链接 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏 ...

  5. 【NOIP2016】DAY1 T2 天天爱跑步

    [NOIP2016]DAY1 T2 天天爱跑步 Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.?天天爱跑步?是一个养成类游戏,需要玩家每天按时 ...

  6. 【NOIP 2016】Day1 T2 天天爱跑步

    Problem Description 小 C 同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任 ...

  7. 【NOIP2016 Day1 T2】天天爱跑步

    题目传送门:https://www.luogu.org/problemnew/show/P1600 感觉这两天在处理边界问题上有点神志不清......为了从80的暴力变成100,花了整整一个下午+一个 ...

  8. [NOIp2016提高组]天天爱跑步

    题目大意: 有一棵n个点的树,每个点上有一个摄像头会在第w[i]秒拍照. 有m个人再树上跑,第i个人沿着s[i]到t[i]的路径跑,每秒钟跑一条边. 跑到t[i]的下一秒,人就会消失. 问每个摄像头会 ...

  9. P1600 [NOIP2016 提高组] 天天爱跑步 (树上差分)

    对于一条路径,s-t,位于该路径上的观察员能观察到运动员当且仅当以下两种情况成立:(d[ ]表示节点深度) 1.观察员x在s-lca(s,t)上时,满足d[s]=d[x]+w[x]就能观察到,所以我们 ...

随机推荐

  1. linux把EDT时间修改为CST格式

    初始时间:2012年 09月 14日 星期五 18:15:33 EDT [root@test ~]# mv /etc/localtime /etc/localtime.bak [root@test ~ ...

  2. Ubuntu 环境 运行Asp.net mvc +EntityFramework+ Mysql

    关键词:ubuntu,mono,.Net framework 4.5,asp.net mvc 4,Entityframework 6,Mysql Mono安装 参考文章: Install Mono o ...

  3. redis的简单安装配置

    一.简介 Redis是一种高级key-value数据库,数据可以持久化,支持的数据类型很丰富,有字符串,哈希,链表,集合和有序集合5种数据类型 Redis支持在服务器端计算集合的并,交和补集(diff ...

  4. 关于php中的spl_autoload_register

    一.自动加载定义 很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本开头写一个长长的包含文件列表(每个类一个文件). 在 PHP 5 中,不再需要 ...

  5. 无法将匿名方法转换为System.Delegate

    在WinForm中,不允许非UI线程访问UI,如果非UI线程需要跨线程调用UI控件,通常的解决办法是使用Control类中的Invoke方法,传递给该方法一个委托和委托调用的参数列表(params [ ...

  6. hdu 3635 Dragon Balls(并查集)

    Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  7. WordCount Analysis

    1.Create a new java project, then copy examples folder from /home/hadoop/hadoop-1.0.4/src; Create a ...

  8. Linux shell basic2 cat find tr

    Cat stands for concatenate. Case 1. When the text files have more blank lines, we want to remove the ...

  9. SSIS with vertica

    使用ODBC进行连接,因为SSIS中没有直接的ODBC connection,所以使用ADO.NET的连接器. 九分钟才跑了四百来条数据. 这个图反应了SSIS的数据流速度还是可以的,但是瓶颈就在OD ...

  10. 2016.6.12 codevs搜索练习

    1.codevs 3143 二叉树的序遍历 /*只要把输出根节点的位置调换一下就可以了*/ #include<iostream> using namespace std; #include ...