51nod 1515 明辨是非 并查集+set维护相等与不等关系

考试时先拿vector瞎搞不等信息,又没离散化,结果好像MLE;后来想起课上讲过用set维护,就开始瞎搞迭代器。。。QWQ我太菜了。。

用并查集维护相等信息,用set记录不相等的信息:

如果要求变量不等,若不和并查集矛盾,就拿set互相记录一下,YES;矛盾就NO

如果要求变量相等,

  1.x记录的不等的变量中有y,说明矛盾,NO

  2.若祖先不等,那就合并两个变量所在的并查集(合并两个并查集的祖先),size大的并到小的上,set暴力转移集合不相等的信息,YES

否则YES

#include<cstdio>
#include<iostream>
#include<map>
#include<set>
#define R register int
using namespace std;
int n,cnt;
set<int> s[200010];
map<int,int>mp;
int fa[200010];
inline int g() {
    R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch==‘-‘?-1:fix;
    do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
}
int getf(int x) {return x==fa[x]?x:fa[x]=getf(fa[x]);}
signed main() {
    n=g(); for(R i=1;i<=n*2+1;++i) fa[i]=i;
    for(R i=1;i<=n;++i) {
        R x=g(),y=g(),p=g();
        if(mp[x]) x=mp[x]; else x=mp[x]=++cnt;
        if(mp[y]) y=mp[y]; else y=mp[y]=++cnt;
        x=getf(x),y=getf(y); if(s[x].size()<s[y].size()) swap(x,y);
        if(p&1) {
            if(s[x].count(y)) putchar(‘N‘),putchar(‘O‘),putchar(‘\n‘);
            else if(x!=y) { fa[y]=x;
                for(set<int>::iterator it=s[y].begin();it!=s[y].end();it++)
                    s[*it].insert(x),s[x].insert(*it);
                putchar(‘Y‘),putchar(‘E‘),putchar(‘S‘),putchar(‘\n‘);
            } else putchar(‘Y‘),putchar(‘E‘),putchar(‘S‘),putchar(‘\n‘);
        } else {
            if(x==y) putchar(‘N‘),putchar(‘O‘),putchar(‘\n‘);
            else s[x].insert(y),s[y].insert(x),
                putchar(‘Y‘),putchar(‘E‘),putchar(‘S‘),putchar(‘\n‘);
        }
    }
}


2019.04.11

原文地址:https://www.cnblogs.com/Jackpei/p/10687191.html

时间: 2024-11-09 07:34:10

51nod 1515 明辨是非 并查集+set维护相等与不等关系的相关文章

51nod 1515 明辨是非 [并查集+set]

今天cb巨巨突然拿题来问,感觉惊讶又开心,希望他早日康复!!坚持学acm!加油! 这题一看感觉我写不出来orz, 就晚睡一点也要把WA的代码改AC!! 好困啊,直接贴了睡觉.zZ 题目链接:51nod 1515 明辨是非 [并查集] 1515 明辨是非 题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操

51nod 1515 明辨是非 并查集 + set + 启发式合并

给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操作. 当p为0时,如果第x变量和第y个变量可以不相等,则输出YES,并限制他们不相等 :否则输出NO,并忽略此次操作. Input 输入一个数n表示操作的次数(n<=1*10^5) 接下来n行每行三个数x,y,p(x,y<=1*10^8,p=0 or 1) Output 对于n行操作,分别输出n行YES或者NO Input示例 3 1 2 1 1 3 1

51 nod 1515 明辨是非(并查集合并)

1515 明辨是非题目来源: 原创基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操作. 当p为0时,如果第x变量和第y个变量可以不相等,则输出YES,并限制他们不相等 :否则输出NO,并忽略此次操作. Input 输入一个数n表示操作的次数(n<=1*10^5) 接下来n行每行三个数x,y,p(x,y<=1*10^8

使用并查集来维护不同的类关系

我们理解并查集这个数据结构的时候不要过于死板,我们要知道 并查集是用来维护关系的,而不是单纯一味去归并,归并,归并 下面给出一个问题尝试用并查集来解决:一共有两个类,然后告诉你若干组数据,每一组数据的两个元素不是一类的,然后在线判断两个元素是否是同一类 这个时候如果你只会归并就行不通的,还需要一些特殊的处理 我们需要在并查集的那个数组的基础之上,需要另一个数组来记录这种特殊的现象 int set[maxn],a[maxn]; //a表示这个节点和父节点的关系,0表示相同1表示不同 接下来我们的路

51Nod 1515(并查集、set、离散化)

//代码还是YY学姐帮改的,自己从来没有真正A过几道题,不是看题解就是有BUG找不出,多久了还是改变不了这样的现状,或许ACM就是这么筛选人的吧.从5.24到11.24,再到又一年的5.24,可感觉后者比前者过得快多了.多读了一年的大学,完全没有了时间概念,不知道现在到底是大几了,不知道现在到底处在什么位置,不知道毕业后到底从不从事IT这行,一切都是未知的. 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=15

51nod 1204 Parity(并查集应用)

1204 Parity 题目来源: Ural 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 你的朋友写下一串包含1和0的串让你猜,你可以从中选择一个连续的子串(例如其中的第3到第5个数字)问他,该子串中包含了奇数个还是偶数个1,他会回答你的问题,然后你可以继续提问......你怀疑朋友的答案可能有错,或说同他之前的答案相互矛盾,例如:1 - 2 奇数,3 - 4 奇数,那么可以确定1 - 4 一定是偶数,如果你的朋友回答是奇数,就产生了矛盾.给出所有你朋友的

51nod-1515 明辨是非——并查集

给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操作. 当p为0时,如果第x变量和第y个变量可以不相等,则输出YES,并限制他们不相等 :否则输出NO,并忽略此次操作. Input 输入一个数n表示操作的次数(n<=1*10^5) 接下来n行每行三个数x,y,p(x,y<=1*10^8,p=0 or 1) Output 对于n行操作,分别输出n行YES或者NO Input示例 3 1 2 1 1 3 1

逆向思维 + 用并查集动态维护连通块的个数——Luogu P1197题解

题目大意: 给你一个 $ n $ 个点的图与 $ m $ 条边,接下来给出一个长度为 $ k $ 个整数,按照给出整数的顺序依次删掉对应编号的点,求出一开始的连通块的个数与接下来每次删除一个点后的连通块的个数.(连通块就是一个点集,这个集合里面的任意两个点都可以互相到达) 思路: 大体思路: 这个题目如果正向考虑会很难做,因为我们要每次维护一个不断删点的图的连通块个数是很难弄的.所以我们要倒着考虑.假如我们把删点的过程倒着考虑,就变成了从最后一个点往前添加进这个图里面的过程.所以这样问题就变成了

poj1182 并查集

题目连接:http://poj.org/problem?id=1182 基础并查集,需要维护与根节点关系,解析见代码: /* poj 1182 并查集 思路分析:让你分析这些话里面多少假的 只需要用一个并查集将已经给出的这些元素存起来 同时记录每个元素与他们根节点关系,如果根结点相同 但是关系不符合就是出现了矛盾. 关系有三种:同类 记为0 吃根节点 1 被根节点吃 2 这样也是为了与他给出的d关系一致 d-1就与我们规定的关系一致了 并查集的关键是路径压缩,在压缩路径的同时我们要更新与根节点关