题链:

https://www.luogu.org/problemnew/show/P3242

题解:

整体二分,扫描线+树状数组。
详细的题解:http://blog.csdn.net/thy_asdf/article/details/50363672
得到各个盘子影响的矩形区域后,
那么我们就是要对每个询问代表的点查询覆盖了它的权值第k小的的那个矩形。
首先有一个简化版的问题,
就是查询改点被覆盖了多少次。可以用扫描线+树状数组做。
然后对于现在询问的第k小权值,
我们就可以二分答案,即二分一个权值mid,
然后判断是否这些权值小于mid的矩形可以覆盖该点至少k次,
使得话,缩小r,否则扩大l范围。
由于有多个询问,且分别做二分的话过程是一样的,所以可以整体二分。

另外,还可以对当前扫描线上的东西建立树套树,
外面是权值线段树,里面套的是区间线段树(方便区间修改,单点查询),也可以求出第k小的权值。
如果想看具体实现的话,推荐服用这位博主的代码:http://blog.csdn.net/make_it_for_good/article/details/52985365

再另外,好像还可以树上莫队+平衡树做,但是我太弱了,忘了树上莫队,就没写了。
但是我感觉如果用莫队的话,如果数据故意把水果和盘子的左端点放到同一个位置附近,
同时程序的分块又恰好把这些位置分在了同一个块,
可能会被卡成n^2的。

