当前位置: 首页 > news >正文

永无乡

神秘永无乡。
很典的平衡树题。
写的时候一堆细节。
对于每个连通块维护一个平衡树,然后暴力启发式合并。写的数组版本的,所以合并那里写了一个直接插入节点的,省空间,时间复杂度是一样的。最开始合并的时候想用改根来直接判断对应树,发现平衡树换根就炸了,加了个并查集。一开始写的dfs遍历合并,好像会T,改成了用一个栈。算是第一次成功应用平衡树吧。

#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define e_b emplace_back
#define p_b push_back
#define fir first
#define sec second
#define IOS ios::sync_with_stdio(0),cin.tie(0)
using namespace std;
const int N=1e5+5;
int n,m,q;
struct node{int sz,cnt,fa,ch[2],val,id;node(){sz=cnt=id=val=fa=ch[0]=ch[1]=0;}};
node t[N<<1];int tot;
struct Splay{int rt;Splay(){rt=0;}int add(int k,int fa,int id){t[++tot].cnt=1;t[tot].sz=1,t[tot].val=k,t[tot].fa=fa,t[tot].id=id;return tot;}void clear(int p){t[p].sz=t[p].cnt=1,t[p].fa=t[p].ch[0]=t[p].ch[1]=0;}void upd(int p){t[p].sz=t[t[p].ch[0]].sz+t[t[p].ch[1]].sz+t[p].cnt;}void rotate(int p){int f=t[p].fa,ff=t[f].fa;int k=(p==t[f].ch[1]),k1=(f==t[ff].ch[1]),s=t[p].ch[k^1];t[f].ch[k]=s;if(s)t[s].fa=f;t[p].ch[k^1]=f,t[f].fa=p;if(ff)t[ff].ch[k1]=p;t[p].fa=ff;if(!ff)rt=p;upd(f),upd(p);}void splay(int p,int g){while(t[p].fa!=g){int f=t[p].fa,ff=t[f].fa;if(ff!=g&&ff)(p==t[f].ch[1])^(f==t[ff].ch[1])?rotate(p):rotate(f);rotate(p);}if(!g)rt=p;}int find(int k){int now=rt,re=0;while(1){if(k>=t[now].val){re+=t[t[now].ch[0]].sz;if(k==t[now].val){splay(now,0);return re+1;}re+=t[now].cnt,now=t[now].ch[1];}else now=t[now].ch[0];if(!now)return re+1;}return re;}void insert(int k,int id){if(!rt){rt=add(k,0,id);return;}int now=rt,fa=0;while(1){if(t[now].val==k){t[now].cnt++,t[now].sz++;if(fa)upd(fa);splay(now,0);return;}fa=now,now=t[now].ch[k>t[now].val];if(!now){now=add(k,fa,id),t[fa].ch[k>t[fa].val]=now;upd(fa),splay(now,0);return;}}}void ins_node(int p){if(!rt){rt=p;return;}int now=rt,fa=0,k=t[p].val;clear(p);while(1){if(t[now].val==k){t[now].cnt++,t[now].sz++;if(fa)upd(fa);splay(now,0);return;}fa=now,now=t[now].ch[k>t[now].val];if(!now){t[fa].ch[k>t[fa].val]=p,t[p].fa=fa;upd(fa),splay(p,0);return;}}}int prev(){int now=t[rt].ch[0];while(t[now].ch[1])now=t[now].ch[1];return now;}void del(int k){find(k);int p=rt;if(!t[rt].ch[0]&&!t[rt].ch[1])rt=0,clear(p);else if(!t[rt].ch[0])rt=t[rt].ch[1],clear(p);else if(!t[rt].ch[1])rt=t[rt].ch[0],clear(p);else{int pr=prev();splay(pr,0);int s=t[p].ch[1];t[pr].ch[1]=s;if(s)t[s].fa=pr;clear(p);}}int kth(int k){int now=rt;if(t[rt].sz<k)return -1;while(k&&now){int lsz=t[t[now].ch[0]].sz,cnt=t[now].cnt;if(k<=lsz)now=t[now].ch[0];else if(k>lsz+cnt)k-=lsz+cnt,now=t[now].ch[1];else return t[now].id;}return -1;}
}T[N];
struct DSU{int fa[N],sz[N],s[N],tp,tot;void init(){for(int i=1;i<=n;i++)fa[i]=i,sz[i]=1;}int fd(int x){return fa[x]=((fa[x]^x)?fd(fa[x]):x);}void mg(int a,int b){a=fd(a),b=fd(b);if(a==b)return;if(sz[a]<sz[b])swap(a,b);sz[a]+=sz[b],fa[b]=a;tot=1,tp=1,s[1]=T[b].rt;while(tp<=tot){int x=s[tp++];if(t[x].ch[0])s[++tot]=t[x].ch[0];if(t[x].ch[1])s[++tot]=t[x].ch[1];T[a].ins_node(x);}}
}D;
signed main(){IOS;cin>>n>>m;D.init();for(int i=1,x;i<=n;i++){cin>>x;T[i].insert(x,i);}while(m--){int x,y;cin>>x>>y;D.mg(x,y);}cin>>q;while(q--){char op;int x,y;cin>>op>>x>>y;if(op=='B')D.mg(x,y);else cout<<T[D.fd(x)].kth(y)<<'\n';}
}
http://www.jsqmd.com/news/379478/

