传送门

整体二分好题。


考虑水果被盘子接住的条件。

不妨设水果表示的路径为(x1,y1)(x_1,y_1)(x1​,y1​),盘子表示的为(x2,y2)(x_2,y_2)(x2​,y2​)

不妨设dfn[x2]>dfn[y2],dfn[x1]>dfn[y1]dfn[x_2]>dfn[y_2],dfn[x_1]>dfn[y_1]dfn[x2​]>dfn[y2​],dfn[x1​]>dfn[y1​]

那么有两种情况。

第一种:

y2y_2y2​是x2x_2x2​的祖先。

这时水果需要覆盖掉这条链。

那么x1x_1x1​在x2x_2x2​子树中,y1y_1y1​在y2y_2y2​子树外。

第二种:

y2y_2y2​不是x2x_2x2​的祖先。

那么,x1x_1x1​在x2x_2x2​的子树中,y1y_1y1​在y2y_2y2​的子树中。

发现这两种情况如果用dfs序表示就对应着点在矩形中的关系。

于是我们用整体二分求出覆盖每个点的第k小矩形的下标。

代码:

#include<bits/stdc++.h>
#define N 40005
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int n,p,q,first[N],cnt=0,in[N],out[N],dep[N],st[N][21],pred[N],bit[N],ans[N],tot=0,cnt1=0,cnt2=0;
struct edge{int v,next;}e[N<<1];
struct Q{int u,v,k,id;}qry[N],qtmp[N];
struct Upd{int typ,x,y1,y2,tmp;}upd[N<<2];
inline void add(int u,int v){e[++cnt].v=v,e[cnt].next=first[u],first[u]=cnt;}
inline void dfs(int p){
	pred[in[p]=++tot]=p;
	for(int i=1;i<=20;++i)st[p][i]=st[st[p][i-1]][i-1];
	for(int i=first[p];i;i=e[i].next){
		int v=e[i].v;
		if(v==st[p][0])continue;
		dep[v]=dep[p]+1,st[v][0]=p,dfs(v);
	}
	out[p]=tot;
}
inline int lca(int u,int v){
	if(dep[u]<dep[v])swap(u,v);
	int tmp=dep[u]-dep[v];
	for(int i=20;~i;--i)if((tmp>>i)&1)u=st[u][i];
	if(u==v)return u;
	for(int i=20;~i;--i)if(st[u][i]!=st[v][i])u=st[u][i],v=st[v][i];
	return st[u][0];
}
struct Plate{int x1,x2,y1,y2,v;}plate[N*2];
inline void update(int x,int v){for(int i=x;i<=n;i+=i&-i)bit[i]+=v;}
inline int query(int x){int ret=0;for(int i=x;i;i-=i&-i)ret+=bit[i];return ret;}
inline bool cmp(Plate a,Plate b){return a.v<b.v;}
inline bool cmp1(Upd a,Upd b){return a.x==b.x?a.typ<b.typ:a.x<b.x;}
inline void solve(int l,int r,int ql,int qr){
	if(l>r)return;
	if(ql==qr){
		for(int i=l;i<=r;++i)ans[qry[i].id]=plate[ql].v;
		return;
	}
	int mid=ql+qr>>1,siz=0;
	for(int i=ql;i<=mid;++i){
		upd[++siz]=(Upd){0,plate[i].x1,plate[i].y1,plate[i].y2,1};
		upd[++siz]=(Upd){2,plate[i].x2,plate[i].y1,plate[i].y2,-1};
	}
	for(int i=l;i<=r;++i)upd[++siz]=(Upd){1,qry[i].u,qry[i].v,i,0};
	sort(upd+1,upd+siz+1,cmp1);
	int hd=l-1,tl=r+1;
	for(int i=1;i<=siz;++i){
		if(upd[i].typ==1){
			int val=query(upd[i].y1),tmp=upd[i].y2;
			if(qry[tmp].k<=val)qtmp[++hd]=qry[tmp];
			else qry[tmp].k-=val,qtmp[--tl]=qry[tmp];
		}
		else update(upd[i].y1,upd[i].tmp),update(upd[i].y2+1,-upd[i].tmp);
	}
	for(int i=l;i<=r;++i)qry[i]=qtmp[i];
	solve(l,hd,ql,mid),solve(tl,r,mid+1,qr);
}
int main(){
	n=read(),p=read(),q=read();
	for(int i=1;i<n;++i){
		int u=read(),v=read();
		add(u,v),add(v,u);
	}
	dfs(1);
	for(int i=1;i<=p;++i){
		int u=read(),v=read(),w=read();
		if(in[u]>in[v])swap(u,v);
		int t=lca(u,v);
		if(t!=u)plate[++cnt1]=(Plate){in[u],out[u],in[v],out[v],w};
		else{
			int tmp=dep[v]-dep[u]-1,pre=v;
			for(int i=20;~i;--i)if((tmp>>i)&1)pre=st[pre][i];
			plate[++cnt1]=(Plate){1,in[pre]-1,in[v],out[v],w};
			if(out[v]<n)plate[++cnt1]=(Plate){in[v],out[v],out[pre]+1,n,w};
		}
	}
	sort(plate+1,plate+cnt1+1,cmp);
	for(int i=1;i<=q;++i){
		int u=read(),v=read(),k=read();
		if(in[u]>in[v])swap(u,v);
		qry[i]=(Q){in[u],in[v],k,i};
	}
	solve(1,q,1,cnt1);
	for(int i=1;i<=q;++i)printf("%d\n",ans[i]);
	return 0;
}

