码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-04-11 01:04:50      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:tor   efi   相等   迭代   合并   说明   ios   int   gis   

考试时先拿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

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

标签:tor   efi   相等   迭代   合并   说明   ios   int   gis   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!