luogu P3242 [HNOI2015]接水果
其实这题难点在于处理路径包含关系
先求出树的dfn序,现在假设路径\(xy\)包含\(uv(dfn_x<dfn_y,dfn_u<dfn_v)\)
如果\(lca(u,v)!=u\),那么\(x,y\)要分别在\(u,v\)子树中,即\(dfn_u\le dfn_x\le dfn_u+sz_u-1,dfn_v\le dfn_y\le dfn_v+sz_v-1\)
如果\(lca(u,v)=u\),设\(uv\)链上\(u\)的下一个点为\(w\),那么\(x,y\)一个在\(w\)子树外,一个在\(v\)子树内,即\(1\le dfn_x\le dfn_w-1,dfn_v\le dfn_y\le dfn_v+sz_v-1\)或\(dfn_v\le dfn_x\le dfn_v+sz_v-1,dfn_w+sz_w\le dfn_x\le n\)
然后把\(dfn_x,dfn_y\)看成一个点,所以一条路径的子路径条数就是那个点被多少矩形覆盖,矩形覆盖可以扫描线解决
因为多组询问+可以离线,所以套个整体二分求第k小就好了
#include<bits/stdc++.h>
#define LL long long
#define db double
#define il inline
#define re register
using namespace std;
const int N=40000+10;
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int to[N<<1],nt[N<<1],hd[N],tot;
il void add(int x,int y)
{
++tot,to[tot]=y,nt[tot]=hd[x],hd[x]=tot;
++tot,to[tot]=x,nt[tot]=hd[y],hd[y]=tot;
}
int fa[N],sz[N],de[N],hs[N],top[N],dfn[N],pp[N],ti;
void dfs1(int x)
{
sz[x]=1;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y==fa[x]) continue;
fa[y]=x,de[y]=de[x]+1,dfs1(y),sz[x]+=sz[y];
hs[x]=sz[hs[x]]>sz[y]?hs[x]:y;
}
}
void dfs2(int x,int ntp)
{
dfn[x]=++ti,pp[ti]=x,top[x]=ntp;
if(hs[x]) dfs2(hs[x],ntp);
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y!=fa[x]&&y!=hs[x]) dfs2(y,y);
}
}
int glca(int x,int y)
{
while(top[x]!=top[y])
{
if(de[top[x]]<de[top[y]]) swap(x,y);
x=fa[top[x]];
}
return de[x]<de[y]?x:y;
}
int n,m,tt,q,an[N],c[N];
void ad(int x,int y){if(!x) return;while(x<=n) c[x]+=y,x+=x&(-x);}
int gsm(int x){int an=0;while(x) an+=c[x],x-=x&(-x);return an;}
struct md
{
int x,l,r,z,k;
bool operator < (const md &bb) const {return x<bb.x;}
}mm[N<<2],lmm[N<<2],rmm[N<<2];
struct qu
{
int x,y,k,i;
bool operator < (const qu &bb) const {return x<bb.x;}
}qq[N],lq[N],rq[N];
void dc(int l,int r,int ll,int rr,int lx,int rx)
{
if(l>r||ll>rr) return;
if(lx==rx)
{
for(int i=ll;i<=rr;++i) an[qq[i].i]=lx;
return;
}
int mid=(lx+rx)>>1;
int tl1=0,tr1=0,tl2=0,tr2=0,i=l,j=ll;
while(i<=r||j<=rr)
{
if(j>rr||(i<=r&&mm[i].x<=qq[j].x))
{
if(mm[i].z<=mid) lmm[++tl1]=mm[i],ad(mm[i].l,mm[i].k),ad(mm[i].r+1,-mm[i].k);
else rmm[++tr1]=mm[i];
++i;
}
else
{
int cn=gsm(qq[j].y);
if(cn>=qq[j].k) lq[++tl2]=qq[j];
else qq[j].k-=cn,rq[++tr2]=qq[j];
++j;
}
}
for(int i=1;i<=tl1;++i) mm[l+i-1]=lmm[i],ad(lmm[i].l,-lmm[i].k),ad(lmm[i].r+1,lmm[i].k);
for(int i=1;i<=tr1;++i) mm[l+tl1+i-1]=rmm[i];
for(int i=1;i<=tl2;++i) qq[ll+i-1]=lq[i];
for(int i=1;i<=tr2;++i) qq[ll+tl2+i-1]=rq[i];
dc(l,l+tl1-1,ll,ll+tl2-1,lx,mid),dc(l+tl1,r,ll+tl2,rr,mid+1,rx);
}
int main()
{
n=rd(),m=rd(),q=rd();
for(int i=1;i<n;++i) add(rd(),rd());
dfs1(1),dfs2(1,1);
for(int i=1;i<=m;++i)
{
int x=rd(),y=rd(),z=rd();
if(dfn[x]>dfn[y]) swap(x,y);
int lca=glca(x,y);
if(lca!=x) mm[++tt]=(md){dfn[x],dfn[y],dfn[y]+sz[y]-1,z,1},mm[++tt]=(md){dfn[x]+sz[x],dfn[y],dfn[y]+sz[y]-1,z,-1};
else
{
int xx=y,la;
while(top[x]!=top[xx]) la=top[xx],xx=fa[top[xx]];
xx=xx!=x?pp[dfn[x]+1]:la;
mm[++tt]=(md){1,dfn[y],dfn[y]+sz[y]-1,z,1},mm[++tt]=(md){dfn[xx],dfn[y],dfn[y]+sz[y]-1,z,-1};
mm[++tt]=(md){dfn[y],dfn[xx]+sz[xx],n,z,1},mm[++tt]=(md){dfn[y]+sz[y],dfn[xx]+sz[xx],n,z,-1};
}
}
sort(mm+1,mm+tt+1);
while(mm[tt].x>n) --tt;
for(int i=1;i<=q;++i)
{
int x=rd(),y=rd(),k=rd();
if(dfn[x]>dfn[y]) swap(x,y);
qq[i]=(qu){dfn[x],dfn[y],k,i};
}
sort(qq+1,qq+q+1);
dc(1,tt,1,q,0,1<<30);
for(int i=1;i<=q;++i) printf("%d\n",an[i]);
return 0;
}
luogu P3242 [HNOI2015]接水果的更多相关文章
- 洛谷 P3242 [HNOI2015]接水果 解题报告
P3242 [HNOI2015]接水果 题目描述 风见幽香非常喜欢玩一个叫做 \(osu!\) 的游戏,其中她最喜欢玩的模式就是接水果.由于她已经\(DT\) \(FC\) 了\(\tt{The\ b ...
- [洛谷P3242] [HNOI2015]接水果
洛谷题目链接:[HNOI2015]接水果 题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, 她觉得这个游戏太简 ...
- ●洛谷P3242 [HNOI2015]接水果
题链: https://www.luogu.org/problemnew/show/P3242 题解: 整体二分,扫描线+树状数组. 详细的题解:http://blog.csdn.net/thy_as ...
- Luogu 3242 [HNOI2015]接水果
BZOJ4009 权限题 真的不想再写一遍了 大佬blog 假设有果实$(x, y)$,询问$(a, b)$,用$st_i$表示$i$的$dfs$序,用$ed_i$表示所有$i$的子树搜完的$dfs$ ...
- BZOJ4009: [HNOI2015]接水果
4009: [HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black, 她 ...
- BZOJ 4009: [HNOI2015]接水果
4009: [HNOI2015]接水果 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 636 Solved: 300[Submit][Status] ...
- [BZOJ4009][HNOI2015]接水果(整体二分)
[HNOI2015]接水果 时间限制:60s 空间限制:512MB 题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The b ...
- 【BZOJ4009】[HNOI2015]接水果 DFS序+整体二分+扫描线+树状数组
[BZOJ4009][HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, ...
- [HNOI2015]接水果[整体二分]
[HNOI2015]接水果 给出一个树上路径集合\(S\) 多次询问\(x,y\)中的\(k\)小值 如果你问我数列上那么我会 树上的话 树上差分了吧直接?- 令 \(st_x<st_y\) 1 ...
随机推荐
- mui 对话框 点击按钮不关闭对话框的办法
目前版本的 mui.js 点击对话框的按钮只能关闭对话框 做如下修改 点击按钮后return false 即可
- COGS 2392 2393 2395 有标号的二分图计数
有黑白关系: 枚举左部点(黑色点),然后$2^{i*(n-i)}$处理方法同:COGS 2353 2355 2356 2358 有标号的DAG计数 无关系: 发现,假设$f(i)$是一个连通块,对于一 ...
- c# WebApi之解决跨域问题:Cors
什么是跨域问题 出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容.由于这个原因,我们不同站点之间的数据访问会被拒绝. Cors解决跨域问 ...
- 第六篇-以隐式意图(Implicit Intent)呼叫系统服务
一.新建一个layout5.xml,同样换为constriant模式. 二.拖动两个Button到预览界面,第一个按钮名字改为DISPLAY WEBPAGE,第二个按钮名字改为MAKE A CALL. ...
- 【精】搭建redis cluster集群,JedisCluster带密码访问【解决当中各种坑】!
转: [精]搭建redis cluster集群,JedisCluster带密码访问[解决当中各种坑]! 2017年05月09日 00:13:18 冉椿林博客 阅读数:18208 版权声明:本文为博主 ...
- Day11--Python--函数名,闭包,迭代器
通过 lst.__iter__()拿到lst.的迭代器 1.函数名第一类对象 函数名就是变量名 1.函数名可以像变量一样互相赋值. 2.可以作为函数的参数,进行传递 3.可以作为返回值返回 4.可以作 ...
- nginx buffered to a temporary 解决
今天开启了nginx的error_log,发现了三个配置问题: 问题一: 2011/07/18 17:04:37 [warn] 2422#0: *171505004 an upstream respo ...
- Explicit Constructors(显式构造函数)
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:class String {String ( const char* p ); // ...
- Luogu P2770 航空路线问题
题目链接 \(Click\) \(Here\) 本来想调剂心情没想到写了那么久,还被\(dreagonm\)神仙嘲讽不会传纸条,我真是太弱了\(QAQ\)(原因:最开始写最大费用最大流一直想消圈,最后 ...
- 新买苹果电脑,mac系统中小白应该了解哪些东西?
本文旨在分享新买了mac电脑,应该做哪些设置,帮助苹果电脑小白轻松上手使用mac电脑,当然,新电脑肯定是需要安装各种软件,这里,小编推荐一下可以看看小编写的mac软件装机必备Mac 装机必备软件推荐, ...