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:并查集
View Code
解法:类似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
相关文章推荐
- POJ 1733 Parity game(路径压缩并查集+离散化)
- POJ 1733 parity game (hash离散+并查集)
- POJ 1733 Parity game(离散化+带权并查集)
- poj 1733 Parity game 离散化+带权并查集(区间)
- POJ 1733 Parity game 【带权并查集】
- poj 1733 Parity game
- POJ 1733 Parity game 笔记
- poj 1733 Parity game(带权并查集)
- POJ 1733 Parity game(并查集)
- poj 1733 Parity game (并查集+向量偏移)
- Poj 1733 Parity Game(离散化+并查集)
- POJ 1733 Parity Game
- poj 1733 Parity game(种类并查集)
- POJ 1733 Parity game(离散化+带权并查集)
- POJ 1733 Parity game(并查集巧解)
- poj 1733 Parity game 【种类并查集+离散化】
- POJ 1733 Parity game(种类并查集+哈希)
- POJ 1733 Parity game (离散化+带权并查集)
- POJ-1733-Parity game
- POJ ~ 1733 ~ Parity game (带权并查集+map离散化)