2019湘潭校赛 G(并查集)

要点

  • 题目传送
  • 题目本质是每个点必属于两个集合中的一个,伴随的性质是:如果一个人说别人true,则他们一定属于同一阵营;如果说别人fake,一定不属于同一阵营。
  • 每个点拆为\(i\)和\(i + n\)分别代表他属于某种阵营(目前还不确定),然后根据上述性质边读入边合并同类。
  • 这样扫一遍,如果某个\(i\)和\(i + n\)属于同一阵营则矛盾,无解。
  • 若有解,对于每个点扫一遍和他同阵营的人,为了使fakeman尽可能地少,\(<=n\)的人少就把\(<=n\)视为fakeman;否则把\(>n\)的视为fakeman。
#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 5;
int T, n, m;
int f[maxn << 1], ans[maxn], sz[maxn << 1];
vector<int> v[maxn << 1];

int getf(int v) {
    return v == f[v] ? v : f[v] = getf(f[v]);
}

void merge(int u, int v) {
    f[getf(u)] = getf(v);
}

int main() {
    for (scanf("%d", &T); T--;) {
        scanf("%d %d", &n, &m);

        for (int i = 1; i <= n * 2; i++)    f[i] = i, v[i].clear();
        memset(ans, 0, sizeof ans);
        memset(sz, 0, sizeof sz);

        for (int i = 1, u, v, w; i <= m; i++) {
            scanf("%d %d %d", &u, &v, &w);
            if (w)    merge(u, v), merge(u + n, v + n);
            else    merge(u, v + n), merge(u + n, v);
        }

        int flag = 1;
        for (int i = 1; i <= n; i++)
            if (getf(i) == getf(i + n)) {
                flag = 0; break;
            }
        if (!flag) {
            puts("-1"); continue;
        }

        for (int i = 1; i <= n * 2; i++)    v[getf(i)].push_back(i);
        for (int i = 1; i <= n; i++)    sz[getf(i)]++;

        for (int i = 1; i <= n; i++) {
            if (ans[i])    continue;
            int fa = getf(i);
            if (v[fa].size() - sz[fa] >= sz[fa]) {
                for (int j : v[fa])
                    if (j > n)    ans[j - n] = 2;
                    else    ans[j] = 1;
            } else {
                for (int j : v[fa])
                    if (j > n)    ans[j - n] = 1;
                    else    ans[j] = 2;
            }
        }
        for (int i = 1; i <= n; i++)    printf("%d", ans[i] - 1);
        puts("");
    }
}

原文地址:https://www.cnblogs.com/AlphaWA/p/10901661.html

时间: 2024-10-03 23:27:12

2019湘潭校赛 G(并查集)的相关文章

校赛 (离散化 + 并查集)

题目描述 狗逼喵养了只小喵呜,编号1-N.第i只小喵呜懂M_i种语言. 俗话说得好,语言不通怎么啪啪啪,所以只有当两只小喵呜懂相同的语言的时候他们才能交流才能成为好朋♂友♀. 当然就算两只小喵呜不懂同一种语言也可以请其他小喵呜当翻译.换句话说,小喵呜A和小喵呜B可以成为好朋友的前提是存在一个序列A,T_1,T_2,-..,T_k,B(k>=0),其中A和T_1都会说某一种语言,T_1和T_2也都会说某一种语言-..,并且T_k和B会说某一种语言. 狗逼喵希望他的小喵呜都能成为好朋♂友♀,于是他决

油菜花王国——杭电校赛(并查集)

油菜花王国 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1609    Accepted Submission(s): 411 Problem Description 程序设计竞赛即将到来,作为学校ACM集训队主力,小明训练一直很努力.今天天气不错,教练也心情大好,破例给各位队员放假一天,小明就骑着自己的小电驴到郊外踏青去了. 出城不

2018 FJUT acm校赛 b题 第二集:以后我就叫你小蛤了

第二集:以后我就叫你小蛤了 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description "小蛤啊,对了以后我就叫你小蛤了,你给的题完全没有难度啊" "哼,你别得意,让你碰巧做出来了而已,接下来这题你绝对不可能做出来的,你要是做出来了balabalabala...." "行了行了,快说题目吧,我时间宝贵啊!" 小A心急如焚,想尽快知道小C

2019 浙大校赛解题过程及题解

解题过程  开场lfw看J,被孪生素数误导,没有看出水题的本质,byf及时提醒后,lfw忘记N=1的情况要特判.之后byf写E,忘记开long long,wa+1.Shl看出A题思路,告诉lfw开始写A,lfw忘记先排序,WA+1.byf看出B题做法,lfw写java过掉,shl与lfw讨论G,lfw开始写G,byf看出C可以hash暴力,lfwG忘记清空一个值,导致特殊情况会加两次,wa+1,byf使用mp作hash,带logn常数TLE,随后转成long long的hash值,使用unord

2019浙大校赛--J--Extended Twin Composite Number(毒瘤水题)

毒瘤出题人,坑了我们好久,从基本的素数筛选,到埃氏筛法,到随机数快速素数判定,到费马小定理,好好的水题做成了数论题. 结果答案是 2*n=n+3*n,特判1,2. 以下为毒瘤题目: 题目大意: 输入一个数n, 输出两个合数(即非素数)a,b 实现 n+a=b 解题思路 3n=n+2n; 特判1.2 代码: 1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 typedef long long ll; 5

2019 上海网络赛G 手写哈希map+字符串hash

https://nanti.jisuanke.com/t/41415 因为对于询问$\sum |s|<=1e5$,因此$|s|$的种类数$<=\sqrt{1e5}$ 我们分组标记,就变成了$\sqrt{1e5}$次询问了,我们暴力去跑, 复杂度$1e5\sqrt{1e5}*hashmap$ 暴力+哈希+$unordermap$计数,嗯,果然TLE了 然后手写一个$hashmap$,跑的飞快... #include<bits/stdc++.h> #define ull unsigne

hdu6074[并查集+LCA+思维] 2017多校4

看了标答感觉思路清晰了许多,用并查集来维护全联通块的点数和边权和. 用另一个up[]数组(也是并查集)来保证每条边不会被重复附权值,这样我们只要将询问按权值从小到大排序,一定能的到最小的边权和与联通块中的点数. 下面是过程分析.过程中一共运用了两个并查集. [数据]110 31 21 32 42 53 63 74 85 95 109 6 3 1 501 4 2 5 209 10 8 10 40[分析]首先我们将图构建出来我们将m次询问按权值从小到大排序后: 1 4 2 5 209 10 8 10

G - Brain Network (easy)(并查集水题)

G - Brain Network (easy) Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u CodeForces 690C1 Description One particularly well-known fact about zombies is that they move and think terribly slowly. While we still don't know

2017端午欢乐赛——Day1T3(树的直径+并查集)

//前些天的和jdfz的神犇们联考的模拟赛.那天上午大概是没睡醒吧,考场上忘了写输出-1的情况,白丢了25分真是**. 题目描述     小C所在的城市有 n 个供电站,m条电线.相连的供电站会形成一个供电群,那么为了节省材料,供电群是一棵树的形式,也即城市是一个森林的形式(树:V个点,V-1条边的无向连通图,森林:若干棵树).每个供电群中不需要所有供电站都工作,最少只需要一个工作,其余的就都会通过电线收到电,从而完成自己的供电任务.当然,这样会产生延迟.定义两个供电站的延迟为它们之间的电线数量