->题目链接

题解:

  1. #include<queue>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #define MAXN 160001
  7. #define D 15
  8. using namespace std;
  9. char ch[];
  10. int t,x,y,z;
  11. int n,m,qq,tot,cut,ans,father[MAXN],dis[MAXN];
  12. int head[MAXN],size[MAXN],deep[MAXN],root[MAXN],s[MAXN],fa[MAXN][D+];
  13. struct edge {
  14. int v,next;
  15. } e[MAXN*];
  16. struct data {
  17. int lc,rc,size;
  18. } tree[MAXN*];
  19. struct node {
  20. int x,o;
  21. } a[MAXN];
  22. void add(int u,int v) {
  23. e[++cut].v=v;
  24. e[cut].next=head[u];
  25. head[u]=cut;
  26. }
  27. bool cmp(const node &x,const node &y) {
  28. if(x.x==y.x) return x.o<y.o;
  29. return x.x<y.x;
  30. }
  31. int find(int x) {
  32. return x!=father[x]?father[x]=find(father[x]):x;
  33. }
  34. void change(int &k,int last,int l,int r,int x) {
  35. k=++tot;
  36. tree[k].lc=tree[last].lc,tree[k].rc=tree[last].rc;
  37. tree[k].size=tree[last].size+;
  38. if(l==r) return ;
  39. int mid=(l+r)>>;
  40. if(x<=mid) change(tree[k].lc,tree[last].lc,l,mid,x);
  41. else change(tree[k].rc,tree[last].rc,mid+,r,x);
  42. return ;
  43. }
  44. int query(int L,int R,int lc,int falc,int l,int r,int k) {
  45. if(l==r) return l;
  46. int sum=tree[tree[R].lc].size+tree[tree[L].lc].size-
  47. tree[tree[lc].lc].size-tree[tree[falc].lc].size;
  48. int mid=l+r>>;
  49. if(sum>=k)
  50. return query(tree[L].lc,tree[R].lc,tree[lc].lc,tree[falc].lc,l,mid,k);
  51. else return
  52. query(tree[L].rc,tree[R].rc,tree[lc].rc,tree[falc].rc,mid+,r,k-sum);
  53. }
  54. void dfs1(int u,int f) {
  55. size[u]=;
  56. fa[u][]=f;
  57. int p=lower_bound(s+,s+n+,a[u].x)-s;
  58. change(root[u],root[f],,n,p);
  59. for(int i=head[u]; i; i=e[i].next) {
  60. int v=e[i].v;
  61. if(v!=f) deep[v]=deep[u]+,dfs1(v,u),size[u]+=size[v];
  62. }
  63. return ;
  64. }
  65. void get_father() {
  66. for(int j=; j<=D; j++)
  67. for(int i=; i<=n; i++)
  68. fa[i][j]=fa[fa[i][j-]][j-];
  69. return ;
  70. }
  71. int get_same(int u,int x) {
  72. for(int i=; i<=D; i++)
  73. if(x&(<<i)) u=fa[u][i];
  74. return u;
  75. }
  76. int lca(int x,int y) {
  77. if(deep[x]<deep[y]) swap(x,y);
  78. x=get_same(x,deep[x]-deep[y]);
  79. if(x==y) return x;
  80. for(int i=D; i>=; i--)
  81. if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
  82. return fa[x][];
  83. }
  84. void slovequery(int x,int y,int k) {
  85. int lc=lca(x,y);
  86. ans=query(root[x],root[y],root[lc],root[fa[lc][]],,n,k);
  87. ans=s[ans];
  88. printf("%d\n",ans);
  89. return ;
  90. }
  91. void slove(int u,int f) {
  92. fa[u][]=f;
  93. deep[u]=deep[f]+;
  94. int p=lower_bound(s+,s+n+,a[u].x)-s;
  95. change(root[u],root[f],,n,p);
  96. for(int i=; i<=D; i++) fa[u][i]=fa[fa[u][i-]][i-];
  97. for(int i=head[u]; i; i=e[i].next) {
  98. int v=e[i].v;
  99. if(v!=f) slove(v,u);
  100. }
  101. return ;
  102. }
  103. void union_(int x,int y) {
  104. int l1=find(x),l2=find(y);
  105. if(size[l1]>size[l2]) swap(l1,l2),swap(x,y);
  106. add(x,y),add(y,x);
  107. father[l1]=l2,size[l1]+=size[l2];
  108. slove(x,y);
  109. return ;
  110. }
  111. int main() {
  112. cin>>t>>n;
  113. cin>>m>>qq;
  114. for(int i=; i<=n; i++)
  115. father[i]=i,cin>>a[i].x,a[i].o=i,s[i]=a[i].x;
  116. sort(s+,s+n+);
  117. for(int i=; i<=m; i++) {
  118. cin>>x>>y,add(x,y),add(y,x);
  119. int l1=find(x),l2=find(y);
  120. father[l2]=l1;
  121. }
  122. for(int i=; i<=n; i++) if(!fa[i][]) dfs1(i,);
  123. get_father();
  124. while(qq--) {
  125. scanf("%s",ch);
  126. if(ch[]=='Q') {
  127. cin>>x>>y>>z;
  128. x^=ans,y^=ans,z^=ans;
  129. slovequery(x,y,z);
  130. } else {
  131. cin>>x>>y;
  132. x^=ans,y^=ans;
  133. union_(x,y);
  134. }
  135. }
  136. return ;
  137. }

