码迷,mamicode.com
首页 > 其他好文 > 详细

[HNOI 2015]接水果

时间:2017-12-30 18:17:44      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:思想   article   tar   div   重复   lan   第k小   部分   扫描线   

Description

风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果。

由于她已经DT FC 了The big black,  她觉得这个游戏太简单了,于是发明了一个更

加难的版本。首先有一个地图,是一棵由 n 个顶点、n-1 条边组成的树(例如图 1

给出的树包含 8 个顶点、7 条边)。这颗树上有 P 个盘子,每个盘子实际上是一条

路径(例如图 1 中顶点 6 到顶点 8 的路径),并且每个盘子还有一个权值。第 i 个

盘子就是顶点a_i到顶点b_i的路径(由于是树,所以从a_i到b_i的路径是唯一的),

权值为c_i。接下来依次会有Q个水果掉下来,每个水果本质上也是一条路径,第

i 个水果是从顶点 u_i 到顶点v_i 的路径。幽香每次需要选择一个盘子去接当前的水

果:一个盘子能接住一个水果,当且仅当盘子的路径是水果的路径的子路径(例如

图1中从 3到7 的路径是从1到8的路径的子路径)。这里规定:从a 到b的路径与

从b到 a的路径是同一条路径。当然为了提高难度,对于第 i 个水果,你需要选择

能接住它的所有盘子中,权值第 k_i 小的那个盘子,每个盘子可重复使用(没有使用次数

的上限:一个盘子接完一个水果后,后面还可继续接其他水果,只要它是水

果路径的子路径)。幽香认为这个游戏很难,你能轻松解决给她看吗? 

Input

第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数。 

接下来n-1 行,每行两个数 a、b,表示树上的a和b 之间有一条边。树中顶点

按1到 n标号。 接下来 P 行,每行三个数 a、b、c,表示路径为 a 到 b、权值为 c 的盘子,其

中0≤c≤10^9,a不等于b。 

接下来Q行,每行三个数 u、v、k,表示路径为 u到 v的水果,其中 u不等于v,你需要选择第 k小的盘子,

第k 小一定存在。 

Output

 对于每个果子,输出一行表示选择的盘子的权值。 

Sample Input

10 10 10 
1 2 
2 3 
3 4 
4 5 
5 6 
6 7 
7 8 
8 9 
9 10 
3 2 217394434 
10 7 13022269 
6 7 283254485 
6 8 333042360 
4 6 442139372 
8 3 225045590 
10 4 922205209 
10 8 808296330 
9 2 486331361 
4 9 551176338 
1 8 5 
3 8 3 
3 8 4 
1 8 3 
4 8 1 
2 3 1 
2 3 1 
2 3 1 
2 4 1 
1 4 1 

Sample Output

442139372 
333042360 
442139372 
283254485 
283254485 
217394434 
217394434 
217394434 
217394434 
217394434 

HINT

N,P,Q<=40000。

题解

(部分内容来自thy_asdf

我们考虑如果这个题不出在树上,而在序列上,很容易想到用cdq来解决。

我们想办法将树拍成一条链,通常办法是dfs序(其实树剖的实质也是dfs序),再试图找到他们之间的dfs序关系。

对于一条路径的子路径,在有根树上只有两种情况。我们分别考虑两种情况(记号说明:dfn_u 表示u的dfs序,last_u 表示以u为根的子树中dfs序最大的值):

1. 子路径经过整条路径的lca:

技术分享图片

如上图所示,假设子路径u<->v在路径a<->b上。显然a,b分别在以u,v为根的子树中。

不妨设dfn_u<=dfn_v,dfn_a<=dfn_b,由dfs序的性质,显然存在不等式:dfn_u<=dfn_a<=last_u,dfn_v<=dfn_b<=last_v。

2. 子路径不经过整条路径的lca:

技术分享图片

我们记节点u在路径u<->v上的儿子是w。

同样的,容易发现,路径a<->b若包含u<->v肯定需要a或b其中一个是在以v为根的子树中。不妨假设这个点是a。

那么b应满足:不在以w为根的子树中即可。

显然就有dfn_v<=dfn_a<=last_v,1<=dfn_b<=dfn_w-1 \cup last_w+1<=dfn_b<=n。

那么现在题目就转化成了不等式之间的关系,考虑cdq,我们需要解决的问题就是一个实数对(dfn_a,dfn_b)满足不等式组的个数。

继续转化,将需要同时满足的两个不等式抽象成二位空间内的一个矩形,只要点(dfn_a,dfn_b)在某个矩形内,就能满足这个不等式组。

现在,整个题目就是覆盖一个点的矩形中权值第k小的权值是多少

将矩形按权值从小到大排序,用扫描线的思想,树状数组区间修改即可。

[HNOI 2015]接水果

标签:思想   article   tar   div   重复   lan   第k小   部分   扫描线   

原文地址:https://www.cnblogs.com/NaVi-Awson/p/8150418.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!