2018.10.02 bzoj4009: [HNOI2015]接水果(整体二分)的更多相关文章

  1. [BZOJ4009][HNOI2015]接水果(整体二分)

    [HNOI2015]接水果 时间限制:60s      空间限制:512MB 题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The b ...

  2. [bzoj4009] [HNOI2015]接水果 整体二分+扫描线+dfs序+树状数组

    Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更 加 ...

  3. bzoj4009 [HNOI2015]接水果 整体二分+扫描线+树状数组+dfs序

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4009 题解 考虑怎样的情况就会有一个链覆盖另一个链. 设被覆盖的链为 \(a - b\),覆盖 ...

  4. BZOJ4009:[HNOI2015]接水果(整体二分版)

    浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...

  5. BZOJ.4009.[HNOI2015]接水果(整体二分 扫描线)

    LOJ BZOJ 洛谷 又是一个三OJ rank1!=w= \(Description\) (还是感觉,为啥非要出那种题目背景啊=-=直接说不好么) 给定一棵树和一个路径集合(每条路径有一个权值).\ ...

  6. [HNOI2015]接水果[整体二分]

    [HNOI2015]接水果 给出一个树上路径集合\(S\) 多次询问\(x,y\)中的\(k\)小值 如果你问我数列上那么我会 树上的话 树上差分了吧直接?- 令 \(st_x<st_y\) 1 ...

  7. BZOJ 4009: [HNOI2015]接水果 (整体二分+扫描线 树状数组)

    整体二分+扫描线 树状数组 具体做法看这里a CODE #include <cctype> #include <cstdio> #include <cstring> ...

  8. 2018.10.02 NOIP模拟 矩阵分组(二分答案)

    传送门 考场上并不会写二分的check函数,下来看了看题解发现真是妙极. 不难想到每次直接从四个角各按阶梯状拓展出合法区域A,再检验B是否合法就行了.(然而考场上写的弃疗了) 于是题解用了一些小技巧优 ...

  9. [HNOI2015][bzoj4009] 接水果 [整体二分+扫描线]

    题面 传送门 思路 本题其实有在线做法......但是太难写了,退而求其次写了离线 基本思路就是,考虑一个盘子以及它能接到的所有水果 可以发现,这个水果的端点一定在这个盘子两端的"子树&qu ...

随机推荐

  1. node 删除文件 和文件夹

    删除文件 var fs = require('fs'); fs.unlink(path,callback); 删除文件夹 deleteFolder(path); function deleteFold ...

  2. UI5-文档-4.25-Sorting and Grouping

    为了使我们的发票列表更加用户友好,我们将它按字母顺序排序,而不是仅仅显示来自数据模型的顺序.此外,我们还引入了组,并添加了发布产品的公司,以便更容易使用数据. Preview The list is ...

  3. gerp , sed , awk

    gerp 查找, sed 编辑, awk 根据内容分析并处理. awk(关键字:分析&处理) 一行一行的分析处理 awk '条件类型1{动作1}条件类型2{动作2}' filename, aw ...

  4. Lock()与RLock()锁

    资源总是有限的,程序运行如果对同一个对象进行操作,则有可能造成资源的争用,甚至导致死锁 也可能导致读写混乱 锁提供如下方法: 1.Lock.acquire([blocking]) 2.Lock.rel ...

  5. 【Java】JVM(五)、虚拟机类加载机制

    一.概念 类加载:虚拟机把类的数据从Class文件加载到内存中,并对数据进行校验,转化解析,和初始化,最终形成可以被虚拟机直接使用的Java类型. 二.加载时机 1.加载 加载阶段虚拟机完成的工作为: ...

  6. 201671010127 2016—2017—2 Java怎样解决Java程序中中文乱码的问题。

    这是本次第二次分享新手在编程中遇到的问题,相信很多Java新手和我一样,在Java编程中会遇到中文乱码的情况,下面我就给大家分享我遇到问题和解决问题的具体过程. 我先用Notepad++写了一个如下的 ...

  7. sqlserver批量导出存储过程、函数、视图

    select text from syscomments s1 join sysobjects s2 on s1.id=s2.id  where xtype = 'V' xtype V   视图 P  ...

  8. centos7装NVIDIA显卡驱动

    一.系统及显卡 系统:centos7.5 64位 显卡:gtx 1060 前几天主要是有一个人脸识别的项目测试,需要用到显卡去测试性能,然后装显卡的过程折腾了一下,特此记录. 二.安装过程 1. 下载 ...

  9. session以及分布式服务器session共享

    一.session的本质 http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你. 那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录 ...

  10. yii使用gii创建后台模块与widget使用

    yii使用gii创建后台模块与widget使用 1.在protected/config/main.php中打开gii的配置属性. 'gii'=>array( 'class'=>'syste ...