传送门

其实这题难点在于处理路径包含关系

先求出树的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小就好了

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define db double
  4. #define il inline
  5. #define re register
  6. using namespace std;
  7. const int N=40000+10;
  8. il int rd()
  9. {
  10. int x=0,w=1;char ch=0;
  11. while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
  12. while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
  13. return x*w;
  14. }
  15. int to[N<<1],nt[N<<1],hd[N],tot;
  16. il void add(int x,int y)
  17. {
  18. ++tot,to[tot]=y,nt[tot]=hd[x],hd[x]=tot;
  19. ++tot,to[tot]=x,nt[tot]=hd[y],hd[y]=tot;
  20. }
  21. int fa[N],sz[N],de[N],hs[N],top[N],dfn[N],pp[N],ti;
  22. void dfs1(int x)
  23. {
  24. sz[x]=1;
  25. for(int i=hd[x];i;i=nt[i])
  26. {
  27. int y=to[i];
  28. if(y==fa[x]) continue;
  29. fa[y]=x,de[y]=de[x]+1,dfs1(y),sz[x]+=sz[y];
  30. hs[x]=sz[hs[x]]>sz[y]?hs[x]:y;
  31. }
  32. }
  33. void dfs2(int x,int ntp)
  34. {
  35. dfn[x]=++ti,pp[ti]=x,top[x]=ntp;
  36. if(hs[x]) dfs2(hs[x],ntp);
  37. for(int i=hd[x];i;i=nt[i])
  38. {
  39. int y=to[i];
  40. if(y!=fa[x]&&y!=hs[x]) dfs2(y,y);
  41. }
  42. }
  43. int glca(int x,int y)
  44. {
  45. while(top[x]!=top[y])
  46. {
  47. if(de[top[x]]<de[top[y]]) swap(x,y);
  48. x=fa[top[x]];
  49. }
  50. return de[x]<de[y]?x:y;
  51. }
  52. int n,m,tt,q,an[N],c[N];
  53. void ad(int x,int y){if(!x) return;while(x<=n) c[x]+=y,x+=x&(-x);}
  54. int gsm(int x){int an=0;while(x) an+=c[x],x-=x&(-x);return an;}
  55. struct md
  56. {
  57. int x,l,r,z,k;
  58. bool operator < (const md &bb) const {return x<bb.x;}
  59. }mm[N<<2],lmm[N<<2],rmm[N<<2];
  60. struct qu
  61. {
  62. int x,y,k,i;
  63. bool operator < (const qu &bb) const {return x<bb.x;}
  64. }qq[N],lq[N],rq[N];
  65. void dc(int l,int r,int ll,int rr,int lx,int rx)
  66. {
  67. if(l>r||ll>rr) return;
  68. if(lx==rx)
  69. {
  70. for(int i=ll;i<=rr;++i) an[qq[i].i]=lx;
  71. return;
  72. }
  73. int mid=(lx+rx)>>1;
  74. int tl1=0,tr1=0,tl2=0,tr2=0,i=l,j=ll;
  75. while(i<=r||j<=rr)
  76. {
  77. if(j>rr||(i<=r&&mm[i].x<=qq[j].x))
  78. {
  79. if(mm[i].z<=mid) lmm[++tl1]=mm[i],ad(mm[i].l,mm[i].k),ad(mm[i].r+1,-mm[i].k);
  80. else rmm[++tr1]=mm[i];
  81. ++i;
  82. }
  83. else
  84. {
  85. int cn=gsm(qq[j].y);
  86. if(cn>=qq[j].k) lq[++tl2]=qq[j];
  87. else qq[j].k-=cn,rq[++tr2]=qq[j];
  88. ++j;
  89. }
  90. }
  91. 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);
  92. for(int i=1;i<=tr1;++i) mm[l+tl1+i-1]=rmm[i];
  93. for(int i=1;i<=tl2;++i) qq[ll+i-1]=lq[i];
  94. for(int i=1;i<=tr2;++i) qq[ll+tl2+i-1]=rq[i];
  95. dc(l,l+tl1-1,ll,ll+tl2-1,lx,mid),dc(l+tl1,r,ll+tl2,rr,mid+1,rx);
  96. }
  97. int main()
  98. {
  99. n=rd(),m=rd(),q=rd();
  100. for(int i=1;i<n;++i) add(rd(),rd());
  101. dfs1(1),dfs2(1,1);
  102. for(int i=1;i<=m;++i)
  103. {
  104. int x=rd(),y=rd(),z=rd();
  105. if(dfn[x]>dfn[y]) swap(x,y);
  106. int lca=glca(x,y);
  107. 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};
  108. else
  109. {
  110. int xx=y,la;
  111. while(top[x]!=top[xx]) la=top[xx],xx=fa[top[xx]];
  112. xx=xx!=x?pp[dfn[x]+1]:la;
  113. 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};
  114. 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};
  115. }
  116. }
  117. sort(mm+1,mm+tt+1);
  118. while(mm[tt].x>n) --tt;
  119. for(int i=1;i<=q;++i)
  120. {
  121. int x=rd(),y=rd(),k=rd();
  122. if(dfn[x]>dfn[y]) swap(x,y);
  123. qq[i]=(qu){dfn[x],dfn[y],k,i};
  124. }
  125. sort(qq+1,qq+q+1);
  126. dc(1,tt,1,q,0,1<<30);
  127. for(int i=1;i<=q;++i) printf("%d\n",an[i]);
  128. return 0;
  129. }

