POJ_1733 Parity game 【并查集+离散化】
一、题面
二、分析
该题与之前做过的带权并查集的唯一区别就是数组开不下。所以需要用离散化的思想,只取那些有用的点来解决该问题。
离散化其实就是把这些所有用到的点收集后,去重,再排一下序,然后用新数组它们的下标代表他们。
接下来数组能开下了,就用带权并查集的做法去做,这里权值可以直接用bool值,然后随便写几个发现是异或关系。
但需要注意,这里还是需要将输入的坐标往左移一下,直接不去考虑同一个点的情况。
三、AC代码
#include <cstdio>
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std; const int MAXN = 1e4+;
int par[MAXN], A[MAXN], B[MAXN];
int Temp[MAXN], Cnt;
bool Rank[MAXN], Odd[MAXN]; void Init()
{
memset(par, -, sizeof(par));
memset(Rank, , sizeof(Rank));
} int Pos(int x)
{
int left = , right = Cnt-, mid;
while(left <= right)
{
mid = (left+right)>>;
if(Temp[mid] == x)
return mid;
else if(Temp[mid] > x)
right = mid-;
else
left = mid+;
}
return -;
} int Find(int x)
{
if(par[x] == -) return x;
int t = Find(par[x]);
Rank[x] = Rank[x]^Rank[par[x]];
return par[x] = t;
} bool Union(int x, int y, bool flag)
{
int fx = Find(x);
int fy = Find(y);
if(fx == fy)
{
return (flag^Rank[y]) == Rank[x];
}
else
{
par[fx] = fy;
Rank[fx] = flag^Rank[y]^Rank[x];
return true;
}
} int main()
{
//freopen("input.txt", "r", stdin);
int N, T, ans;
char op[];
while(scanf("%d", &N)!=EOF)
{
Cnt = ;
Init();
scanf("%d", &T);
for(int i = ; i < T; i++)
{
scanf("%d %d %s", &A[i], &B[i], op);
A[i]--; //***
Temp[Cnt++] = A[i];
Temp[Cnt++] = B[i];
Odd[i] = (op[] == 'o');
}
sort(Temp, Temp + Cnt);
Cnt = unique(Temp, Temp+Cnt) - Temp;
int x, y;
ans = T; for(int i = ; i < T; i++)
{
x = Pos(A[i]);
y = Pos(B[i]);
if(!Union(x, y, Odd[i]))
{
ans = i;
break;
}
}
printf("%d\n", ans);
}
return ;
}
POJ_1733 Parity game 【并查集+离散化】的更多相关文章
- POJ - 1733 Parity game 种类并查集+离散化
思路:d(i, j)表示区间(i, j]的1的个数的奇偶性.输入最多共有5000*2个点,需要离散化处理一下.剩下的就是并查集判冲突. AC代码 #include <cstdio> #in ...
- poj 1733 Parity game(带权并查集+离散化)
题目链接:http://poj.org/problem?id=1733 题目大意:有一个很长很长含有01的字符串,长度可达1000000000,首先告诉你字符串的长度n,再给一个m,表示给你m条信息, ...
- [POJ1733]Parity game(并查集 + 离散化)
传送门 题意:有一个长度已知的01串,给出[l,r]这个区间中的1是奇数个还是偶数个,给出一系列语句问前几个是正确的 思路:如果我们知道[1,2][3,4][5,6]区间的信息,我们可以求出[1,6] ...
- poj1733(种类并查集+离散化)
题目链接: http://poj.org/problem?id=1733 题意: 输入n表示有一个长度为n的0,1字符串, m表示接下来有m行输入, 接下来的m行输入中x, y, even表示第x到第 ...
- BZOJ-4195 NOI2015Day1T1 程序自动分析 并查集+离散化
总的来说,这道题水的有点莫名奇妙,不过还好一次轻松A 4195: [Noi2015]程序自动分析 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 836 ...
- HDU 1856 More is better(并查集+离散化)
题目地址:HDU 1856 水题.因为标号范围太大,而数据数仅仅有10w,所以要先进行离散化.然后就是裸的并查集了. 代码例如以下: #include <iostream> #includ ...
- BZOJ 4195: [Noi2015]程序自动分析 并查集+离散化
LUOGU 1955BZOJ 4195 题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量 ...
- bzoj4195(并查集+离散化)
题目大意:给出n个变量互相的相等或不等关系,求这些关系是否矛盾 思路:把相等的变量加入并查集,不等的查询是否合法 eg:数据很大,离散化(然而我用的是map) #include<stdio.h& ...
- poj1733(并查集+离散化)
题目大意:有一个长度为n的0,1字符串, 给m条信息,每条信息表示第x到第y个字符中间1的个数为偶数个或奇数个, 若这些信息中第k+1是第一次与前面的话矛盾, 输出k; 思路:x, y之间1的个数为偶 ...
随机推荐
- 代码查看import的类是出自哪个jar包的方法(转)
import java.security.ProtectionDomain; import java.security.CodeSource; public static void main(Stri ...
- 【转】LVS/Nginx如何处理session问题
原文地址:http://network.51cto.com/art/201005/200279.htm 通过设置persistence的值,使session会话保持. [51CTO.com独家特稿]业 ...
- numpy ndarray 返回 index 问题
经常遇到需要返回满足条件的index. python中没有which函数,但有列表推导式, 可以实现类似功能 y= np.array([3,2,5,20]) yOut[131]: array([ 3, ...
- React项目中的registerServiceWorker的作用
在公司的React前端项目中,发现有一个registerServiceWorker.js文件, 很久都没弄明白这个文件是干什么用的,查询了一些资料后,了解了一些 service worker是在后台运 ...
- php抓取网页中的内容
以下就是几种常用的用php抓取网页中的内容的方法.1.file_get_contentsPHP代码代码如下:>>>>>>>>>>>&g ...
- (转)EASYUI+MVC4通用权限管理平台
原文地址:http://www.cnblogs.com/hn731/archive/2013/07/15/3190947.html 通用权限案例平台在经过几年的实际项目使用,并取得了不错的用户好评.在 ...
- (转)每位设计师都应该拥有的50个CSS代码片段
原文地址:http://www.cnblogs.com/fengyuqing/archive/2013/06/15/css_50.html 面对每年如此多的 新趋势 ,保持行业的领先是个很困难问题. ...
- Git代码冲突常见解决方法
在发布这个配置文件的时候,会发生代码冲突: error: Your local changes to the following files would be overwritten by merge ...
- 解决chrome浏览器无法得到window.showModalDialog返回值的问题
父页面处理: function ProductList() { var TypeID = window.document.getElementById("Type").valu ...
- Android中如何下载文件并显示下载进度
原文地址:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1125/2057.html 这里主要讨论三种方式:AsyncTask.Serv ...