代码:

  1. #include<bits/stdc++.h>
  2. #define MAXN 160008
  3. #define rint register int
  4. using namespace std;
  5. int N,P,Q,snt;
  6. int ANS[MAXN],fa[MAXN][18],deep[MAXN],be[MAXN],en[MAXN];
  7. struct Edge{
  8. int ent;
  9. int to[MAXN],nxt[MAXN],head[MAXN];
  10. Edge(){ent=2;}
  11. void Adde(int u,int v){
  12. to[ent]=v; nxt[ent]=head[u]; head[u]=ent++;
  13. }
  14. }E;
  15. struct Plate{
  16. int x1,x2,y1,y2,val;
  17. }S[MAXN];
  18. struct info{
  19. int x,yl,yr,val,id;
  20. }A[MAXN],T[MAXN];
  21. bool cmp1(const Plate &_A,const Plate &_B){
  22. return _A.val<_B.val;
  23. }
  24. bool cmp2(const info &_A,const info &_B){
  25. return _A.x<_B.x||(_A.x==_B.x&&_A.id<_B.id);
  26. }
  27. struct BIT{
  28. int val[MAXN],n;
  29. void Reset(int _n){n=_n;}
  30. int Lowbit(int x){return x&(-x);}
  31. void Modify(int l,int r,int x){//区间修改
  32. if(l>r) return;
  33. for(rint i=l;i<=n;i+=Lowbit(i)) val[i]+=x;
  34. for(rint i=r+1;i<=n;i+=Lowbit(i)) val[i]-=x;
  35. }
  36. int Query(int p,int ret=0){//查询覆盖次数
  37. for(rint i=p;i>=1;i-=Lowbit(i)) ret+=val[i];
  38. return ret;
  39. }
  40. }DT;
  41. void dfs(int u,int dad){
  42. static int cnt; ++cnt;
  43. be[u]=cnt; fa[u][0]=dad;
  44. for(int k=1;k<18;k++)
  45. fa[u][k]=fa[fa[u][k-1]][k-1];
  46. for(int e=E.head[u];e;e=E.nxt[e]){
  47. int v=E.to[e]; if(v==dad) continue;
  48. deep[v]=deep[u]+1; dfs(v,u);
  49. }
  50. en[u]=cnt;
  51. }
  52. int jump(int x,int h){
  53. for(int k=17;k>=0;k--)
  54. if(h>=(1<<k)) x=fa[x][k],h-=(1<<k);
  55. return x;
  56. }
  57. info inssegment(const Plate &rtm,int k){
  58. static int x1,x2,y1,y2,v;
  59. x1=rtm.x1; x2=rtm.x2; y1=rtm.y1; y2=rtm.y2; v=rtm.val;
  60. assert(x1<=x2);
  61. if(k==1) return (info){x1,y1,y2,v,-1};
  62. else return (info){x2+1,y1,y2,v,-2};
  63. }
  64. void solve(int sl,int sr,int ql,int qr){
  65. static int sum[MAXN];
  66. if(ql>qr) return;
  67. if(sl==sr){
  68. for(int i=ql;i<=qr;i++) ANS[A[i].id]=S[sl].val;
  69. return;
  70. }
  71. int mid=(sl+sr)>>1,tnt=0,qlnt=ql-1,qrnt=0;
  72. for(int i=sl;i<=mid;i++) T[++tnt]=inssegment(S[i],1),T[++tnt]=inssegment(S[i],2);
  73. for(int i=ql;i<=qr;i++) T[++tnt]=A[i];
  74. sort(T+1,T+tnt+1,cmp2);
  75. for(int i=1;i<=tnt;i++){
  76. if(T[i].id<0) DT.Modify(T[i].yl,T[i].yr,T[i].id==-1?1:-1);
  77. else sum[T[i].id]=DT.Query(T[i].yl);
  78. }
  79. for(int i=1;i<=tnt;i++){
  80. if(T[i].id<0) DT.Modify(T[i].yl,T[i].yr,T[i].id==-1?-1:1);
  81. else{
  82. if(sum[T[i].id]>=T[i].val) A[++qlnt]=T[i];
  83. else T[i].val-=sum[T[i].id],T[++qrnt]=T[i];
  84. }
  85. }
  86. for(int i=1;i<=qrnt;i++) A[i+qlnt]=T[i];
  87. solve(sl,mid,ql,qlnt);
  88. solve(mid+1,sr,qlnt+1,qr);
  89. }
  90. int main(){
  91. ios::sync_with_stdio(0);
  92. cin>>N>>P>>Q;
  93. for(int i=1,a,b;i<N;i++)
  94. cin>>a>>b,E.Adde(a,b),E.Adde(b,a);
  95. dfs(1,0); DT.Reset(N);
  96. for(int i=1,x,y,v,t;i<=P;i++){
  97. cin>>x>>y>>v;
  98. if(be[x]>be[y]) swap(x,y);
  99. if(be[x]<=be[y]&&en[x]>=en[y]){
  100. t=jump(y,deep[y]-deep[x]-1);
  101. S[++snt]=(Plate){1,be[t]-1,be[y],en[y],v};
  102. if(en[t]+1<=N) S[++snt]=(Plate){be[y],en[y],en[t]+1,N,v};
  103. }
  104. else S[++snt]=(Plate){be[x],en[x],be[y],en[y],v};
  105. }
  106. sort(S+1,S+snt+1,cmp1);
  107. for(int i=1,x,y,k;i<=Q;i++){
  108. cin>>x>>y>>k;
  109. if(be[x]>be[y]) swap(x,y);
  110. A[i]=(info){be[x],be[y],0,k,i};
  111. //在构建的二维平面里,x点对应的下标不是x,而是be[x]
  112. //wa了一次,就是因为上面的那行代码写成了:
  113. //A[i]=(info){x,y,0,k,i};
  114. }
  115. solve(1,snt,1,Q);
  116. for(int i=1;i<=Q;i++) cout<<ANS[i]<<endl;
  117. return 0;
  118. }

  

