1. 程式人生 > >POJ 1733 Parity game(加權並查集)

POJ 1733 Parity game(加權並查集)

題意:這是一個01的串,然後有m個類似於詢問的東西,每次詢問都告訴你這個區間的和為奇數還是偶數,讓你判斷正確的有幾句,如果不正確,直接跳出

思路:和華中科技大學的決賽差不多,我們將奇數設為1,偶數為0,那我們可以發現他們的奇偶性可以用異或代替,然後就穿一樣了,加上判斷條件就OK了,記得離散化

程式碼:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long
LL; inline LL read() { LL x=0,f=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int maxn=2e4+7; struct node { int x,y,w; }q[maxn]; int fa[maxn]; int
sum[maxn]; int sa[maxn]; int len; int Find(int x) { if(x!=fa[x]){ int t=fa[x]; fa[x]=Find(fa[x]); sum[x]^=sum[t]; } return fa[x]; } int main() { int n,m; while(~scanf("%d%d",&n,&m)){ len=0; int ans=0; bool
ok=false; char op[15]; for(int i=1;i<=m;i++){ int a,b,w; scanf("%d%d%s",&a,&b,op); if(op[0]=='e')w=0; else w=1; a--; q[i].x=a;q[i].y=b;q[i].w=w; sa[++len]=a; sa[++len]=b; } sort(sa+1,sa+1+len); len=unique(sa+1,sa+1+len)-sa-1; for(int i=0;i<=len;i++){ fa[i]=i; sum[i]=0; } for(int i=1;i<=m;i++){ int a=lower_bound(sa+1,sa+len+1,q[i].x)-sa; int b=lower_bound(sa+1,sa+len+1,q[i].y)-sa; int rta=Find(a); int rtb=Find(b); if(rta==rtb){ if(sum[a]==sum[b]&&q[i].w==1)break; if(sum[a]!=sum[b]&&q[i].w==0)break; ans++; } else{ fa[rta]=rtb; sum[rta]=sum[a]^sum[b]^q[i].w; ans++; } } printf("%d\n",ans); } return 0; } /* 10 5 1 2 even 3 4 odd 5 6 even 1 6 even 7 10 odd */