UVALive 6910 Cutting Tree(并查集应用)
总体来说,这个题给的时间比较长,样例也是比较弱的,别的方法也能做出来。
我第一次使用的是不合并路径的并查集,几乎是一种暴力,花了600多MS,感觉还是不太好的,发现AC的人很多都在300MS之内的过得。
看到他们的做法后,我知道了这个题比较好的做法。
逆向思维的并查集,因为这里只有去边操作,完全可以离线计算,把删边当成加边,然后逆序输出答案即可。
但是,这个却有一个坑,很坑,只有第一次删除的时候,我们才对他进行操作,加边的时候也只能在第一次删除的时候加。当时因为这里,十分困惑……
这是我无路径压缩的并查集的做法:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
using namespace std;
#define N 20005
int n,fa[N];
int Find(int x){
while(x != fa[x]){
x = fa[x];
}
return x;
}
int main() {
// freopen("E.in.cpp","r",stdin);
int T,k,ca=,p,a,b;
scanf("%d",&T);
char op[];
while(T--) {
scanf("%d%d",&n,&k);
for(int i = ; i <= n; i++) {
fa[i] = i;
}
for(int i = ; i <= n; i++) {
scanf("%d",&p);
if(p == ) fa[i] = i;
else {
fa[i] = p;
}
}
printf("Case #%d:\n",++ca);
while(k--) {
scanf("%s",op);
if(op[] == 'C') {
scanf("%d",&b);
if(fa[b] == b) continue;
fa[b] = b;
} else {
scanf("%d%d",&a,&b);
if(Find(a) != Find(b)) {
printf("NO\n");
} else printf("YES\n");
}
}
}
return ;
}
这是逆序离线并查集的做法:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
using namespace std;
const int N = 2e4+;
int n,fa[N],pa[N],vis[N];
string ans[];
struct Query {
int a,b,kind;
void Set(int A,int B,int k) {
a = A;
b = B;
kind = k;
}
} q[];
int Find(int x) {
return fa[x]==x? x :fa[x]=Find(fa[x]);
}
void Union(int a,int b) {
fa[Find(b)] = Find(a);
}
int main() {
// freopen("E.in.cpp","r",stdin);
int T,k,ca=;
char op[];
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&k);
for(int i = ; i <= n; i++) {
scanf("%d",&pa[i]);
fa[i] = i;
vis[i] = ;
}
printf("Case #%d:\n",++ca);
int a,b;
for(int i = ; i < k; i++) {
scanf("%s",op);
if(op[] == 'C') {
scanf("%d",&a);
if(pa[a]!= && vis[a] != ) q[i].Set(a,,);
else q[i].Set(a,,-);
vis[a] = ;
} else {
scanf("%d%d",&a,&b);
q[i].Set(a,b,);
}
}
for(int i = ; i <= n; i++) {
if(vis[i]== || pa[i]==) continue;
Union(pa[i],i);
}
int cnt = ;
for(int i = k-; i >= ; i--) {
if(q[i].kind == -) continue;
else if(q[i].kind == ) {
if(Find(q[i].a) == Find(q[i].b)) ans[cnt++] = "YES";
else ans[cnt++] = "NO";
} else Union(pa[q[i].a],q[i].a);
}
for(int i = cnt-; i >= ; i--) {
cout<<ans[i]<<endl;
}
}
return ;
}
UVALive 6910 Cutting Tree(并查集应用)的更多相关文章
- UVALive 6910 Cutting Tree 并查集
Cutting Tree 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8& ...
- uva 6910 - Cutting Tree 并查集的删边操作,逆序
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- UVALive 6910 Cutting Tree(离线逆序并查集)
[题目]:(地址:) http://acm.hust.edu.cn/vjudge/contest/view.action?cid=97671#problem/E [题意]: 给出多棵树和两类操作:操作 ...
- Hdu.1325.Is It A Tree?(并查集)
Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- Is It A Tree?(并查集)
Is It A Tree? Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26002 Accepted: 8879 De ...
- CF109 C. Lucky Tree 并查集
Petya loves lucky numbers. We all know that lucky numbers are the positive integers whose decimal re ...
- HDU 5606 tree 并查集
tree 把每条边权是1的边断开,发现每个点离他最近的点个数就是他所在的连通块大小. 开一个并查集,每次读到边权是0的边就合并.最后Ansi=size[findset(i)],size表示每个并 ...
- [Swust OJ 856]--Huge Tree(并查集)
题目链接:http://acm.swust.edu.cn/problem/856/ Time limit(ms): 1000 Memory limit(kb): 10000 Description T ...
- Codeforces Round #363 (Div. 2)D. Fix a Tree(并查集)
D. Fix a Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
随机推荐
- 基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v4.1.2版)
目录: 第1版:http://blog.csdn.net/vipbooks/article/details/51912143 第2版:htt ...
- 怎样求FIRST集、FOLLOW集和SELECT集
一,要知道什么是终结符和非终结符. 终结符:通俗的说就是不能单独出现在推导式左边的符号,也就是说终结符不能再进行推导. 非终结符:不是终结符的都是非终结符.(非男即女,呵呵) 如:A-->B,则 ...
- [oc] instancetype vs id for Objective-C 【转】
原贴地址:http://blog.csdn.net/lyy_whg/article/details/12846055 http://www.iwangke.me/2013/01/06/instance ...
- C#Redis列表List
一.前戏 在Redis中,List类型是按照插入顺序排序的字符串链表.和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素.在插入时,如果该键并不存在,Redis将 ...
- hdu1037
#include <iostream> #include <cstdio> using namespace std; int main() { int a,b,c; while ...
- iOS解析crash日志:
iOS解析crash日志:我们在ios开发中会碰到的很多crash问题,如果Debug调试模式的话,我们可以往往很容易的根据log的输出定位到导致crash的原因,但对于已经上线的应用,或者是rele ...
- 浙大玉泉ubuntu L2TP VPN连接设置
网络连接设置 1.内网有线 如果是笔记本且只用无线,剩下的就不需要看了.实验室台式机没有无线网卡不得不折腾-- 玉泉有线都是要绑定固定ip的,实验室无需和mac地址绑定,命令如下sudo gedit ...
- java基础<迷你DVD系统>
一.写在main方法中 import java.util.*; public class MyDVDMgr { public static void main(String[] args){ Scan ...
- hdu 1848 Fibonacci again and again(简单sg)
Problem Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的:F(1)=1;F(2)=2;F(n)=F(n-1)+F(n-2 ...
- http协议的状态码 403 404 301 302 200 500 502 504 报错显示
在网站建设的实际应用中,容易出现很多小小的失误,就像MySQL当初优化不到位,影响整体网站的浏览效果一样,其实,网站的常规http状态码的表现也是一样,Google无法验证网站几种解决办法,提及到由于 ...