奇偶游戏

链接

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 10;
int n,m,cnt,a[2 * maxn],fa[2 * maxn];
string str;

struct node{
    int l,r,ans;
}que[maxn];

int find(int x){
    if(x == fa[x]) return x;
    return fa[x] = find(fa[x]);
}

void read_discrete(){
    cin >> n >> m;
    for(int i = 1; i <= m; i++) {
        cin >> que[i].l >> que[i].r >> str;
        que[i].ans = (str == "odd" ? 1 : 0);
        a[++cnt] = que[i].l - 1;
        a[++cnt] = que[i].r;
    }
    sort(a + 1,a + 1 + cnt);
    n = unique(a + 1, a + 1 + cnt) - a - 1;
}
signed main(){
  // freopen("in","r",stdin);
    ios::sync_with_stdio(0);
    read_discrete();
    for(int i = 0; i <= 2 * n; i++)
        fa[i] = i;
    for(int i = 1; i <= m; i++){
        int x = lower_bound(a + 1, a + 1 + n,que[i].l - 1) - a;
        int y = lower_bound(a + 1, a + 1 + n,que[i].r) - a;
        int x_odd = x,x_even = x + n,y_odd = y,y_even = y + n;
        if(!que[i].ans){
            if(find(x_odd) == find(y_even)){
                cout << i - 1 << endl;
                return 0;
            }
            fa[find(x_odd)] = find(y_odd);
            fa[find(x_even)] = find(y_even);
        }
        else {
            if (find(x_odd) == find(y_odd)){
                cout << i - 1 << endl;
                return 0;
            }
            fa[find(x_even)] = find(y_odd);
            fa[find(x_odd)] = find(y_even);
        }
    }
    cout << m << endl;
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/xcfxcf/p/13516403.html