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. 能帮我们学习吉他的音乐软件——Guitar Pro

    Guitar Pro是一款十分好用的吉他软件,也是目前广大音乐爱好者最喜欢的多音轨的音谱编辑软件.支持MIDI.MusicXML.PTB.GTP等多种格式文件的导入/导出. Guitar Pro 7. ...

  2. Jmeter(十九)_ForEach控制器实现网页爬虫

    一直以来,爬虫似乎都是写代码去实现的,今天像大家介绍一下Jmeter如何实现一个网页爬虫! 龙渊阁测试开发家园 317765580 Jmeter的爬虫原理其实很简单,就是对网页提交一个请求,然后把返回 ...

  3. Kaggle入门(一)——Digit Recognizer

    目录 0 前言 1 简介 2 数据准备 2.1 导入数据 2.2 检查空值 2.3 正则化 Normalization 2.4 更改数据维度 Reshape 2.5 标签编码 2.6 分割交叉验证集 ...

  4. EOS 权限管理之-权限的使用

    首先,跟大家说声抱歉,由于之前一直在准备EOS上线的一些工作,所以,很长时间没有更新内容.今天正好有时间,也想到了一些题材,就来说一下这个话题.本文完全是个人见解,如有不当之处,欢迎指出. 前提回顾: ...

  5. nil Nil NULL NSNull 之间的区别

    nil -> Null-pointer to objective- c objectNIL -> Null-pointer to objective- c class  表示对类进行赋空值 ...

  6. Window环境下RabbitMQ 添加用户、设置角色和权限

    基本上新增用户.角色和权限的方法都一样,大概如下: REM 添加一个帐号 密码 rabbitmqctl.bat add_user zhangfujun zhangfujun123 REM 添加角色 r ...

  7. Bean的加载

    ClassPathXmlApplicationContext存储内容 为了更理解ApplicationContext,拿一个实例ClassPathXmlApplicationContext举例,看一下 ...

  8. [转帖] 大神 Linus Torvalds 语录

    My name is Linus Torvalds and I am your god.我的名字是Linus Torvalds,我是你们的上帝.(在1998 Linux大会上的自我介绍) If you ...

  9. Python的文件读写

    目录 读文件 操作文件 读取内容 面试题的例子 写文件 操作模式 指针操作 字符编码 读文件 操作文件 打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的): 文件使用完毕后必 ...

  10. developer roadmap

    developer roadmap https://balsamiq.com/ https://balsamiq.com/givingback/free/ https://balsamiq.cloud ...