poj 1733 Parity game 离散化+带权并查集(区间)

来源:互联网 发布:机器人仿真软件 编辑:程序博客网 时间:2024/05/28 15:47

点击打开链接

奇数个1 为奇,偶数个1为偶

rk[i] :区间 [根节点,i]的奇偶性

题意:要判断区间[l,r]的奇偶性是否为k,如果l-1,和r在同一集合中 则要满足rk[l-1]^k==rk[r] 

如果不在同一个集合,把小fx的当作根节点 求rk[fy] 画图求即可

#include <iostream>#include <algorithm>#include <cstring>#include <map>#include <vector>using namespace std;typedef long long ll;const int N=2e5+20;int fa[N],rk[N];//rk[i] 区间 [根节点~i]的奇偶性 vector<ll> p;struct node{ll x;ll y;int k;}a[N];int find(int x){if(x!=fa[x]){int t=fa[x];fa[x]=find(fa[x]);rk[x]^=rk[t];}return fa[x];}int main(){int ans=0,m;ll n;cin>>n>>m;for(int i=1;i<=N;i++){fa[i]=i;rk[i]=0;}for(int i=1;i<=m;i++){ int k;string s;cin>>a[i].x>>a[i].y>>s;if(s[0]=='e')a[i].k=0;elsea[i].k=1;p.push_back(a[i].x);p.push_back(a[i].y);}sort(p.begin(),p.end());int cnt=unique(p.begin(),p.end())-p.begin();for(int i=1;i<=m;i++){int l=lower_bound(p.begin(),p.begin()+cnt,a[i].x-1)-p.begin()+1;int r=lower_bound(p.begin(),p.begin()+cnt,a[i].y)-p.begin()+1;//cout<<a[i].x<<' '<<a[i].y<<endlint fx=find(l);int fy=find(r);if(fx==fy){if((rk[r]^a[i].k!=rk[l])){ans=i-1;break;}}else{//rk[fy]=rk[l]^(x~fy)//x~fy ^ rk[y] =k //两边同时Xor rk[y]//x~fy=k^rk[y] fa[fy]=fx;rk[fy]=a[i].k^rk[r]^rk[l];}}if(!ans) ans=m;cout<<ans<<endl;return 0;} 


0 0
原创粉丝点击