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

启发式合并主席树

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; #define N 80001 int n,testcase,m,T;
int val[N];
int front[N],to[N<<],nxt[N<<],tot; int has[N],all; int fa[N][],dep[N],lim; int F[N],siz[N]; int id,root[N]; struct node
{
int lc,rc,cnt;
}tr[N*]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void add(int u,int v)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;
} int find(int i) { return F[i]==i ? i : F[i]=find(F[i]); } void unionn(int u,int v)
{
u=find(u); v=find(v);
siz[u]+=siz[v];
F[v]=u;
} void init()
{
read(testcase);
read(n); read(m); read(T);
lim=log(n)/log();
for(int i=;i<=n;++i)
{
read(val[i]);
F[i]=i;
siz[i]=;
}
int u,v;
for(int i=;i<=m;++i)
{
read(u); read(v);
add(u,v);
unionn(u,v);
}
}
void insert(int &x,int y,int l,int r,int pos)
{
if(!x) x=++id;
tr[x].cnt=tr[y].cnt+;
if(l==r) return;
int mid=l+r>>;
if(pos<=mid)
{
tr[x].rc=tr[y].rc;
insert(tr[x].lc,tr[y].lc,l,mid,pos);
}
else
{
tr[x].lc=tr[y].lc;
insert(tr[x].rc,tr[y].rc,mid+,r,pos);
}
} int query(int u,int v,int lca,int flca,int l,int r,int k)
{
if(l==r) return l;
int mid=l+r>>,tmp=tr[tr[u].lc].cnt+tr[tr[v].lc].cnt-tr[tr[lca].lc].cnt-tr[tr[flca].lc].cnt;
if(k<=tmp) return query(tr[u].lc,tr[v].lc,tr[lca].lc,tr[flca].lc,l,mid,k);
return query(tr[u].rc,tr[v].rc,tr[lca].rc,tr[flca].rc,mid+,r,k-tmp);
} void discrete()
{
for(int i=;i<=n;++i) has[i]=val[i];
sort(has+,has+n+);
all=unique(has+,has+n+)-has-;
for(int i=;i<=n;++i) val[i]=lower_bound(has+,has+all+,val[i])-has;
} void dfs(int x)
{
dep[x]=dep[fa[x][]]+;
insert(root[x],root[fa[x][]],,all,val[x]);
for(int i=;i<=lim;++i) fa[x][i]=fa[fa[x][i-]][i-];
for(int i=front[x];i;i=nxt[i])
if(to[i]!=fa[x][])
{
fa[to[i]][]=x;
dfs(to[i]);
}
} int get_lca(int u,int v)
{
if(dep[u]<dep[v]) swap(u,v);
int x=dep[u]-dep[v];
for(int i=lim;i>=;--i)
if(x&(<<i)) u=fa[u][i];
if(u==v) return u;
for(int i=lim;i>=;--i)
if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
return fa[u][];
} void solve()
{
for(int i=;i<=n;++i)
if(!fa[i][]) dfs(i);
char ch[];
int u,v,k,last=;
int lca,fu,fv;
while(T--)
{
scanf("%s",ch);
if(ch[]=='Q')
{
read(u); read(v); read(k);
u^=last; v^=last; k^=last;
lca=get_lca(u,v);
last=has[query(root[u],root[v],root[lca],root[fa[lca][]],,all,k)];
printf("%d\n",last);
}
else
{
read(u); read(v);
u^=last; v^=last;
fu=find(u); fv=find(v);
if(siz[fu]<siz[fv]) swap(fu,fv);
unionn(u,v);
add(u,v);
fa[v][]=u;
dfs(v);
}
}
} int main()
{
init();
discrete();
solve();
}

bzoj千题计划258:bzoj3123: [Sdoi2013]森林的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划267:bzoj3129: [Sdoi2013]方程

    http://www.lydsy.com/JudgeOnline/problem.php?id=3129 如果没有Ai的限制,就是隔板法,C(m-1,n-1) >=Ai 的限制:m减去Ai &l ...

  3. bzoj千题计划134:bzoj3124: [Sdoi2013]直径

    http://www.lydsy.com/JudgeOnline/problem.php?id=3124 第一问: dfs1.dfs2 dfs2中记录dis[i]表示点i距离最长链左端点的距离 第二问 ...

  4. bzoj千题计划133:bzoj3130: [Sdoi2013]费用流

    http://www.lydsy.com/JudgeOnline/problem.php?id=3130 第一问就是个最大流 第二问: Bob希望总费用尽量大,那肯定是把所有的花费加到流量最大的那一条 ...

  5. bzoj千题计划268:bzoj3131: [Sdoi2013]淘金

    http://www.lydsy.com/JudgeOnline/problem.php?id=3131 如果已知 s[i]=j 表示有j个<=n数的数码乘积=i 那么就会有 s[a1]*s[a ...

  6. bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器

    http://www.lydsy.com/JudgeOnline/problem.php?id=3122 等比数列求和公式+BSGS #include<map> #include<c ...

  7. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  8. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  9. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

随机推荐

  1. Jmeter(八)-发送JDBC请求

    下午花了两个小时研究了一下Jmeter发送JDBC请求,现在把基本操作流程分享一下. 做JDBC请求,首先需要两个jar包:mysql驱动-mysql-connector-java-5.1.13-bi ...

  2. Gulp:插件编写入门

    之前挖了个坑,准备写篇gulp插件编写入门的科普文,之后迟迟没有动笔,因为不知道该肿么讲清楚Stream这货,毕竟,gulp插件的实现不像grunt插件的实现那么直观. 好吧,于是决定单刀直入了.文中 ...

  3. ANSYS渡槽槽身动水压力的施加(1)——矩形渡槽

    前言 依据水工抗震规范中关于渡槽动水压力的部分编一个用于ANSYS渡槽模型动水压力施加的命令流,是我研究生时一直想要做的一件事,原因嘛主要是想对比一下规范提供的方法和ANSYS声学流体单元模拟水体这两 ...

  4. WebShell代码分析溯源(第1题)

    <?php $POST['POST']='assert';$array[]=$POST;$array[0]['POST']($_POST['assert']);?> assert,是php ...

  5. PHP学习 类型 变量 常数 运算符

    PHP支持下列8种类型 标量类型 scalar type整数 integer浮点数 float double布尔 boolean字符串 string 特殊类型 special typeNULL资源 r ...

  6. Mac OS系统四种修改Hosts文件的方法列举

    转自:https://blog.csdn.net/u012460084/article/details/40186973 使用Mac OS X系统的用户,在某些时候可能遇到了需要修改系统Hosts文件 ...

  7. PAT甲题题解-1022. Digital Library (30)-map映射+vector

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789235.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  8. 20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

    Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 ...

  9. 20135337朱荟潼 Linux第二周学习总结——操作系统是如何工作的

    一.计算机是如何工作的--总结 三个法宝 存储程序计算机.函数调用堆栈.中断机制 二.堆栈 1.是c语言程序运行时必须的一个记录调用路径和参数的空间. 函数调用框架.传递参数.保存返回地址.提供局部变 ...

  10. Beta冲刺——day2

    Beta冲刺--day2 作业链接 Beta冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602134 王龙 ...