zoukankan      html  css  js  c++  java
  • hdu 3234 Exclusive-OR (并查集)

    Problem - 3234

      题意不难理解,就是给出一些断言,以及一些查询,回答查询或者在找到断言矛盾以后沉默不做任何事。

      这题其实就是一个并查集的距离存储问题,只要记录并查集元素的相对值以及绝对值就可以了。

    代码如下:

      1 #include <iostream>
      2 #include <algorithm>
      3 #include <cstdio>
      4 #include <cstring>
      5 #include <stack>
      6 #include <set>
      7 
      8 using namespace std;
      9 
     10 const int N = 22222;
     11 struct MFS {
     12     int fa[N], rel[N], val[N];
     13     void init() { for (int i = 0; i < N; i++) fa[i] = i, rel[i] = 0, val[i] = -1;}
     14     int find(int x) {
     15         if (fa[x] != x) {
     16             int fx = find(fa[x]);
     17             rel[x] ^= rel[fa[x]];
     18             fa[x] = fx;
     19             val[x] = val[fx] ^ rel[x];
     20             return fx;
     21         } else return x;
     22     }
     23     bool merge(int x, int y, int d) {
     24         int fx = find(x), fy = find(y);
     25         if (fx == fy) return d == (rel[x] ^ rel[y]);
     26         int dx = rel[x] ^ rel[fx], dy = rel[y] ^ rel[fy];
     27         if (~val[fx] && ~val[fy]) return d == (dx ^ dy ^ val[fx] ^ val[fy]);
     28         d ^= dx ^ dy;
     29         if (~val[fx]) rel[fy] ^= d, fa[fy] = fx;
     30         else rel[fx] ^= d, fa[fx] = fy;
     31         return true;
     32     }
     33     bool confirm(int x, int d) {
     34         int fx = find(x);
     35         if (~val[fx]) return (rel[x] ^ val[fx]) == d;
     36         val[fx] = rel[x] ^ d;
     37         return true;
     38     }
     39     int query(int x) {
     40         int fx = find(x);
     41         if (~val[x]) return val[x];
     42         return -1;
     43     }
     44 } mfs;
     45 
     46 set<int> nsid;
     47 int ns[N];
     48 
     49 int main() {
     50 //    freopen("in", "r", stdin);
     51     char buf[222];
     52     int n, m, val[111], cnt, cas = 1;
     53     while (~scanf("%d%d", &n, &m) && (n || m)) {
     54         mfs.init();
     55         bool conf = false;
     56         char *ptr;
     57         cnt = 0;
     58         printf("Case %d:
    ", cas++);
     59         for (int q = 1; q <= m; q++) {
     60              scanf("%s", buf);
     61             gets(buf + 1);
     62             val[0] = 0;
     63             ptr = strtok(buf + 1, " ");
     64             while (ptr) {
     65                 val[0]++;
     66                 sscanf(ptr, "%d", &val[val[0]]);
     67                 ptr = strtok(NULL, " ");
     68             }
     69             if (conf) continue;
     70             if (buf[0] == 'I') {
     71                 cnt++;
     72                 if (val[0] == 3) conf = !mfs.merge(val[1], val[2], val[3]);
     73                 else conf = !mfs.confirm(val[1], val[2]);
     74                 if (conf) printf("The first %d facts are conflicting.
    ", cnt);
     75             } else {
     76                 int ans = 0, tmp, fa;
     77                 nsid.clear();
     78                 for (int i = 2; i <= val[0]; i++) {
     79                     tmp = mfs.query(val[i]);
     80                     fa = mfs.find(val[i]);
     81 //                    cout << tmp << ' ';
     82                     if (tmp < 0) {
     83                         if (nsid.find(fa) != nsid.end()) {
     84                             ans ^= ns[fa] ^ mfs.rel[val[i]];
     85                             nsid.erase(fa);
     86                         } else {
     87                             nsid.insert(fa);
     88                             ns[mfs.fa[val[i]]] = mfs.rel[val[i]];
     89                         }
     90                     } else ans ^= tmp;
     91                 }
     92 //                cout << endl;
     93                 if (!nsid.empty()) puts("I don't know.");
     94                 else printf("%d
    ", ans);
     95             }
     96         }
     97         puts("");
     98     }
     99     return 0;
    100 }
    View Code

    ——written by Lyon

  • 相关阅读:
    MongoDB4.0以下版本,同一台电脑安装2个MongoDB服务
    CMake编译Mysql connector C++
    Winsock I/O方法
    查看mysql版本的四种方法(转)
    WorkBench,DELETE 标准语句失败
    Qt 透明对话框 自定义透明度
    QString 分割字符串时产生乱码的问题
    winsock error 相关
    线程的分离状态与结合状态
    Oracle 语法
  • 原文地址:https://www.cnblogs.com/LyonLys/p/hdu_3234_Lyon.html
Copyright © 2011-2022 走看看