您的位置:首页 > 其它

POJ 1733 Parity game 离散化+带权并查集

2015-04-23 22:49 447 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66964#problem/H

题意:给定一系列关于连续区间的1的个数的奇偶性描述,判断第一次出现矛盾的位置。

思路:有了HDU 3038:http://blog.csdn.net/i_am_a_winer/article/details/45202985 的基础,这题就比较好理解了,把原来维护距离值变成维护与根节点的区间的1的个数的奇偶性。只是这题多了一个离散化。当然有了map离散化也就变得相对方便了许多。离散化之后,我么把对原来数的操作改为了对其映射值的操作,由于一一映射的关系,两者操作等效。比较蛋疼的是,我把pre和sum数组都换成map来做,代码和思路几乎一模一样,可就是WA了,真不知道为何。。

代码:

#include<iostream>
#include<cstdio>
#include<map>

using namespace std;

int pre[10010],sum[10010];
int N,M;
map<int,int> mp;//离散化
char s[10];

int find(int x){
if(x==pre[x]) return x;
int t=find(pre[x]);
sum[x]=(sum[x]+sum[pre[x]])%2;
return pre[x]=t;
}

int judge(int x,int y,int z){
int fx=find(x),fy=find(y);
if(fx==fy){
if((sum[x]+sum[y]+z)&1) return 0;
return 1;
}
pre[fy]=fx;
sum[fy]=((sum[x]+sum[y]+z)&1)? 1:0;
return 1;
}

int main(){
//freopen("D:\\in.txt","r",stdin);
cin>>N>>M;
for(int i=0;i<10010;i++) pre[i]=i,sum[i]=0;
int a,b,cnt,tot=0;
for(cnt=0;cnt<M;cnt++){
scanf("%d %d %s",&a,&b,s);
a--;
if(mp.count(a)==0) mp[a]=tot++;//把出现的每一个数赋予一个不同的值
if(mp.count(b)==0) mp[b]=tot++;
int d=(s[0]=='e')? 0:1;
if(judge(mp[a],mp[b],d)) continue;
break;
}
cout<<cnt<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: