题目大意:给定一棵树和m<script type="math/tex" id="MathJax-Element-32">m</script>条路径,每条路径有一个权值,Q次询问,每次询问某条路经包含的所有路径中权值的第k小
原来精神污染那个题是这么做的啊QwQ
题解网上都有,我就直接贴代码了
没心情写题解了

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 40400
using namespace std;
struct Line{int type;int x,y1,y2,z;Line() {}Line(int _,int __,int ___,int ____,int _____):type(_),x(__),y1(___),y2(____),z(_____) {}bool operator < (const Line &l) const{if(x!=l.x)return x < l.x;return type > l.type;}
}lines[M<<2];
struct Query{int x,y,k,id;bool operator < (const Query &q) const{return x < q.x ;}
}queries[M];
struct abcd{int to,next;
}table[M<<1];
int head[M],_tot;
int n,m,q,tot;
int dpt[M],fa[M][16],st[M],ed[M];
int ans[M];
void Add(int x,int y)
{table[++_tot].to=y;table[_tot].next=head[x];head[x]=_tot;
}
void DFS(int x)
{static int T;int i;dpt[x]=dpt[fa[x][0]]+1;st[x]=++T;for(i=head[x];i;i=table[i].next)if(table[i].to!=fa[x][0]){fa[table[i].to][0]=x;DFS(table[i].to);}ed[x]=T;
}
int LCA(int x,int y)
{int j;if(dpt[x]<dpt[y])swap(x,y);for(j=15;~j;j--)if(dpt[fa[x][j]]>=dpt[y])x=fa[x][j];if(x==y) return x;for(j=15;~j;j--)if(fa[x][j]!=fa[y][j])x=fa[x][j],y=fa[y][j];return fa[x][0];
}
int Second_LCA(int x,int y)
{int j;for(j=15;~j;j--)if(dpt[fa[y][j]]>dpt[x])y=fa[y][j];return y;
}
void Insert_Rectangle(int x1,int x2,int y1,int y2,int z)
{lines[++tot]=Line(1,x1,y1,y2,z);lines[++tot]=Line(-1,x2+1,y1,y2,z);
}
struct Segtree{Segtree *ls,*rs;int cnt;void* operator new (size_t){static Segtree *mempool,*C;if(C==mempool)mempool=(C=new Segtree[1<<16])+(1<<16);C->ls=C->rs=0x0;C->cnt=0;return C++;}friend void Modify(Segtree *&p,int x,int y,int pos,int val){int mid=x+y>>1;if(!p) p=new Segtree;p->cnt+=val;if(x==y)return ;if(pos<=mid)Modify(p->ls,x,mid,pos,val);elseModify(p->rs,mid+1,y,pos,val);}friend int Get_Kth(Segtree *stack[],int top,int x,int y,int k){int i,mid=x+y>>1,cnt=0;if(x==y) return mid;for(i=1;i<=top;i++)cnt+=stack[i]&&stack[i]->ls?stack[i]->ls->cnt:0;if(k<=cnt){for(i=1;i<=top;i++)stack[i]=stack[i]?stack[i]->ls:0x0;return Get_Kth(stack,top,x,mid,k);}else{for(i=1;i<=top;i++)stack[i]=stack[i]?stack[i]->rs:0x0;return Get_Kth(stack,top,mid+1,y,k-cnt);}}
};
namespace BIT{Segtree *c[M];void Update(int x,int pos,int val){for(;x;x-=x&-x)Modify(c[x],0,1000000000,pos,val);}int Get_Kth(int x,int k){static Segtree *stack[M];int top;top=0;for(;x<=n;x+=x&-x)stack[++top]=c[x];return Get_Kth(stack,top,0,1000000000,k);}
}
int main()
{using namespace BIT;int i,j,x,y,z;cin>>n>>m>>q;for(i=1;i<n;i++){scanf("%d%d",&x,&y);Add(x,y);Add(y,x);}DFS(1);for(j=1;j<=15;j++)for(i=1;i<=n;i++)fa[i][j]=fa[fa[i][j-1]][j-1];for(i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);if(st[x]>st[y])swap(x,y);int lca=LCA(x,y);if(lca!=x)Insert_Rectangle(st[x],ed[x],st[y],ed[y],z);else{int temp=Second_LCA(x,y);if(st[temp]!=1)Insert_Rectangle(1,st[temp]-1,st[y],ed[y],z);if(ed[temp]!=n)Insert_Rectangle(st[y],ed[y],ed[temp]+1,n,z);}}sort(lines+1,lines+tot+1);for(i=1;i<=q;i++){scanf("%d%d%d",&x,&y,&z);if(st[x]>st[y])swap(x,y);queries[i].x=st[x];queries[i].y=st[y];queries[i].k=z;queries[i].id=i;}sort(queries+1,queries+q+1);for(j=1,i=1;i<=q;i++){for(;j<=tot&&lines[j].x<=queries[i].x;j++)Update(lines[j].y1-1,lines[j].z,-lines[j].type),Update(lines[j].y2,lines[j].z,lines[j].type);ans[queries[i].id]=Get_Kth(queries[i].y,queries[i].k);}for(i=1;i<=q;i++)printf("%d\n",ans[i]);return 0;
}