●洛谷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] 整体二分

    正解:整体二分+树状数组 解题报告: 传送门! 题目还是大概解释下?虽然其实是看得懂的来着,,, 大概就是说给一棵树.给定一些询问,每个询问都是说在两个点之间的路径上的子路径的第k大是什么 然后看到这 ...

  4. 洛谷P3242 接水果

    关于矩形与点其实有两种关系. 一种是每个矩形包含多少点.一种是每个点被多少矩形包含. 解:因为可以离线所以直接套整体二分.关键是考虑如何能够被覆盖. 我一开始都是想的树上操作...其实是转化成DFS序 ...

  5. [洛谷 P3239] [HNOI2015]亚瑟王

    [HNOI2015]亚瑟王 题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知, ...

  6. 洛谷 P3241 [HNOI2015]开店 解题报告

    P3241 [HNOI2015]开店 题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱. 这样的想法当然非 ...

  7. 洛谷P3244 [HNOI2015]落忆枫音

    #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #in ...

  8. luogu P3242 [HNOI2015]接水果

    传送门 其实这题难点在于处理路径包含关系 先求出树的dfn序,现在假设路径\(xy\)包含\(uv(dfn_x<dfn_y,dfn_u<dfn_v)\) 如果\(lca(u,v)!=u\) ...

  9. 洛谷P3243 [HNOI2015]菜肴制作 拓扑排序+贪心

    正解:拓扑排序 解题报告: 传送门! 首先看到它这个约束就应该要想到拓扑排序辣QwQ 首先想到的应该是用优先队列代替队列,按照节点编号排序 然后也很容易被hack:<5,1> 正解应为5, ...

随机推荐

  1. beta冲刺5-咸鱼

    昨天的问题: 登陆页面的整合重新制作 各主机版本更迭 我的社团显示功能修改调整 主页的头部替换掉 +修复帖子无法显示内容的问题 +试着将邮箱等判定用正则表达式进行实时判定. 今天的完成: 主要是线下进 ...

  2. Beta No.1

    一.今日任务 重新熟悉整体项目 对整个项目在未来的beta冲刺中进程有一个合理的规划 由于我们送出的是一个负责前端的成员,引入的也是一个负责前端工作的女生,(女生做起美工比起男生更加得心应手吧)所以我 ...

  3. Beta版本敏捷冲刺每日报告——Day2

    1.情况简述 Beta阶段第二次Scrum Meeting 敏捷开发起止时间 2017.11.3 08:00 -- 2017.11.3 22:00 讨论时间地点 2017.11.3晚9:00,软工所实 ...

  4. Basic FIFO Queue

    Queue - 一种线程安全的FIFO实现 Python的Queue模块提供一种适用于多线程编程的FIFO实现.它可用于在生产者(producer)和消费者(consumer)之间线程安全(threa ...

  5. Eclipse常用快捷键总结

    Eclipse常用快捷键总结 CTRL+C(复制).CTRL+X(剪切).CTRL+Z(撤销).CTRL+F(查找).CTRL+H(搜索文件或字符串).CTRL+Y(重做).CTRL+/(双斜杠注释) ...

  6. 儿童节,我们从零开始——Python入门资源推荐

    原创 2017-06-01 玄魂工作室 玄魂工作室 今天是六一儿童节,首先祝所有的小朋友身体健康,能永远生活在一个没有战争,没有压迫的世界里,永远快乐. 上一篇文章,很多人都对Python的各种书籍感 ...

  7. 2017年Unity游戏开发视频教程(入门到精通)

    本文是我发布的一个Unity游戏开发的学习目录,以后我会持续发布一系列的游戏开发教程,都会更新在这个页面上,适合人群有下面的几种: 想要做独立游戏的人 想要找游戏开发相关工作的人 对游戏开发感兴趣的人 ...

  8. Python入门之Python在Win10环境下的配置(图文教程)

    请在Python官网下载Python2.7和Python3.6安装包,虽然最新的是3.6版本,但是建议两个包都安装,方便后期在IDE工具切换. Python官网:https://www.python. ...

  9. 最小二乘法多项式拟合的Java实现

    背景 由项目中需要根据一些已有数据学习出一个y=ax+b的一元二项式,给定了x,y的一些样本数据,通过梯度下降或最小二乘法做多项式拟合得到a.b,解决该问题时,首先想到的是通过spark mllib去 ...

  10. 彻底弄懂JS的事件冒泡和事件捕获

      先上结论:在事件执行流中有两种执行方式.一种是事件冒泡(即事件的执行顺序是从下往上执行的) ;  另一种是捕获(即事件的执行顺序是从上往下执行的); 阻止事件冒泡:   return false; ...