1. 程式人生 > >poj 1733 Parity game

poj 1733 Parity game

map hid str std lap har sca find 並查集

有n個數字,不知道具體是多少,給q個信息。

每個信息給一個區間[l,r]。並告訴這個區間的奇數有多少個,問第一個錯誤的信息是第幾個。

可以把每個區間的左端點-1的根看做右端點的根的根,用並查集維護一個到根點的1的個數是奇數還是偶數即可。

註意得離散化。

技術分享圖片
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
const int M = 2e5+7; int n,q,tot=0; int f[M],cnt[M],l[M],r[M],op[M],ls[M],num[M]; map<int,int> mp; void init(int n){//0==even for(int i=0;i<=n;i++) f[i]=i,cnt[i]=0; } int find(int x){ if(x==f[x]) return x; int tmp=f[x]; f[x]=find(f[x]); cnt[x]^=cnt[tmp]; return f[x]; } int
main(){ freopen("1.in","r",stdin); freopen("1.out","w",stdout); scanf("%d",&n); scanf("%d",&q); char s[10]; for(int i=1;i<=q;i++){ scanf("%d%d%s",&l[i],&r[i],s);l[i]-=1; if(s[0]==o) op[i]=1; else op[i]=0; ls[++tot]=l[i];ls[++tot]=r[i]; } sort(ls
+1,ls+tot+1); tot=unique(ls+1,ls+tot+1)-ls-1; init(tot); for(int i=1;i<=q;i++){ int posl=lower_bound(ls+1,ls+tot+1,l[i])-ls,posr=lower_bound(ls+1,ls+tot+1,r[i])-ls; int fx=find(posl),fy=find(posr); if(fx==fy){ if((cnt[posl]+op[i])%2!=cnt[posr]){ printf("%d\n",i-1); return 0; } } else{ f[fy]=fx; cnt[fy]=(2+cnt[posl]-cnt[posr]+op[i])%2; } } printf("%d\n",q); return 0; }
View Code

poj 1733 Parity game