luogu P3242 [HNOI2015]接水果的更多相关文章

  1. 洛谷 P3242 [HNOI2015]接水果 解题报告

    P3242 [HNOI2015]接水果 题目描述 风见幽香非常喜欢玩一个叫做 \(osu!\) 的游戏,其中她最喜欢玩的模式就是接水果.由于她已经\(DT\) \(FC\) 了\(\tt{The\ b ...

  2. [洛谷P3242] [HNOI2015]接水果

    洛谷题目链接:[HNOI2015]接水果 题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, 她觉得这个游戏太简 ...

  3. ●洛谷P3242 [HNOI2015]接水果

    题链: https://www.luogu.org/problemnew/show/P3242 题解: 整体二分,扫描线+树状数组. 详细的题解:http://blog.csdn.net/thy_as ...

  4. Luogu 3242 [HNOI2015]接水果

    BZOJ4009 权限题 真的不想再写一遍了 大佬blog 假设有果实$(x, y)$,询问$(a, b)$,用$st_i$表示$i$的$dfs$序,用$ed_i$表示所有$i$的子树搜完的$dfs$ ...

  5. BZOJ4009: [HNOI2015]接水果

    4009: [HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black,  她 ...

  6. BZOJ 4009: [HNOI2015]接水果

    4009: [HNOI2015]接水果 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 636  Solved: 300[Submit][Status] ...

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

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

  8. 【BZOJ4009】[HNOI2015]接水果 DFS序+整体二分+扫描线+树状数组

    [BZOJ4009][HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, ...

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

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

随机推荐

  1. 如何在以太坊上搭建一个Dapp?

    原创: 前哨小兵甲 区块链前哨 昨天 策划|Tina作者|Mahesh Murthy俗话说,实践出真知!对于开发人员来说,最好的学习办法就是亲自动手做一个小项目.所以,接下来我们将会以一个投票程序为例 ...

  2. spring5 reactive

    示例代码:https://github.com/srpraneeth/spring5-reactive 说明文档: https://coyee.com/article/12086-spring-5-r ...

  3. python基础-守护进程、守护线程、守护非守护并行

    守护进程 1.守护子进程 主进程创建守护进程  其一:守护进程会在主进程代码执行结束后就终止  其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic pro ...

  4. 跨域技术(JSONP与CROS)

    JSONP 我们发现,Web页面上调用js文件时不受是否跨域的影响,凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>.<img>.&l ...

  5. JS模块化开发(三)——seaJs+grunt

    1.seaJs直接构建存在的问题 由于模块之间的依赖require引用的是模块名,当多个js模块被合并成一个时,会由于找不到模块名而报错 2.seaJs+grunt开发 用到的插件:grunt-cmd ...

  6. 5.1、按键SW1控制LED1亮灭

    从图中可以看出,P1_2引脚可以感知SW1的状态,SW1未按下P1_2=1高电平,按下后P1_2=0接地. 注意:P1_2引脚只是感知SW1,不影响SW1. #include "ioCC25 ...

  7. 高级组件——工具栏JToolBar

    import javax.swing.*; import java.awt.*; public class Demo extends JFrame { public Demo() { setTitle ...

  8. 110道python面试题

    1.一行代码实现1--100之和 利用sum()函数求和 2.如何在一个函数内部修改全局变量 利用global 修改全局变量 3.列出5个python标准库 os:提供了不少与操作系统相关联的函数 s ...

  9. bzoj2938 AC自动机 + 拓扑排序找环

    https://www.lydsy.com/JudgeOnline/problem.php?id=2938 题意:给出N个01病毒序列,询问是否存在一个无限长的串不存在病毒序列 正常来说,想要寻找一个 ...

  10. jmeter jsr223脚本引用变量的问题

    发现jmeter的一个问题不知道算不算bug. 具体表现为,在脚本中通过"${varName}"的方式引用前面使用vars.put("varName",&quo ...