BZOJ 4009 HNOI2015 接水果 树套树相关推荐

  1. bzoj 4009: [HNOI2015]接水果 整体二分+k-d tree

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

  2. BZOJ 3262 cdq分治 OR 树套树

    注意判断 三个条件都一样的-- (CDQ分治 其实并不是很难理解 只是想不到--) CDQ分治: //By SiriusRen #include <cstdio> #include < ...

  3. bzoj 3110: [Zjoi2013]K大数查询(树套树)

    树套树: 本质:一棵树的每个节点套着另一棵树 通常时间复杂度:O(nlog²n) 空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²) 但事实 ...

  4. BZOJ3489 A simple rmq problem 【可持久化树套树】*

    BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...

  5. 【BZOJ3196】【Tyvj1730】二逼平衡树,第一次的树套树(线段树+splay)

    传送门1 传送门2 写在前面:创造迄今最长的正常代码的记录 思路:个人感觉这个树套树就是对线段树的每个区间建一棵splay来维护,最初觉得这个方法会爆T爆M--(实际上真的可能会爆).对于5个操作,我 ...

  6. 数据结构:树套树-替罪羊树套权值线段树

    BZOJ3065 本题是在BZOJ上的处女A,实在不应该拿这样一道题来开头 平衡树套线段树应该是树套树问题里比较难的一种了,当然我记得还有一个替罪羊树套Trie树的题,我是不信自己能写出来的. 外层的 ...

  7. 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)

    [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在 ...

  8. Uva 3767 Dynamic len(set(a[L:R])) 树套树

    Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/in ...

  9. 【Luogu】P3380树套树模板(线段树套Splay)

    题目链接 幸甚至哉,歌以咏志. 拿下了曾经是那么遥不可及的线段树,学会了曾经高不可攀的平衡树,弄懂了装B的时候才挂在嘴边的树套树. 每道模板都是链上的一颗珠子.把它们挨个串起来,就成为我成长的历程. ...

最新文章

  1. 32 多线程同步值Semaphore(信号量)
  2. HDU_oj_2050 折线分割平面
  3. apache用户名和密码验证
  4. 用反向传导做分子模拟:苯胺(C6H5NH2)和硝基苯(C6H5NO2)
  5. tensorflow2中如何设置GPU的使用
  6. Altium AD20中铺铜被导线分割的解决方法,如何正确覆铜整片区域
  7. 51nod-1093:骆驼和香蕉
  8. 一次跳槽经历(阿里/美团/头条/网易/有赞...)
  9. STM32F407控制舵机
  10. MS08067红队攻防班 第五期开班啦!(2021年最后一期)
  11. lending club 贷款逾期分析
  12. Uipath 安装Chrome插件
  13. linux0.11内存memory.c一些函数的简单的注释(一)
  14. su [user] 和 su - [user]的区别
  15. 使用 spacedesk 与 parsec 让安卓平板 或者电脑 作为电脑的拓展屏 的简单介绍
  16. 流程控制之python
  17. 中国高校计算机大赛网络技术挑战赛,2019年度“中国高校计算机大赛-网络技术挑战赛”国赛圆满落幕...
  18. Profibus网络故障诊断技术总结
  19. springboot+solr实现搜索引擎
  20. VLC-你不知道的那些功能-播客

热门文章

  1. HP Gen9系列 服务器健康监控灯报警,系统诊断无错
  2. 视频语音聊天系统的漏洞
  3. mac终端修改文件夹权限
  4. 马宁的Windows Mobile开发培训概述
  5. ceil 函数和 Floor 函数(C语言)
  6. 《C++初阶之路》命名空间的意义
  7. 绝美的山水:湖在天上 天在湖里
  8. 多所计算机强校入选,每个都是千万级别项目!国家重点研发计划“工业软件”重点专项...
  9. KBQA的主要流程及部分Top竞赛方案总结
  10. 互联网商业竞争中的“狼”与“羊”