相关文章:

  • 2026广东最新紫晶洞厂家top5推荐!广州等地优天然水晶源头供应商权威榜单,品类全货源稳,助力客商高效采购 - 品牌推荐2026
  • 信息系统仿真:信息系统基础理论_(10).仿真结果的验证与校验
  • 假期作业
  • 1950-2024年中国与各大国之间的关系数据
  • P5521 梅深不见冬
  • 2010.1-2026.1中国城市二手房房价历史数据
  • 2026广东最新结婚五金/黄金厂商首选推荐水贝黄金广州总店:广州优选,这家品牌授权店以高性价比与专业服务脱颖而出 - 品牌推荐2026
  • MySQL慢查询优化:定位、分析与优化实战
  • P9446 [ICPC 2021 WF] Prehistoric Programs
  • 别再注册Gmail了!谷歌邮箱这个隐藏功能,让你一个账号当1000个小号用(附保姆级小白教程)
  • 细胞群体动力学仿真软件:CompuCell3D_(6).模拟参数配置与优化
  • Markdown 转 Word 和 PDF:Python 简单实现指南
  • 细胞群体动力学仿真软件:CompuCell3D_(7).细胞间相互作用模型
  • P3381 【模板】最小费用最大流
  • 细胞群体动力学仿真软件:CompuCell3D_(2).细胞建模基础理论
  • P14254 分割(divide)
  • P9358 [ICPC 2022 Xian R] Bridge
  • 2026年可查实盘配资平台推荐:合规透明安全 - 资讯焦点
  • Spring Cloud 熔断降级实战:Sentinel 熔断策略与规则持久化
  • blender导出fbx没有贴图问题
  • 2026年广州家具搬运公司评测推荐榜单:告别搬家烦恼的实用指南 - 品牌推荐
  • 2026年耐介质腐蚀防护布TOP10厂商推荐榜 - 资讯焦点
  • 临沂有实力的橡胶木板材公司推荐 - 品牌推荐(官方)
  • 2026年度成熟GEO服务公司TOP7综合实力榜:AI搜索时代企业增长与选型深度指南 - 资讯焦点
  • 临沂诚信的橡胶木板材生产厂家哪家好 - 品牌推荐(官方)
  • ContextMenuManager 配置右键运行 python 脚本实现一键克隆仓库 - Higurashi
  • 2026年广州家电搬运公司评测推荐榜单:告别搬运烦恼,轻松开启新生活 - 品牌推荐
  • 2026年广州汉米尔顿手表维修评测推荐:非官方维修点选择指南与网点服务深度分析 - 品牌推荐
  • 2026年广州家电搬运公司推荐评测:告别搬运烦恼,专业团队如何选择? - 品牌推荐
  • 手把手部署mysql_exporter:打通MySQL与Prometheus监控链路