POJ1733Parity game

POJ1733Parity game

題意

區間長度爲n,給定m個關係,然後三個輸入l,r,s(字符) ,如果s="even"表示(l,r) 有偶數個1,如果s="odd"表示(l,r) 有奇數個1,求k使得1-k個條件都能滿足要求,而k+1個條件不能滿足.

思路

邊帶權並查集,記錄與父親節點之間有偶數個1還是奇數個1,當權值爲1時時偶數個1,當權值爲0時爲偶數個1.

代碼

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct node{
    int l,r,id;
}a[maxn];
int t[maxn],fa[maxn],d[maxn];

int find(int x){
    if(x==fa[x]) return x;
    int fx=find(fa[x]);
    d[x]^=d[fa[x]];
    return fa[x]=fx;
}
int main(){
    int n,m;scanf("%d%d",&n,&m);
    int tot=0;
    for(int i=1;i<=m;i++){
        char s[5];
        scanf("%d%d%s",&a[i].l,&a[i].r,s);
        a[i].id=s[0]=='e'?0:1;
        t[++tot]=a[i].l-1;
        t[++tot]=a[i].r;
    }
    sort(t+1,t+tot+1);
    tot=unique(t+1,t+tot+1)-t-1;
    for(int i=1;i<=tot;i++) fa[i]=i;
    int ans=m,flag=0;
    for(int i=1;i<=m;i++){
        int x=lower_bound(t+1,t+tot+1,a[i].l-1)-t;
        int y=lower_bound(t+1,t+tot+1,a[i].r)-t;
        int fx=find(x),fy=find(y);
        if(fx==fy) {
            if((d[x]^d[y])!=a[i].id){
                ans=i-1;
                flag=1;
                break;
            }
        }
        else {
            fa[fx]=fy;
            d[fx]=d[x]^d[y]^a[i].id;
        }
    }
    printf("%d\n",ans);
    //system("pause");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章