题解:

splay,维护当前第k大

并查集维护当前集合

合并x,y时,del(num[x]),del(num[y]),insert(num[x]+num[y])

代码:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=;
int pre[N],tot,xx,q,size[N],c[N][],fa[N],data[N],root,n,m,x,y,num[N];
void rot(int x)
{
int y=pre[x],k=(c[y][]==x);
size[y]=size[c[y][k]]+size[c[x][k]]+;
size[x]=size[c[x][!k]]+size[y]+;
c[y][!k]=c[x][k];
pre[c[y][!k]]=y;
pre[x]=pre[y];
if(pre[y])c[pre[y]][c[pre[y]][]==y]=x;
c[x][k]=y;pre[y]=x;
}
void splay(int x,int g)
{
for(int y=pre[x];y!=g;rot(x),y=pre[x])
if(pre[y]!=g)rot((x==c[y][])==(y==c[pre[y]][])?y:x);
if(g==)root=x;
}
void insert(int x)
{
int y=root;
while(c[y][x>data[y]]) y=c[y][x>data[y]];
data[++tot]=x;
c[tot][]=c[tot][]=;
pre[tot]=y;
if(y)c[y][x>data[y]]=tot;
splay(tot,);
}
void del(int x)
{
int y=root;
while(data[y]!=x) y=c[y][x>data[y]];
splay(y,);
y=c[root][];
bool b;
if(!y) b=,y=c[root][];else b=;
while(c[y][b]) y=c[y][b];
splay(y,root);
c[y][b]=c[root][b];pre[c[root][b]]=y;pre[y]=;root=y;
size[y]=size[c[y][!b]]+size[c[y][b]];
}
int find(int x)
{
if (x==fa[x])return x;
return fa[x]=find(fa[x]);
}
int findkth(int x)
{
int y=root;
while(x)
if(size[c[y][]]+<x)x-=size[c[y][]]+,y=c[y][];
else if(size[c[y][]]+==x) return data[y];
else y=c[y][];
return data[y];
}
int read()
{
char c;int x=;
for (;c<''||c>'';c=getchar());
for (;c>=''&&c<='';c=getchar())x=x*+c-;
return x;
}
void write(int x)
{
if (x>=)write(x/);
putchar(x%+);
}
int main()
{
n=read();m=read();
for (int i=;i<=n;i++)insert();
for (int i=;i<=n;i++)fa[i]=i,num[i]=;
while (m--)
{
xx=read();
if (xx==)
{
x=read();y=read();
int dx=find(x),dy=find(y);
if (dx!=dy)
{
fa[dx]=dy;
del(num[dy]);del(num[dx]);
num[dy]+=num[dx];
insert(num[dy]);
n--;
}
}
else
{
x=read();
write(findkth(n-x+)),puts("");
}
}
}

poj2895的更多相关文章

随机推荐

  1. Duilib初级控件扩展一例: 具有鼠标滚动消息的OptionUI

    转载:http://www.cnblogs.com/memset/p/Duilib_MouseWheelOptionUI_Deprecated.html

  2. C# MD5一句话加密

    System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5")

  3. jz2440-linux3.4.2-kernel移植【学习笔记】【原创】

    平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山二期视频学习笔记 交叉编译工具:arm-linux-gcc (GCC)4.3.2 linux:linu3.4.2 PC环境:ubu ...

  4. 同步TreeView中父结点和子结点的状态[以及Treeview的bug]

    此代码仅仅是二级结点,即父结点下面只有一层子结点,只有两层结构 /// <summary> /// 某个结点的CheckBox被选中 /// </summary> /// &l ...

  5. sqlserver数据库出错的解决方法

    1.SQLServer2008数据库sa账户登录127.0.0.1失败 http://blog.sina.com.cn/s/blog_546a30270102weh2.html 2.SqlServer ...

  6. ASP.NET MVC之Bundle压缩JS和CSS

    介绍Bundle之前先引用<淘宝技术这十年>中一段话,对Web前端稍微有点常识的人都应该知道,浏览器下一步会加载页面中用到的CSS.JS(JavaScript).图片等样式.脚本和资源文件 ...

  7. 如何设置datatable的宽度

    本文为博主原创,未经允许不得转载: datatable插件具有很好的自动适应性,在大多数情况下可以自适应,完美的展示列表内容. 实现其自适应的其特性为:"bAutoWidth": ...

  8. .Net页面局部更新的思考

    最近在修改以前做的模块,添加一个新功能.整理了下才发现重用率很低,大部分的东西还是需要重新写.功能里用到了局部更新,所有整理一下一路来实现局部更新的解决方案及改进. 我接触的项目开发大多是以Asp.n ...

  9. HDU 6162 Ch's gift(树链剖分+线段树)

    题意: 已知树上的每个节点的值和节点之间的关系建成了一棵树,现在查询节点u到节点v的最短路径上的节点值在l到r之间的节点值的和. 思路: 用树链剖分将树映射到线段树上,线段树上维护3个值,max,mi ...

  10. POJ 2152 Fire(树形dp)

    http://poj.org/problem?id=2152 题意: n个节点组成的树,要在树一些点上建立消防站,每个点建站都有个cost[i],每个点如果不在当前的点上建站,也要依赖其他的消防站,并 ...