题意

内存限制:512 MiB
时间限制:6000 ms

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

首先有一个地图,是一棵由 n n n 个顶点、 n − 1 n-1 n−1 条边组成的树(例如图 1 1 1 给出的树包含 8 8 8 个顶点、 7 7 7 条边)。这颗树上有 P 个盘子,每个盘子实际上是一条路径(例如图 1 1 1 中顶点 6 6 6 到顶点 8 8 8 的路径),并且每个盘子还有一个权值。第 i i i 个盘子就是顶点 a i a_i ai​ 到顶点 b i b_i bi​ 的路径(由于是树,所以从 a i a_i ai​ 到 b i b_i bi​ 的路径是唯一的),权值为 c i c_i ci​。接下来依次会有 Q Q Q 个水果掉下来,每个水果本质上也是一条路径,第 i i i 个水果是从顶点 u i u_i ui​ 到顶点 v i v_i vi​ 的路径。

幽香每次需要选择一个盘子去接当前的水果:一个盘子能接住一个水果,当且仅当盘子的路径是水果的路径的子路径(例如图 1 1 1 中从 3 3 3 到 7 7 7 的路径是从 1 1 1 到 8 8 8 的路径的子路径)。这里规定:从 a a a 到 b b b 的路径与从 b b b 到 a a a 的路径是同一条路径。当然为了提高难度,对于第 i i i 个水果,你需要选择能接住它的所有盘子中,权值第 k i k_i ki​ 小的那个盘子,每个盘子可重复使用(没有使用次数的上限:一个盘子接完一个水果后,后面还可继续接其他水果,只要它是水果路径的子路径)。幽香认为这个游戏很难,你能轻松解决给她看吗?

对于所有数据, N , P , Q ≤ 40000 N,P,Q \leq 40000 N,P,Q≤40000。

题解

考虑整体二分
把二分到的值 ≤ m i d \leq mid ≤mid 的盘子加入到某数据结构,然后对于该二分区间内的询问查询其被水果覆盖的盘子个数和 k k k 的关系,再分左右区间
考虑如何处理一条路径被另一条路径覆盖问题
先求出其 d f s dfs dfs 序,设 L u = d f n u L_u=dfn_u Lu​=dfnu​ , R u = d f n u + s z u − 1 R_u=dfn_u+sz_u-1 Ru​=dfnu​+szu​−1
将水果看成二维平面上的点 ( L u , L v ) (L_u,L_v) (Lu​,Lv​)
若要覆盖路径 ( x , y ) (x,y) (x,y) 则应该:

  1. L c a ( x , y ) ! = x Lca(x,y) != x Lca(x,y)!=x
    也就是 L x ≤ L u ≤ R x L_x \leq L_u \leq R_x Lx​≤Lu​≤Rx​, L y ≤ L v ≤ R y L_y \leq L_v \leq R_y Ly​≤Lv​≤Ry​
    所以可以把 ( x , y ) (x,y) (x,y) 看成矩形 ( L x , L y ) , ( R x , R y ) (L_x,L_y),(R_x,R_y) (Lx​,Ly​),(Rx​,Ry​)
  2. L c a ( x , y ) = x Lca(x,y)=x Lca(x,y)=x
    设 z z z 是 x → y x→y x→y 上的第一个点,
    那也就是满足一点在 y y y 子树内,一点在 z z z 子树外
    即 ( 1 , L y ) , ( L z − 1 , R y ) (1,L_y),(L_z-1,R_y) (1,Ly​),(Lz​−1,Ry​) 和 ( R z + 1 , L y ) , ( n , R y ) (R_z+1,L_y),(n,R_y) (Rz​+1,Ly​),(n,Ry​)

