【bzoj4009 hnoi2015】接水果
题目描述
风见幽香非常喜欢玩一个叫做 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 小的那个盘子,每个盘子可重复使用(没有使用次数的上限:一个盘子接完一个水果后,后面还可继续接其他水果,只要它是水果路径的子路径)。幽香认为这个游戏很难,你能轻松解决给她看吗?
输入输出格式
输入格式:
第一行三个数 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 小一定存在。
输出格式:
对于每个果子,输出一行表示选择的盘子的权值。
题意:统计对于给出一些有权值的点对(盘子),再给出一些询问点对(水果),每个水果能被一个盘子接住当且仅当盘子的两点间的路径是水果两点之间路径的子路径。
题解:
①转化一下:一个盘子A可以接住一个水果B,意思是要么是A.x和A.y无祖先关系时,B.x和B.y都在A.x和A.y(可以交换位置)的子树里,要么是A.x和A.y有祖先关系:假设A.x是A.y的祖先,B.x一定在A.y的子树里且B.y一定不在A.x到A.y路径上的第二个点(第一个点为A.x)的子树里(同样可以交换)。
(还是给个图吧)aaarticlea/png;base64,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" alt="" />
②用dfs序维护一下子树信息,一个子树成为一个连续的一段,找x到y的第二个点可以LCA或者树剖每次往上跳即可。
③现在相当于每个盘子可以转化成一个矩形:整体二分,用扫描线的思想维护一下每次的答案。把所有矩形和询问点按横坐标的大小排序,想像有一条从左向右的直线,扫到的横坐标为一个矩形的起点是把这个区间的[l,r]加入树状数组里,终点时再去掉。询问变为纵坐标的询问就可以在树状数组内完成。
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAACxCAYAAAArk2MCAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAARUSURBVHhe7d3dbtpAFIXR0Pv2/Z+TPgDF1EaDZZD5iX0me62boKhSnRPzZcZCmsPp7Ksnfw/ji7PffV06VPNr/AoEEgAIJgAQTAAgmABAMAGAYAIAwQQAggkABFv9ScDDofkE3o5Ox/HF2eHP+KIDw5irzLBXZvi++dv9qQCs/Kffa+GjwNNNUeL6FkyzKzPDBWb4vl5m2LIFgGACAMEEAIIJAAQTAAgmABBMACCYAEAwAYBgAgDBBACCCQAEEwAIJgAQTAAgmABAMAGAYAIAwQQAggkABBMACCYAEEwAIJgAQDABgGACAMFqHw3WHgMGc+PRcFU4GgzoigBAsH62ANNyz+nA36KXGS7eE0V0M8NG3wH4KQrcyALwvh4DYAsAwQQAgnkGsIFpdjczLLaU7WWGtgCvu7n/RlYAEEwAINhTW4CtnY7ji7PDn/9fl77Xg2HM7Qx7/Tn2dLlVmy2AuT1v/nb3DGAD0+xuZugZwFOus/MM4GU399/IFgCCCQAEEwAIJgAQTAAgmABAMAGAYAIAwQQAggkABBMACCYAEEwAIJgAQDABgGACAMEEAIIJAAQTAAgmABBMACCYAEAwAYBgAgDBBACCCQAEEwAIJgAQTAAgmNOBNzDN7maGe51y2/6/fNT1CPvi92HLCgCCCQAEswXYQNktQPP/9jLD3eZ2T3M9tgBAVwQAggkABBMACPbUQ8CtnY7ji7PrA5aF7/VgGHM7w71+jl7nN7jcqgsP3fbU2zznb/fVAdjF0hPfak+BX7XXz9H7/Kpdf+fzXL0F2GMFsNZwbdWvr/1aUS8zrKzHGfb9OYCfosAKYLo5qi4Ir/df4RXAtAUoP8OGh4AQTAAgmI8Cb2Ca3S4znLMF+CxbAKBXAgDBBACCCQAEEwAIJgAQTAAgmABAMAGAYAIAwQQAggkABBMACCYAEEwAIJgAQDABgGACAMEEAIIJAAQTAAgmABBMACCYAEAwAYBgAgDBBACCCQAEEwAIJgAQ7PHx4O1RzD2pcGx0w/Hg73M8+PscDw7c+JErgKnElQxjnv7K7ul0HF+cVZzTI5dbdeEv7p56m+f87b46AMMP9+iffoul5d7C9y5Lm+YXYQvwwNJMz6Y47X59d1xnd+f6dzN7jwzKz7BhCwDB+lkBwJwVwFOsAIAbAgDBam8BlrTbAg8Bn7cwv8FwbYMSv+MFpWbYsgUAeiUAEEwAIJgAQDABgGACAMEEAIIJAAQTAAgmABBMACCYAEAwAYBgAgDBBACCCQAEEwAIJgAQTAAgmABAMAGAYAIAwQQAggkABBMACCYAEEwAIJgAQDCHg26g1MGW7fz4KIeDAl0RAAhmC7CBUluAO4ZrG1S+PjN8z9LsngpABe0bvb2me9+vYhjzdIPwGjN838sBKPNX9d41VbxWKM4zAAgmABBs/RagJ7YAsIoVAAQTAAj2eAtQkaf98DFWABBMACCYAEAwAYBYX1//AJVjeiDMBU+6AAAAAElFTkSuQmCC" alt="" />
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = ;
int n,m;
int o,hd[N],v[*N],nt[*N],son[N],top[N],size[N],st[N],ed[N],dep[N],idx,fa[N],ans[N],k;
char gc(){
static char *p1,*p2,s[];
if(p1==p2) p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
int rd(){
int x = ,f = ; char c = gc();
while(c<''||c>'') {if(c=='-') f=-;c = gc();}
while(c>=''&&c<='') x=x*+c-'',c=gc();
return x*f;
}///
void adde(int x,int y){v[o]=y;nt[o]=hd[x];hd[x]=o++;} ///
void Adde(int u,int v){adde(u,v);adde(v,u);}///
void dfsA(int u){
size[u] = ; st[u] = ++idx;
for(int i=hd[u];i!=-;i=nt[i]){
if(v[i]==fa[u]) continue;
fa[v[i]] = u;
dfsA(v[i]);
size[u] += size[v[i]];
if(size[v[i]]>size[son[u]]) son[u] = v[i];
}
ed[u] = idx;
}///
void dfsB(int u,int Top){
top[u] = Top; dep[u]=dep[fa[u]]+;
if(son[u]) dfsB(son[u],Top);
for(int i=hd[u];i!=-;i=nt[i]){
if(v[i]==fa[u]||v[i]==son[u]) continue;
dfsB(v[i],v[i]);
}
}///
int find(int x,int y){
int tmp=x;
while(top[x]!=top[y]) tmp=top[x],x=fa[top[x]];
return x==y?tmp:son[y];
}///
struct edge{int l,r,x1,y1,x2,y2,w;
bool operator <(const edge &a)const{return w<a.w;}
}e[N];///
struct A{int id,x,y,k;}a[N],tmp[N];///
struct B{int p,x,y,d;
bool operator<(const B&a)const{return p<a.p;}
}b[*N];///
struct C{int id,x,y;
bool operator<(const C&a)const{return x<a.x;}
}c[*N];///
int tot,cnt,bit[N],now[N];
void add(int x,int y){for(;x<=n;x+=x&-x)bit[x]+=y;}
int ask(int x){int ret=;for(;x;x-=x&-x)ret+=bit[x];return ret;}//
void erfn(int l,int r,int L,int R){
if(L>R) return ;
if(l==r){
for(int i=L;i<=R;i++) ans[a[i].id]=e[l].w;
return;
}
int mid=l+r>>,tb=,tc=,tl=L,tr=;
for(int i=l;i<=mid;i++){
if(e[i].x1<=e[i].y1){
b[++tb] = (B){e[i].l,e[i].x1,e[i].y1,};
b[++tb] = (B){e[i].r+,e[i].x1,e[i].y1,-};
}
if(e[i].x2<=e[i].y2){
b[++tb] = (B){e[i].l,e[i].x2,e[i].y2,};
b[++tb] = (B){e[i].r+,e[i].x2,e[i].y2,-};
}
}
sort(b+,b+tb+);
for(int i=L;i<=R;i++){
c[++tc] = (C){i,a[i].x,a[i].y};
c[++tc] = (C){i,a[i].y,a[i].x};
now[i] = ;
}
sort(c+,c+tc+);
int j=;
for(int i=;i <= tc;i++){
while(j<=tb&&b[j].p<=c[i].x) add(b[j].x,b[j].d),add(b[j].y+,-b[j].d),j++;
now[c[i].id]+=ask(c[i].y);
}
for(int i=j;i<=tb;i++) add(b[i].x,b[i].d),add(b[i].y+,-b[i].d);
for(int i=L;i<=R;i++){
if(now[i]>=a[i].k) a[tl++] = a[i]; else a[i].k-=now[i],tmp[tr++] = a[i];
}
for(int i=tl;i<=R;i++) a[i] = tmp[i-tl];
erfn(l,mid,L,tl-); erfn(mid+,r,tl,R);
}//
int main()
{ freopen("bzoj4009.in","r",stdin);
freopen("bzoj4009.out","w",stdout);
n=rd(); m=rd(); k=rd();
for(int i=;i<=n;i++) hd[i]=-;
for(int i=;i<n;i++) Adde(rd(),rd());
dfsA();
dfsB(,);
for(int i=,x,y,w;i<=m;i++){
x=rd(),y=rd(),w=rd();
if(dep[x]<dep[y]) swap(x,y);
if(st[x]>=st[y]&&ed[x]<=ed[y])
{
y=find(x,y);
e[++tot]=(edge){st[x],ed[x],,st[y]-,ed[y]+,n,w};
}
else e[++tot]=(edge){st[x],ed[x],st[y],ed[y],,,w};
}
sort(e+,e+tot+);
for(int i=,x,y,w;i<=k;i++){
x=rd(),y=rd(),w=rd();
a[++cnt]=(A){i,st[x],st[y],w};
}
erfn(,tot,,cnt);
for(int i =;i <= k;i++) printf("%d\n",ans[i]);//
}//by tkys_Austin;
【bzoj4009 hnoi2015】接水果的更多相关文章
- [BZOJ4009][HNOI2015]接水果(整体二分)
[HNOI2015]接水果 时间限制:60s 空间限制:512MB 题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The b ...
- BZOJ4009: [HNOI2015]接水果
4009: [HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black, 她 ...
- 2018.10.02 bzoj4009: [HNOI2015]接水果(整体二分)
传送门 整体二分好题. 考虑水果被盘子接住的条件. 不妨设水果表示的路径为(x1,y1)(x_1,y_1)(x1,y1),盘子表示的为(x2,y2)(x_2,y_2)(x2,y2) 不妨设df ...
- [bzoj4009] [HNOI2015]接水果 整体二分+扫描线+dfs序+树状数组
Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更 加 ...
- bzoj4009: [HNOI2015]接水果(整体二分)
题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更加难的版本. 首先有 ...
- bzoj4009 [HNOI2015]接水果 整体二分+扫描线+树状数组+dfs序
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4009 题解 考虑怎样的情况就会有一个链覆盖另一个链. 设被覆盖的链为 \(a - b\),覆盖 ...
- 【BZOJ4009】[HNOI2015]接水果 DFS序+整体二分+扫描线+树状数组
[BZOJ4009][HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, ...
- 【BZOJ4009】接水果(整体二分,扫描线)
[BZOJ4009]接水果(整体二分,扫描线) 题面 为什么这都是权限题???,洛谷真良心 题解 看到这道题,感觉就是主席树/整体二分之类的东西 (因为要求第\(k\)大) 但是,读完题目之后,我们发 ...
- BZOJ 4009: [HNOI2015]接水果
4009: [HNOI2015]接水果 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 636 Solved: 300[Submit][Status] ...
- 洛谷 P3242 [HNOI2015]接水果 解题报告
P3242 [HNOI2015]接水果 题目描述 风见幽香非常喜欢玩一个叫做 \(osu!\) 的游戏,其中她最喜欢玩的模式就是接水果.由于她已经\(DT\) \(FC\) 了\(\tt{The\ b ...
随机推荐
- Android Notification setLatestEventInfo方法已废弃
代替setLatestEventInfo的方法是用Notification.Builder创建Builder对象,通过该对象设置Notification相关属性. otification.Builde ...
- 算法题丨Move Zeroes
描述 Given an array nums, write a function to move all 0's to the end of it while maintaining the rela ...
- vSphere Client 搭建Windows server 2008 r2 服务器指南
下载准备 下载并安装vSphere Client 链接:https://pan.baidu.com/s/1v0IrGrMjpA2FGeqagaJN-g 密码:zzd1 下载Windows server ...
- hadoop2.6.0实践:002 检查伪分布式环境搭建
1.检查网络配置[root@hadoop-master ~]# cat /etc/sysconfig/networkNETWORKING=yesHOSTNAME=hadoop-masterGATEWA ...
- 阿里云API网关(13)请求身份识别:客户端请求签名和服务网关请求签名
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- GIT入门笔记(6)- 向版本库添加文本文件
1.把文本文件添加到版本库? 所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外. 版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词&q ...
- vue2.0+koa2+mongodb实现注册登录
前言 前段时间和公司一个由技术转产品的同事探讨他的职业道路,对我说了一句深以为然的话: "不要把自己禁锢在某一个领域,技术到产品的转变,首先就是思维上的转变.你一直做前端,数据的交互你只知道 ...
- Easyui Datagrid 修改显示行号列宽度
EasyUI中Datagrid的第一列显示行号,可是如果数据量大的的时候,显示行号的那一列数据会显示不完全的. 可以通过修改Datagrid的样式来解决这个问题,在样式中加入下面这个样式,就可以自己修 ...
- django关闭调试信息,打开内置错误视图
1 内置错误视图 Django内置处理HTTP错误的视图,主要错误及视图包括: 404错误:page not found视图 500错误:server error视图 400错误:bad reques ...
- JavaScript实现面向对象
/* js实现面向对象的方法 */ // 1 工厂模型 不推荐 function Person(name , sex , age){ obj = {}; obj.name = name; obj.se ...