一世安宁

洛谷 P3302 [SDOI2013]森林的更多相关文章

  1. 洛谷 P3302 [SDOI2013]森林 解题报告

    P3302 [SDOI2013]森林 题目描述 小\(Z\)有一片森林,含有\(N\)个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有\(M\)条边. 小Z希望执行\(T\)个操作,操 ...

  2. 洛谷 P3302 [SDOI2013]森林 Lebal:主席树 + 启发式合并 + LCA

    题目描述 小Z有一片森林,含有N个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有M条边. 小Z希望执行T个操作,操作有两类: Q x y k查询点x到点y路径上所有的权值中,第k小的权 ...

  3. [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)

    传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接 ...

  4. P3302 [SDOI2013]森林(主席树+启发式合并)

    P3302 [SDOI2013]森林 主席树+启发式合并 (我以前的主席树板子是错的.......坑了我老久TAT) 第k小问题显然是主席树. 我们对每个点维护一棵包含其子树所有节点的主席树 询问(x ...

  5. [洛谷P3304] [SDOI2013]直径

    洛谷题目链接:[SDOI2013]直径 题目描述 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅 ...

  6. Bzoj3197/洛谷3296 [SDOI2013]刺客信条assassin(树的重心+树Hash+树形DP+KM)

    题面 Bzoj 洛谷 题解 (除了代码均摘自喻队的博客,可是他退役了) 首先固定一棵树,枚举另一棵树,显然另一棵树只有与这棵树同构才有可能产生贡献 如果固定的树以重心为根,那么另一棵树最多就只有重心为 ...

  7. 洛谷$P3302$ 森林 $[SDOI2013]$ 主席树

    正解:主席树 解题报告: 传送门! 口胡一时爽代码火葬场 这题想法不难,,,但显然的是代码应该还挺难打的 但反正我也不放代码,就写下题解趴$QwQ$ 第一问就是个$Count\ on\ a\ tree ...

  8. 洛谷P3302 森林

    题意:给定森林,可以把两棵树连起来或者询问链上第k大. 解:启发式合并. 我一开始想到了启发式合并但是发现这样做之后一棵子树就不是一段连续的区间了,那就不能子树xxx了,很迷惘. 后来看了题解发现本来 ...

  9. 洛谷 P3299 [SDOI2013]保护出题人 解题报告

    P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...

随机推荐

  1. flume使用场景 flume与kafka的比较

    Is Flume a good fit for your problem? If you need to ingest textual log data into Hadoop/HDFS then F ...

  2. nginx 配置 非80 的其他 端口

    如果nginx的监听端口不是默认的80端口,改为其他非80端口后,后端服务tomcat中的request.getServerPort()方法无法获得正确的端口号,仍然返回到80端口.在response ...

  3. 简单的分页小demo

    public class Demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Sy ...

  4. [经典bug]弹框关闭按钮点击后程序闪退

    问题背景: 业务上遇到一个很诡异的问题:弹框界面上有一个关闭按钮,切换后台再返回后,点击关闭按钮,部分机型上会直接崩溃.点击手机返回键关闭界面则正常. 问题原因: 点击关闭按钮的操作属于UI线程,直接 ...

  5. Git删除文件

    Git基础 Git有三大区(工作区.暂存区.版本库),文件有三个状态(untracked.unstaged.uncommited). (1)打开项目文件夹,除了隐藏的.git文件夹,其他项目文件位于的 ...

  6. Problem4-Project Euler

    Largest palindrome product   A palindromic number reads the same both ways. The largest palindrome m ...

  7. MySQL常用查询语句积累

    >>MySQL某列插入递增值 SET @i := 100; UPDATE auge_item_classification SET c_code=(@i:=(@i+1)); >> ...

  8. 实现CTreeCtrl父子节点的联动选择

    本文实现了下面的功能: 当选中父节点时, 其所有子节点全部选中. 当取消选中父节点时, 其所以子节点全部取消选中. 点击子节点时, 根据子节点与其兄弟节点的选中状态, 自动设置父节点的选中状态. 通过 ...

  9. apk静态注射[转]-未实践

    原文:http://free0coding.iteye.com/blog/1684263 1.将需要注入的代码块打包成jar1,释放一个公共类的静态方法a  2.反编译apk得到smali文件,在适当 ...

  10. 用ASP.NET Web API技术开发HTTP接口

    开发工具 Visual Studio 2013 SQL Server 2008 R2 准备工作 启动Visual Studio 2013,新建一个ASP.NET Web应用程序,命名为SimpleAP ...