[BZOJ1455]罗马游戏(左偏树)
2024-09-26 23:41:55
用并查集和左偏树维护士兵的关系
Code
#include <cstdio>
#include <algorithm>
#define N 1000010
using namespace std; int n,m,fa[N];
bool gg[N]; int Find(int x){return x==fa[x]?x:fa[x]=Find(fa[x]);}
namespace Lt{
int l[N],r[N],v[N],d[N];
int merge(int x,int y){
if(!x||!y) return x+y;
if(v[x]>v[y]) swap(x,y);
r[x]=merge(r[x],y);
if(d[r[x]]>d[l[x]]) swap(l[x],r[x]);
d[x]=d[r[x]]+1;
return x;
}
inline int tp(int x){return v[x];}
inline void pop(int x){
fa[x]=merge(l[x],r[x]);
fa[fa[x]]=fa[x];
}
} inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
} int main(){
n=read();
for(int i=1;i<=n;++i) Lt::v[i]=read(),fa[i]=i;
m=read();
while(m--){
char ch;for(ch=getchar();ch!='M'&&ch!='K';ch=getchar());
if(ch=='K'){
int x=read(),p;
if(gg[x]) puts("0");
else{
gg[p=Find(x)]=1;
printf("%d\n",Lt::v[p]);
Lt::pop(p);
}
}else{
int x=read(),y=read();
if(gg[x]||gg[y]) continue;
int px=Find(x),py=Find(y);
if(px!=py) fa[px]=fa[py]=Lt::merge(px,py);
}
}
return 0;
}
最新文章
- MySql常用日期函数(转载)
- POJ2653判断直线是否相交
- SQL ServerOVER 子句,over开窗函数,SQL SERVER 开窗函数
- 利用开源框架Volley来下载文本和图片。
- SQL Server数据库学习笔记-E-R模型
- Tomcat的SessionID引起的Session Fixation和Session Hijacking问题
- [MODX] 1. Template *
- 在系统方法中调用navigationController的标准写法
- spark-shell 执行脚本并传入参数
- Javascript基础学习(3)_对象和数组
- Maven实战一
- 玩转html5(四)----使用canvas画一个时钟(可以动的哦!)
- easyui动力头 &;amp;&;amp; 动态加入tabs
- 将linux的HOME目录下的文件夹名字改回英文
- (九)UIScrollView和PageControl的分页
- Pocket Gem OA: Log Parser
- 初试fiddler
- Centos 7 下监控与告警部署
- Change position in observation
- 有道云笔记导入txt文件的方法
热门文章
- static final int DEFAULT_INITIAL_CAPACITY = 1 <;<; 4; // aka 16
- Third week-homework(员工管理系统)
- March 5 2017 Week 10 Sunday
- [原]Machine Learing 入门 —— 开门第0篇
- python 提取字符串中的数字组成新的字符串
- C++ decltype类型说明符(尾置返回类型使用)
- cf 786 B 线段树优化建图
- [luoguP3627][APIO2009]抢掠计划
- 【其它】Nook HD刷机
- C#实现打印