http://www.lydsy.com/JudgeOnline/problem.php?id=3123

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

树上主席树操作方法看:http://www.cnblogs.com/luyouqi233/p/8159528.html

(BZOJ2588:Count on a tree)

这题要动态树,显然不可能LCT套主席树啊。

那我们完全可以启发式合并一下主席树。

剩下的操作就很简单了。

(然而我debug两个小时才发现我n定义了两个emmmm)

#include<cstdio>
#include<cmath>
#include<cstring>
#include<cctype>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=8e4+10;
inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
struct tree{int l,r,sum;
}tr[N*500];
struct node{int to,nxt;
}edge[N*2];
int a[N],b[N],rt[N],pool,n,m;
int dep[N],anc[N][20],son[N];
int cnt,head[N],fa[N],vis[N],tot;
inline void add(int u,int v){edge[++cnt].to=v;edge[cnt].nxt=head[u];head[u]=cnt;
}
inline void insert(int y,int &x,int l,int r,int p){tr[x=++pool]=tr[y];tr[x].sum++;if(l==r)return;int mid=(l+r)>>1;if(p<=mid)insert(tr[y].l,tr[x].l,l,mid,p);else insert(tr[y].r,tr[x].r,mid+1,r,p);
}
inline int query(int nl,int nr,int nm,int nfm,int l,int r,int k){if(l==r)return l;int delta=tr[tr[nl].l].sum+tr[tr[nr].l].sum-tr[tr[nm].l].sum-tr[tr[nfm].l].sum;int mid=(l+r)>>1;if(delta>=k)return query(tr[nl].l,tr[nr].l,tr[nm].l,tr[nfm].l,l,mid,k);else return query(tr[nl].r,tr[nr].r,tr[nm].r,tr[nfm].r,mid+1,r,k-delta);
}
inline void LSH(){sort(b+1,b+m+1);m=unique(b+1,b+m+1)-b-1;for(int i=1;i<=n;i++){a[i]=lower_bound(b+1,b+m+1,a[i])-b;}return;
}
inline int LCA(int i,int j){if(dep[i]<dep[j])swap(i,j);for(int k=16;k>=0;k--){if(dep[anc[i][k]]>=dep[j])i=anc[i][k];}if(i==j)return i;for(int k=16;k>=0;k--){if(anc[i][k]!=anc[j][k])i=anc[i][k],j=anc[j][k];}return anc[i][0];
}
int find(int x){if(fa[x]==x)return x;return fa[x]=find(fa[x]);
}
void dfs(int u,int f,int root){anc[u][0]=f;for(int k=1;k<=16;k++)anc[u][k]=anc[anc[u][k-1]][k-1];son[root]++;dep[u]=dep[f]+1;fa[u]=root;vis[u]=1;insert(rt[f],rt[u],1,m,a[u]);for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].to;if(v!=f)dfs(v,u,root);}return;
}
int main(){read();n=read();int e=read(),T=read(),last=0;for(int i=1;i<=n;i++)a[i]=b[++m]=read(),fa[i]=i;LSH();for(int i=1;i<=e;i++){int x=read(),y=read();add(x,y);add(y,x);}for(int i=1;i<=n;i++)if(!vis[i]){dfs(i,0,++tot);fa[tot]=tot;}for(int i=1;i<=T;i++){char ch=getchar();while(ch!='Q'&&ch!='L')ch=getchar();if(ch=='Q'){int x=read()^last,y=read()^last,k=read()^last;int t=LCA(x,y),ft=anc[t][0];printf("%d\n",last=b[query(rt[x],rt[y],rt[t],rt[ft],1,m,k)]);}else{int x=read()^last,y=read()^last;add(x,y);add(y,x);int u=find(x),v=find(y);if(son[u]<son[v]){swap(u,v);swap(x,y);}dfs(y,x,u);}}return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8510740.html

BZOJ3123:[SDOI2013]森林——题解相关推荐

  1. BZOJ3123: [Sdoi2013]森林

    BZOJ3123: [Sdoi2013]森林 Description 小Z有一片森林,含有N个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有M条边. 小Z希望执行T个操作,操作有两类: ...

  2. [bzoj3123][SDOI2013]森林

    3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 1654 Solved: 520 [Submit][Status] ...

  3. BZOJ3123[Sdoi2013]森林——主席树+LCA+启发式合并

    题目描述 输入 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20.  第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非 ...

  4. P3302 SDOI2013森林

    P3302 [SDOI2013]森林 题意: 一片森林,有n个节点,m个边,现在有t个操作, Q x y k:Q x y k 查询点 x 到点 y 路径上所有的权值中,第 ·k 小的权值是多少 L x ...

  5. 【BZOJ-3123】森林 主席树 + 启发式合并

    3123: [Sdoi2013]森林 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 2738  Solved: 806 [Submit][Statu ...

  6. [SDOI2013]森林(树上主席树+启发式合并+lca)

    链接:https://ac.nowcoder.com/acm/problem/20577 来源:牛客网 题目描述 小Z有一片森林,含有N个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有 ...

  7. BZOJ4573:[ZJOI2016]大森林——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4573 https://www.luogu.org/problemnew/show/P3348#sub ...

  8. 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并

    click here~:https://www.luogu.org/problem/P3302 emmm这个题是真的烦 一看题发现这题不是count on a tree的升级版么 如果一点思路没有的话 ...

  9. [NOI2014]魔法森林题解

    这道题正解其实是LCT,然而貌似SPFA也可以成功水过,所以根本不知道LCT的我只能说SPFA了. 这道题最大的限制是两种精灵就意味着一条道可能有两个权值,因此我们需要去将其中一个固定,然后再推另一个 ...

  10. BZOJ3197:[SDOI2013]刺客信条——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3197 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受 ...

最新文章

  1. 简单小练习_自动收集文件到文件夹
  2. 2020年高等数学方法与提高(上海理工大学)学习笔记:无穷级数
  3. 51单片机中使用ucos ii的优缺点(好文)
  4. airpods pro连接安卓声音小_苹果AirPods搭配安卓手机怎么样?那是相当好
  5. 设计一个序列信号发生器, 产生序列信号1011101. 用74LS161和4选1数据选择器74153及必要的门电路实现
  6. 学堂云3大学计算机基础答案,学堂云3答案查询公众号
  7. oracle backup exec,利用Backup Exec 2010进行异机恢复测试
  8. debian 5常用软件包名称,及安装方法
  9. Digester简介和使用
  10. Word-去掉标题前面的小黑点
  11. win10电脑双屏如何设置不同的桌面
  12. 实现京东商城地址选择效果(效果还挺一致的)
  13. ubuntu 22.04 搜狗输入法 的问题
  14. 为Termux安装图形化界面
  15. 计算机专业英语博士就业情况,北京外国语大学博士就业前景怎么样
  16. 基于CAD纵断面图生成地质体模型
  17. 致谢计算机组成原理老师的致谢,论文致谢优秀.doc
  18. no ip mroute-cache是什么意思
  19. Django框架之DRF框架
  20. doraemon的python 守护进程和Process

热门文章

  1. Atitit 设计模式之道 艾提拉著 sbb 目录 1. 一、设计模式的分类 1 1.1. 总体来说设计模式分为三大类: 1 1.2. 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建
  2. Atitit webservice之道 艾提拉著 目录 1. 基本说明Web Service 1 2. 基本概念与内部构成 2 2.1. Web services要使用两种技术: XML SOAP
  3. Atitit 文件上传功能的实现 图片 视频 目录 1. 上传原理 1 1.1. http post编码 multipart / form-data 1 1.2. 临时文件模式 最简单 2 1.3
  4. Atitit 各有所长原则 Thinker和Doer之争。 Doer Influencer relater thinker 目录 1. Doer Influencer relater thinke
  5. paip.提升用户体验------c++ Qt5 实现程序图标以及动态托盘闪烁图标
  6. paip.分成系统会员推广分销系统的设计
  7. Filezilla:建立远程与阿里云交互的FTP
  8. 金融业大整顿,是要回到十年前的水平吗?
  9. 黑岩集团创建者Larry Fink 超长访谈
  10. (转)以太坊(Ethereum ETH)是如何计算难度的