【bzoj2049】洞穴勘测
题意
三种操作:
(1)Link
(2)Cut
(3)询问连通性
分析
分析1:Trick
clj的方法...
随机构造的树很容易Trick过掉。
我们考虑直接使用并查集,不使用路径压缩。
再使用换根操作。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#define rep(i,n) for(int i=0;i<n;i++)
#define pb push_back
using namespace std;
const int maxn=10000+10;
int F[maxn],n,m;
void Clear_List()
{
rep(i,n)F[i]=i;
}
int Find_Root(int u)
{
while(u!=F[u])u=F[u];
return u;
}
bool Query(int u,int v)
{
return Find_Root(u)==Find_Root(v);
}
void Mark_Root(int u)
{
int v=F[u],t;F[u]=u;
while(u!=v)
{
t=F[v];F[v]=u;
u=v;v=t;
}
}
void Connect(int u,int v)
{
Mark_Root(u);
Mark_Root(v);
F[v]=u;
}
void Destroy(int u,int v)
{
Mark_Root(u);
F[v]=v;
}
char c[100];
int main()
{
//freopen("in","r",stdin);
scanf("%d%d",&n,&m);int u,v;
Clear_List();
rep(i,m)
{
scanf(" ");scanf("%s%d%d",c,&u,&v);
u--;v--;
switch(c[0])
{
case 'Q':Query(u,v)?puts("Yes"):puts("No");break;
case 'C':Connect(u,v);break;
case 'D':Destroy(u,v);break;
}
}
}
分析2:LCT
LCT裸题。
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define rep(i,a,b) for (int i=(a);i<=(b);i++)
#define per(i,a,b) for (int i=(a);i>=(b);i--)
const int N=16384;
const int L=16;
int n,m;
char s[L];
int c[N][2]; int fa[N];
int rev[N];
int st[N],top;
int rd(void) {
int x=0,f=1; char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
int IsRoot(int x) {
int pre=fa[x];
return c[pre][0]!=x&&c[pre][1]!=x;
}
void Clear(int x) {
if (rev[x]) {
rev[x]^=1;
rev[c[x][0]]^=1;
rev[c[x][1]]^=1;
swap(c[x][0],c[x][1]);
}
}
void Rotate(int x) {
int y=fa[x],z=fa[y],l,r;
if (c[y][0]==x) l=0; else l=1; r=l^1;
if (!IsRoot(y)) {
if (c[z][0]==y)
c[z][0]=x;
else c[z][1]=x;
}
fa[x]=z,fa[y]=x;
if (c[x][r]>0) fa[c[x][r]]=y;
c[y][l]=c[x][r];
c[x][r]=y;
}
void Splay(int x) {
top=0;
st[++top]=x;
for (int i=x;!IsRoot(i);i=fa[i])
st[++top]=fa[i];
// rep(i,1,top) Clear(st[i]);
per(i,top,1) Clear(st[i]);
while (!IsRoot(x)) {
int y=fa[x],z=fa[y];
if (!IsRoot(y)) {
if ((c[y][0]==x)^(c[z][0]==y))
Rotate(x);
else Rotate(y);
}
Rotate(x);
}
}
void Access(int x) {
int t=0;
while (x>0) {
Splay(x);
c[x][1]=t;
fa[t]=x;
t=x;
x=fa[x];
}
}
void Evert(int x) {
Access(x);
Splay(x);
rev[x]^=1;
}
void Link(int x,int y) {
Evert(x);
fa[x]=y;
Splay(x);
}
void Cut(int x,int y) {
Evert(x);
Access(y);
Splay(y);
c[y][0]=fa[x]=0;
}
int Find(int x) {
Access(x);
Splay(x);
int t=x;
while (c[t][0]>0)
t=c[t][0];
Splay(t);
return t;
}
int Judge(int x,int y) {
int fx=Find(x),fy=Find(y);
return fx==fy;
}
int main(void) {
#ifndef ONLINE_JUDGE
freopen("sdchr.in","r",stdin);
freopen("sdchr.out","w",stdout);
#endif
n=rd(),m=rd();
rep(i,1,m) {
scanf("%s",s+1); int x=rd(),y=rd();
switch (s[1]) {
case 'C':
Link(x,y);
break;
case 'D':
Cut(x,y);
break;
case 'Q':
int t=Judge(x,y);
if (t) printf("Yes\n"); else printf("No\n");
break;
}
}
return 0;
}
小结
树的问题:
(1)Trick
(2)DFN序
(3)树剖
(4)树上倍增
(5)树分块
(6)树上莫队
(7)点分治
(8)LCT
【bzoj2049】洞穴勘测的更多相关文章
- 算法复习——LCT(bzoj2049洞穴勘测)
题目: Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连 ...
- BZOJ 2049: [Sdoi2008]Cave 洞穴勘测 (动态树入门)
2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1528 Solved: 644[Submit][ ...
- 【BZOJ2049】洞穴勘测(Link-Cut Tree)
[BZOJ2049]洞穴勘测(Link-Cut Tree) 题面 题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别 ...
- BZOJ2049 SDOI2008 Cave 洞穴勘测 【LCT】
BZOJ2049 SDOI2008 Cave 洞穴勘测 Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分 ...
- [bzoj2049][Sdoi2008]Cave 洞穴勘测_LCT
Cave 洞穴勘测 bzoj-2049 Sdoi-2008 题目大意:维护一个数据结构,支持森林中加边,删边,求两点连通性.n个点,m个操作. 注释:$1\le n\le 10^4$,$1\le m\ ...
- 【BZOJ2049】 [Sdoi2008]Cave 洞穴勘测 LCT/并查集
两种方法: 1.LCT 第一次LCT,只有link-cut和询问,无限T,到COGS上找了数据,发现splay里的父亲特判出错了(MD纸张),A了,好奇的删了反转T了.... #include < ...
- 【bzoj2049】[Sdoi2008]Cave 洞穴勘测 link-cut-tree
2016-05-30 11:04:51 学习了link-cut-tree 二中神犇封禹的讲义感觉讲的超级清晰易懂啊(没有的可以q窝 算是模板吧 #include<bits/stdc++.h&g ...
- BZOJ-2049 Cave洞穴勘测 动态树Link-Cut-Tree (并查集骗分TAT)
2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 5833 Solved: 2666 [Submit] ...
- 【BZOJ2049】 [Sdoi2008]Cave 洞穴勘测
Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...
- 【BZOJ2049】【LCT】Cave 洞穴勘测
Description 辉 辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通 道组成,并且每条通道连接了 ...
随机推荐
- Fiddler-009-AutoResponder 简单的 MOCK SERVER 应用实例
在我们日常的测试中经常需要测试特定的响应对应的客户端展示样式是否正确无误,实现测试方法一般有如下三种: 创建新的测试数据(工作量较大) 修改已有测试数据(例如修改对应的状态码,若是最终需要测试的按钮状 ...
- 明白何谓Margin Collapse
不同于其他很多属性,盒模型中垂直方向上的Margin会在相遇时发生崩塌,也就是说当某个元素的底部Margin与另一个元素的顶部Margin相邻时,只有二者中的较大值会被保留下来,可以从下面这个简单的例 ...
- RDIFramework.NET ━ 9.15 个性化设置 ━ Web部分
RDIFramework.NET ━ .NET快速信息化系统开发框架 9.15 个性化设置 -Web部分 个性化设置,主要针对用户的偏好对界面进行设置,主界面如下: 9.15.1界面皮肤设置 目前框 ...
- react js 按条数 展开/折叠
//2条const MAX_SHOW_NUM = 2; class HotDiscuss extends Component { static propTypes = { //验证 repliedCo ...
- Anaconda安装与使用
bash Anaconda.....sh命令安装成功 安装位置:/home/amelie/anaconda2 修改路径:vi ~/.bashrc vi编辑器在最后写上:export PATH=/hom ...
- PHP读取XML文件数据
XML文件 <?xml version="1.0" encoding="UTF-8"?> <node> <student> ...
- CentOS 升级PHP
wget http://download.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm wget http://rpm ...
- RF《Quick Start Guide》操作总结
这篇文章之所以会给整理出来,是因为学了一个季度的RF后,再去看官网的这个文档,感触破多,最大的感触还是觉得自己走了不少弯路,还有些是学习方法上的弯路.在未查看这类官网文档之前,更多的是看其他各种人的博 ...
- js获取url参数值
用过的封装好的js获取url问号后的参数的方法: <script> var Request = new Object(); Request = GetRequest();var error ...
- visual Sdudio 快捷键
项目相关的快捷键 Ctrl + Shift + B = 生成项目 Ctrl + Alt + L = 显示Solution Explorer(解决方案资源管理器) Shift + Alt+ C = 添加 ...