您的位置:首页 > 其它

POJ 1733 Parity game

2013-11-28 01:06 274 查看
题意:对一个只由1和0组成的字符串,给出指令,a b even/odd,表示字符串中第a位到第b位之间的1的个数为even/odd(偶数/奇数)。给出m个指令,a,b <= 10^9,问第一个与前面指令矛盾的指令是哪一个,如果没有与前面矛盾的指令,就输出m。若m为0,则输出m。

解法:类似POJ 1182。首先设函数g(x)表示字符串的前x位含有1的个数,令g(0) = 0。则指令a b even/odd的信息转化为g(a-1)和g(b)的奇偶性是否相同。所以,建一个树,每个节点有两个参数,参数f表示其父亲节点的编号,参数r表示它与父亲节点的奇偶性是否相同。(0表示相同,1表示不同)。

   由于题目数据太大,a,b <= 10^9,但是m <= 5000,所以要离散化处理。

tag:并查集

/*
* Author:  Plumrain
* Created Time:  2013-11-27 17:53
* File Name: DS-POJ-1733.cpp
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>

using namespace std;

#define PB push_back

struct temp{
int a, b;
bool x;
char s[10];
};

struct node{
int f, r;
};

int n, m, all;
vector<int> ttt;
map<int, int> mp;
node a[10005];
temp tt[5005];

void init()
{
mp.clear();
ttt.clear();

scanf ("%d", &m);

if (!m)
return;

for (int i = 0; i < m; ++ i){
scanf ("%d%d%s", &tt[i].a, &tt[i].b, tt[i].s);

if (tt[i].a > tt[i].b)
swap(tt[i].a, tt[i].b);

-- tt[i].a;
if (tt[i].s[0] == 'e') tt[i].x = 0;
else tt[i].x = 1;
ttt.PB (tt[i].a); ttt.PB (tt[i].b);
}

sort(ttt.begin(), ttt.end());
int tmp = ttt[0], sz = ttt.size();
all = 0;
mp[tmp] = all++;
for (int i = 1; i < sz; ++ i) if (ttt[i] != tmp){
tmp = ttt[i];
mp[tmp] = all++;
}

for (int i = 0; i < all; ++ i){
a[i].f = i;
a[i].r = 0;
}
}

int find(int x)
{
if (x != a[x].f){
int y = a[x].f;
a[x].f = find(a[x].f);
a[x].r = (a[x].r + a[y].r) % 2;
}
return a[x].f;
}

void merge(int ta, int tb, bool x, int fa, int fb)
{
a[fb].f = fa;
a[fb].r = (a[ta].r + a[tb].r + x) % 2;
}

bool ok(int ta, int tb, bool x, int fa, int fb)
{
return x == ((a[ta].r + a[tb].r) % 2);
}

int gao()
{
bool x;
int ta, tb, fa, fb;
for (int i = 0; i < m; ++ i){
ta = mp[tt[i].a]; tb = mp[tt[i].b]; x = tt[i].x;
fa = find(ta); fb = find(tb);

if (fa != fb)
merge(ta, tb, x, fa, fb);
else
if (!ok(ta, tb, x, fa, fb)) return i;
}
return m;
}

int main()
{
int n;
while (scanf ("%d", &n) != EOF){
init();
if (!m) printf ("0\n");
else printf ("%d\n", gao());
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: