这题说的是 在一个 森林中 两个人在这棵树上涂颜色,黑色或者白色,第一次只能在1 号节点上涂色 第二次 只能在2上涂,以此类推, 在每个节点上只能涂黑色或者白色,并且相邻的点不能有相同的颜色,最后求不能填的人就输了。

每个点周围的比他小的点 都会有一个祖先(或者是他们自己),我们知道他周围的点的祖先中最小的那个点 一定是影响他的最小的点 那么他取什么值这就不那么重要了。无论他取黑还是白,后面的就只是相对而言,那么如果他受到第二小或者以上的点的影响,那么他就一定不能了, 还有就是当他和他周围点离他们共同祖先的距离一样的时候也是不行的。

哪个先出现错误哪个就失败了。

#include <iostream>
#include <algorithm>
#include<string.h>
#include<vector>
#include <cstdio>
using namespace std;
const int maxn=;
struct Edg{
int to,nxt;
Edg(int a=,int b=){
to=a; nxt=b;
}
}P[maxn*];
int len[maxn],fa[maxn],first[maxn],pos;
void add(int a, int b){
P[pos].to=b; P[pos].nxt=first[a];
first[a]=pos++;
}
int find(int x){
if(x!=fa[x]){
int f=find(fa[x]);
len[ x ] = len[ fa[x] ]^len[x];
fa[ x ] = f;
}
return fa[x];
}
bool uunion(int x, int y){
int fx=find(x);
int fy=find(y);
if(fx==fy){
return len[x]!=len[y];
}
if(fx<fy){
fa[fy]=fx;
len[fy ] = len[x]^len[y]^;
}else{
fa[fx]=fy;
len[fx] = len[x]^len[y]^;
}
return true;
}
int qq[maxn*];
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
int N,M,cas;
scanf("%d",&cas);
for(int cc=; cc<=cas; cc++){
pos=;
scanf("%d%d",&N,&M);
for(int i=; i<=N; i++){
first[i]=; fa[i]=i; len[i]=;
}
for(int i=; i<M; i++){
int a,b;
scanf("%d%d",&a,&b);
add(a,b); add(b,a);
}
int ans=-;
for(int i=; i<=N&&ans==-; i++){
int pp=;
for(int j=first[i]; j ; j=P[j].nxt){
int to=P[j].to;
if(to>i)continue;
qq[pp++]=find(to);
}
sort(qq,qq+pp);
pp = unique(qq,qq+pp)-qq;
for(int j=; j<pp; j++)
if( qq[j]% != i% )ans=i;
for(int j=first[i]; j; j=P[j].nxt){
int to=P[j].to;
if(to>i) continue;
if(!uunion(i,to))ans=i;
}
}
printf("Case %d: ",cc);
if(ans==-)printf("Draw\n");
else{
if( (ans&) ==)printf("Maze\n");
else printf("Fat Brother\n");
}
} return ;
}

师大校赛D coloring Game 并查集的更多相关文章

  1. 2019浙师大校赛(浙大命题)(upc复现赛)总结

    2019浙师大校赛(浙大命题)(upc复现赛)总结 早上九点开始.起得迟了,吃了早饭慌慌张张跑过去,刚到比赛就开始了. 开始分别从前往后和从后往前看题,一开始A题,第一发WA,第二次读题发现漏看了还有 ...

  2. HDU 4750 Count The Pairs (2013南京网络赛1003题,并查集)

    Count The Pairs Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others ...

  3. zoj 3659 第37届ACM/ICPC 长春赛区现场赛E题 (并查集)

    题意:给出一棵树,找出一个点,求出所有点到这个点的权值和最大,权值为路径上所有边权的最小值. 用神奇的并查集,把路按照权值从大到小排序,然后用类似Kruskal的方法不断的加入边. 对于要加入的一条路 ...

  4. noip模拟赛 动态仙人掌(并查集,贪心)

    思路: 贪心+并查集 因为45‘,所以可以很方便的算出每个仙人掌的最晚起跳(左端点) 右端点自然也能出来 先按左端点排序 如果他右面的和他相交,就更新 用并查集维护这个更新的关系 更新的同时维护高就好 ...

  5. PAT 天梯赛 L2-024. 部落 【并查集】

    题目链接 https://www.patest.cn/contests/gplt/L2-024 题意 给出 几个不同的圈子,然后 判断 有哪些人 是属于同一个部落的,或者理解为 ,有哪些人 是有关系的 ...

  6. 2019 ICPC 徐州网络赛 B.so easy (并查集)

    计蒜客链接:https://nanti.jisuanke.com/t/41384 题目大意:给定n个数,从1到n排列,其中有q次操作,操作(1) 删除一个数字 // 操作(2)求这个数字之后第一个没有 ...

  7. 蓝桥杯模拟赛-引爆炸弹-DFS+并查集

    今天整理电脑,翻出来了很久以前大佬给的题,贴一下. 引爆炸弹 1000ms 在一个 n×m的方格地图上,某些方格上放置着炸弹.手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸 ...

  8. 并查集+拓扑排序 赛码 1009 Exploration

    题目传送门 /* 题意:无向图和有向图的混合图判环: 官方题解:首先对于所有的无向边,我们使用并查集将两边的点并起来,若一条边未合并之前, 两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为 ...

  9. POJ-2421Constructing Roads,又是最小生成树,和第八届河南省赛的引水工程惊人的相似,并查集与最小生成树的灵活与能用,水过~~~

    Constructing Roads Time Limit: 2000MS   Memory Limit: 65536K               Description There are N v ...

随机推荐

  1. Orchard Core 自定义权限配置

    在我们为Orchard Core配置了一个新的Module之后,我们要考虑的是谁可以访问这个Module,那么这里就涉及到了一个权限的配置.如下图,添加了自定义的权限: Orchard Core源码: ...

  2. UOJ244 短路 贪心

    正解:贪心 解题报告: 传送门! 贪心真的都是些神仙题,,,以我的脑子可能是不存在自己想出解这种事情了QAQ 然后直接港这道题解法趴,,, 首先因为这个是对称的,所以显然的是可以画一条斜右上的对角线, ...

  3. IO和NIO

    一.创建IO System.out.println( "*************欢迎进入文件操作系统*************" ); System.out.println( & ...

  4. linux 查看磁盘读写:iotop

    iotop命令用来动态地查看磁盘IO情况,用法如下: 安装iotop命令 [root@mysql ~]# yum install iotop -y [root@mysql ~]# iotop Tota ...

  5. MySQL安装失败解决的方法

    一..msi版的MySQL安装包在最后执行的时候到第三步就死掉了,直接未响应 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd19iYXNrZXRib3ky ...

  6. Python3学习之路~6.7 经典类和新式类的继承顺序

    在Python中,经典类(class Person:)和新式类(class Person(object):)的主要区别就是体现在多继承的顺序上. Python 2.x中默认都是经典类,只有显式继承了o ...

  7. C# 线程池ThreadPool的用法简析

    https://blog.csdn.net/smooth_tailor/article/details/52460566 什么是线程池?为什么要用线程池?怎么用线程池? 1. 什么是线程池? .NET ...

  8. strlen函数细节

    strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值. 原型: ...

  9. 由swap引发的关于按值传递和引用传递的思考与总结

    函数的参数传递定义:在调用一个函数时,将实参传递给形参. C++中函数的参数传递有按值传递.地址传递和引用传递3种方式.注意:地址也是一种值,按值传递和按地址传递都是单向的值传递方式,即形参都不会回传 ...

  10. Cartographer源码阅读(3):程序逻辑结构

    Cartographer早期的代码在进行3d制图的时候使用了UKF方法,查看现有的tag版本,可以转到0.1.0和0.2.0查看,包含kalman_filter文件夹. 文件夹中的pose_track ...