[NOIP2016-day1-T2]天天爱跑步running_题解
题目来源: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_题解的更多相关文章
- [NOIP2016 DAY1 T2]天天爱跑步-[差分+线段树合并][解题报告]
[NOIP2016 DAY1 T2]天天爱跑步 题面: B[NOIP2016 DAY1]天天爱跑步 时间限制 : - MS 空间限制 : 565536 KB 评测说明 : 2s Description ...
- Luogu P1600[NOIP2016]day1 T2天天爱跑步
号称是noip2016最恶心的题 基本上用了一天来搞明白+给sy讲明白(可能还没讲明白 具体思路是真的不想写了(快吐了 如果要看,参见洛谷P1600 天天爱跑步--题解 虽然这样不好但我真的不想写了 ...
- NOIP2016 DAY1 T2天天爱跑步
传送门 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 ...
- NOIP2016 Day1 T2 天天爱跑步(树上差分,LCA)
原文链接 原题链接 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏 ...
- 【NOIP2016】DAY1 T2 天天爱跑步
[NOIP2016]DAY1 T2 天天爱跑步 Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.?天天爱跑步?是一个养成类游戏,需要玩家每天按时 ...
- 【NOIP 2016】Day1 T2 天天爱跑步
Problem Description 小 C 同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任 ...
- 【NOIP2016 Day1 T2】天天爱跑步
题目传送门:https://www.luogu.org/problemnew/show/P1600 感觉这两天在处理边界问题上有点神志不清......为了从80的暴力变成100,花了整整一个下午+一个 ...
- [NOIp2016提高组]天天爱跑步
题目大意: 有一棵n个点的树,每个点上有一个摄像头会在第w[i]秒拍照. 有m个人再树上跑,第i个人沿着s[i]到t[i]的路径跑,每秒钟跑一条边. 跑到t[i]的下一秒,人就会消失. 问每个摄像头会 ...
- P1600 [NOIP2016 提高组] 天天爱跑步 (树上差分)
对于一条路径,s-t,位于该路径上的观察员能观察到运动员当且仅当以下两种情况成立:(d[ ]表示节点深度) 1.观察员x在s-lca(s,t)上时,满足d[s]=d[x]+w[x]就能观察到,所以我们 ...
随机推荐
- H5文件操作API
引言 在之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很难进行跨平台.或者跨浏览器.跨设备等情况下实现统一的表现,从另外一个 ...
- Hadoop从伪分布式到真正的分布式
对这两天学习hadoop的一个总结,概念就不提了.直接说部署的事,关于如何部署hadoop网上的资料很多, 比较经典的还是Tim在IBM developworks上的系列文章 http://www.i ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...
- javascript特效实现(4)——当前时间和倒计时效果
这个效果的实现关键是对Date对象和setTimeout的使用. 一共有三个例子,HTML结构如下,就不添加CSS样式了. <body> 当前时间:<p id="p1&qu ...
- 续Gulp使用入门三步压缩CSS
gulp 压缩css 一.安装 gulp-minify-css 模块 提示:你需要使用命令行的 cd 切换到对应目录后进行安装操作. 在命令行输入 npm install gulp-minify-cs ...
- 利用Windows自带的Certutil查看文件MD5
当遇到需要对比两个文件是否一致时,可以使用下面的命令来显示文件的MD5, 然后对比两个文件的MD5码. certutil -hashfile <filename> MD5 命令的相关帮助信 ...
- excel if判断时间段早晚班
=IF(OR(HOUR(B3)={9,10,11,12,13,14,15,16,17,18}),"早班","晚班")
- C++STL之迭代器
迭代器 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围.迭代器就如同一个指针.事实上,C++的指针也是一种迭代器.但是,迭代器不仅仅是指针,因此你不能认为他们一定具有地址值.例如, ...
- iTOP-4412开发板低功耗高性能的开源硬件平台——上手评测
iTOP-4412开发板现在比较热门的开发板,笔者近期入了一套.也推荐给初学ARM的朋友学习,4412开发板搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具快速读取与超 ...
- Tomcat 长连接与短连接性能测试
环境: 操作系统:centos 6.5 x64 cpu:32 core 内存: 32G web服务器:tomcat 6.x jdk :1.6x 测试环境: 操作系统:centos 6.5 x64 c ...