这样就是二维数点问题啦,用 b i t bit bit 处理即可
(矩形记得横纵坐标相反也算

#include <bits/stdc++.h>
#define I inline
using namespace std;
const int N=40005;
int m,n,P,Q,V[N*2],nx[N*2],hd[N],t,f[N][17],d[N],in[N],tt,b[N],B,ans[N],ot[N],s[N];
struct O1{int x,l,r,w,v;}p[N*8],pp[N*8];
struct O2{int x,y,k,id;}q[N],qq[N];
I void add(int u,int v){V[++t]=v;nx[t]=hd[u];hd[u]=t;}
I void dfs(int x,int fa){f[x][0]=fa;d[x]=d[fa]+1;in[x]=++tt;for (int i=1;f[f[x][i-1]][i-1];i++)f[x][i]=f[f[x][i-1]][i-1];for (int i=hd[x];i;i=nx[i])if (V[i]!=fa) dfs(V[i],x);ot[x]=tt;
}
I int get(int x,int y){int l=d[y]-d[x]-1;for (int i=16;~i;i--)if ((l>>i)&1) y=f[y][i];return y;
}
I void ins(int X1,int Y1,int X2,int Y2,int w){p[++m]=(O1){X1,X2,Y2,1,w},p[++m]=(O1){Y1+1,X2,Y2,-1,w},p[++m]=(O1){X2,X1,Y1,1,w},p[++m]=(O1){Y2+1,X1,Y1,-1,w};
}
I bool c1(O1 A,O1 B){return A.x<B.x;}
I bool c2(O2 A,O2 B){return A.x<B.x;}
I void update(int x,int v){for (;x<=n;x+=x&-x) s[x]+=v;}
I int query(int x){int A=0;for (;x;x-=x&-x) A+=s[x];return A;}
I void update(int l,int r,int v){update(l,v);update(r+1,-v);}
I void solve(int l,int r,int pl,int pr,int ql,int qr){if (l==r){for (int i=ql;i<=qr;i++)ans[q[i].id]=b[l];return;}int mid=(l+r)>>1,Pl=pl-1,Pr=pr+1,Ql=ql-1,Qr=qr+1,L;for (int k,j=pl,i=ql;i<=qr;i++){while(j<=pr && p[j].x<=q[i].x){if (p[j].v>b[mid]) pp[--Pr]=p[j];elseupdate(p[j].l,p[j].r,p[j].w),pp[++Pl]=p[j];j++;}k=query(q[i].y);if (q[i].k>k) q[i].k-=k,qq[--Qr]=q[i];else qq[++Ql]=q[i];if (i==qr) while(j<=pr){if (p[j].v>b[mid]) pp[--Pr]=p[j];else update(p[j].l,p[j].r,p[j].w),pp[++Pl]=p[j];j++;}}for (int j=pl;j<=pr;j++)if (p[j].v<=b[mid]) update(p[j].l,p[j].r,-p[j].w);L=pl-1;for (int i=pl;i<=Pl;i++) p[++L]=pp[i];for (int i=pr;i>=Pr;i--) p[++L]=pp[i];L=ql-1;for (int i=ql;i<=Ql;i++) q[++L]=qq[i];for (int i=qr;i>=Qr;i--) q[++L]=qq[i];if (pl<=Pl && ql<=Ql) solve(l,mid,pl,Pl,ql,Ql);if (Pr<=pr && Qr<=qr) solve(mid+1,r,Pr,pr,Qr,qr);
}
int main(){scanf("%d%d%d",&n,&P,&Q);for (int x,y,i=1;i<n;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x);dfs(1,0);for (int z,x,y,i=1;i<=P;i++){scanf("%d%d%d",&x,&y,&b[i]);if (d[x]>d[y]) swap(x,y);if (in[x]<=in[y] && ot[x]>=ot[y]){z=get(x,y);if (in[z]>1) ins(1,in[z]-1,in[y],ot[y],b[i]);if (ot[z]<n) ins(ot[z]+1,n,in[y],ot[y],b[i]);}else ins(in[x],ot[x],in[y],ot[y],b[i]);}sort(b+1,b+P+1);B=unique(b+1,b+P+1)-b-1;for (int x,y,i=1;i<=Q;i++)scanf("%d%d%d",&x,&y,&q[i].k),q[i].id=i,q[i].x=in[x],q[i].y=in[y];sort(p+1,p+m+1,c1);sort(q+1,q+Q+1,c2);solve(1,B,1,m,1,Q);for (int i=1;i<=Q;i++)printf("%d\n",ans[i]);return 0;
}

#2284. 接水果(fruit)相关推荐

  1. 接水果(fruit)

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

  2. java语言实现吃水果问题_Java 面向对象 之 人吃水果

    /** 题目: 人可以(孩子,学生,老师) 吃 水果(苹果,葡萄,芒果,菠萝) 思路: 1. 抽象出类 : 人(Person){孩子(Baby),学生(Student)}, 水果(Fruit){苹果( ...

  3. 用JAVA编写一个水果箱,Java SE 第四章类之间的关系--水果箱编程题

    问题:有一个水果箱(Box),箱子里装有水果(Fruit),每一种水果都有不同的重量和颜色,水果有:苹果.梨.桔子.每个苹果(Apple)都有不同的重量和颜色,每个桔子(Orange)都有不同的重量和 ...

  4. 水果超市管理系统(基于Java Swing、arrayList、GUI、Windowbuilding)

    水果超市管理系统 1.任务描述 在水果超市中,有着各种各样的水果,为了便于管理,会将水果信息记录在水果超市管理系统中进行统一管理,通过系统可以方便地实现对水果信息的增删改查操作.其中,水果信息包括水果 ...

  5. python学习笔记3-循环1

    1 while break continue 1 #while语句 2 ''' 3 while 判断条件: 4 执行语句-- 5 ''' 6 count = 0 7 while (count < ...

  6. python循环语句-python中的for循环语句怎么写

    python中的for循环语句怎么写? Python for 循环语句 Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串. for循环的语法格式如下: 1 2 for iter ...

  7. python培训深圳-深圳Python培训哪里好

    深圳Python培训哪里好 来源:深圳达内IT教育培训学校 时间:2019/8/19 16:15:31 Python for 循环语句 Python for循环可以遍历任何序列的项目,如一个列表或者一 ...

  8. python自学流程-python 学习之 基础篇三 流程控制

    前言: 一. python中有严格的格式缩进,因为其在语法中摒弃了"{}"来包含代码块,使用严格的缩进来体现代码层次所以在编写代码的时候项目组要严格的统一器缩进语法,一个tab按键 ...

  9. python循环实验心得_2019.06.18学习python循环总结

    常用循环: 1.for ... in 2.if ... else range(start, end, scan)函数: 参数含义: start:计数从start开始.默认是从0开始.例如range(5 ...

最新文章

  1. js下载文件及命名(兼容多浏览器)
  2. 性味归经与功能的脚本(超过四元素)
  3. 《精通Unreal游戏引擎》一第4步 使用BSP创建地图
  4. 【数据结构与算法】之双向链表的创建/遍历/插入/删除/查找的算法实现
  5. java中的数组、队列、堆栈
  6. pymysql(part2)--pymysql使用流程
  7. 初学JavaWeb,前端css要不要了解一下啊?一文学会JavaWeb中css的简单应用
  8. LintCode 183. 木材加工(二分查找)
  9. 详解两个栈实现一个队列(python实现——经典面试题)
  10. 毕业设计开发板-基于C20S单片机恒温开发板
  11. conda创建环境并下载d2l软件包
  12. 微信小程序的开发与原理
  13. Code39码如何批量生成
  14. 去哪儿网BI平台建设演进与实践
  15. iOS本地数据存储安全
  16. android ICS 系统启动之Logo相关学习总结
  17. 汉字编码与编程相关问题总结:ASCII、机内码、区位码、国标码、Unicode码是如何转换的
  18. 智慧城市-智慧城管系列-0-项目实战-资料
  19. 三菱服务器显示RL,三菱逆变器故障显示
  20. 图论(2)完全图,顶点的度与度序列

热门文章

  1. Word使用小技巧积累
  2. 根据经纬度坐标获取海拔
  3. mysql存储过程执行动态sql返回结果,mysql存储过程执行动态sql语句并返回值
  4. 航空软件静态测试标准,静态试验
  5. 输入二次函数系数求平方根
  6. 我27岁了,我现在慌的一逼
  7. SQL语法范例大全pdf
  8. python录入数据至ppt_利用python分析weibo数据做成图表放入PPT中
  9. profession of WOWChina-Quote from ngacn.com
  10. erlang调试方法