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. Webpack学习-Webpack初识

    一.前言 webpack 到底是个什么东西呢,看了一大堆的文档,没一个能看懂的,因为上来就是给个module.exports 然后列一大堆配置,这个干啥,那个干啥,没一点用.但凡要用一个东西,一个东西 ...

  2. JavaScript快速入门-ECMAScript函数

    JavaScript函数(定义.参数.返回值.闭包.匿名函数) 一.函数定义 function functionName(arg0, arg1, ... argN) { statements } 函数 ...

  3. 设计模式 笔记 观察者模式 Observer

    //---------------------------15/04/27---------------------------- //Observer 观察者模式----对象行为型模式 /* 1:意 ...

  4. STM8S——8位基本定时器(TIM4)

    简介:该定时器由一个带可编程预分频器的8位自动重载的向上计数器所组成,它可以用来作为时基发生器,具有溢出中断功能. 主要功能: (1)8位向上计数的自动重载计数器: (2)3位可编程的预分配器(可在运 ...

  5. 小程序swiper组件高度自适应【转载】

    最近在做小程序开发,复制官方文档上的swiper组件实测后发现,图片不能自适应.网上找了几个版本测试都发现存在一些小问题,目前这个版本本人实测是最好用的.记录一下,方便日后使用. 感谢原创大神的帮助, ...

  6. 三丰云使用记录--部署iis服务器

     写在前面的话:看在我这么热心写使用推广记录,麻烦延长下使用天数,谢谢 官网地址:https://www.sanfengyun.com 三丰云是北京太极三丰云计算有限公司旗下网络服务品牌,十八年IDC ...

  7. hyperledger-fabirc1.2-ca-server的生产示例

    hyperledger-fabirc1.2-ca-server的生产示例,带TLS 在fabirc-samples/first-network中启动网络,其ca证书是利用crypto的工具生成的,但是 ...

  8. java BigDecimal实现精确加减乘除运算

    java.math.BigDecimal.BigDecimal一共有4个够造方法,让我先来看看其中的两种用法: 第一种:BigDecimal(double val)Translates a doubl ...

  9. dubbo底层之Netty

    背景 Java线程:由开始的单线程,到通过new Thread()创建的多线程,再到现如今的线程池,Java多线程编程的效率和性能有了很大的提升 Reactor模型:基于事件驱动,适合处理海量I/O事 ...

  10. 20135234mqy-——信息安全系统设计基础第十四周学习总结

    第九章 虚拟存储器 主要作用: 将主存看作是一个存储在磁盘上的地址空间的高速缓存,在主存中只保护活动的区域,并根据需要在磁盘和主存之间来回传送数据: 为每个进程提供了一致的地址空间,从而简化了存储器管 ...