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. Markdown基本使用方法

    最近开通了博客,看到网上好多推荐markdown的,而且博客园支持markdown,所以决定学习一下. 百度百科对markdown的介绍: Markdown是一种可以使用普通文本编辑器编写的标记语言, ...

  2. ngnix的基本安装及配置 centos7

    1.centos7  挂载ngnix的源 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7- ...

  3. 【转载】kafka 基础知识

    1.       kafka介绍 1.1.       主要功能 根据官网的介绍,ApacheKafka®是一个分布式流媒体平台,它主要有3种功能: 1:It lets you publish and ...

  4. web安全入门课程笔记——网站基础与信息搜集

    2-1 网站的基本概念 URL统一资源定位符 这是一个动态页面 ?ID 查询条件 后台数据库最有可能:ACCESS Web容器(web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而 ...

  5. bugkuct部分writeup 持续更新

    6307 校赛被打击到自闭,决心好好学习. web部分题目. 1.web2 地址 http://123.206.87.240:8002/web2/ 既然是第一个题我们应该采取查看源码的方式进行,右键之 ...

  6. PAT甲题题解-1119. Pre- and Post-order Traversals (30)-(根据前序、后序求中序)

    (先说一句,题目还不错,很值得动手思考并且去实现.) 题意:根据前序遍历和后序遍历建树,输出中序遍历序列,序列可能不唯一,输出其中一个即可. 已知前序遍历和后序遍历序列,是无法确定一棵二叉树的,原因在 ...

  7. java实验项目报告

            JAVA课程项目报告   题目:利用java实现一个时钟的小程序 姓名:王国梁 班级:计科13-2 学号:201303011200         利用JAVA实现一个时钟的小程序 1 ...

  8. UIView 添加闪烁的渐变光

    CGRect gradientRect=CGRectMake(- imageView3.bounds.size.width*, * imageView3.bounds.size.width, imag ...

  9. PAT 2016 数据的交换输出

    http://acm.hdu.edu.cn/showproblem.php?pid=2016 Problem Description 输入n(n<100)个数,找出其中最小的数,将它与最前面的数 ...

  10. composer 使用(踩坑笔记)

    composer的介绍 来张图就好啦!我不细说啦 安装composer 1).PHP 环境变量配置,可参考百度经验: 2).详情可参考中国全量镜像进行 Composer 的安装 3).安装完成后,命令 ...