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的个数为偶 ...
随机推荐
- c语言实践打印字母三角形
效果如下: int main(void) { char ch = 'A';//当前要打印的字符 ;//每行要打印字符的个数 ; i < ; i++,count++) { ; j < cou ...
- Shiro——概述
Apache Shiro 是 Java 的一个安全(权限)框架. Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE 环境,也可以用在 JavaEE 环境. Shiro 可以完成 ...
- location.replace() keeps the history under control
from https://dev.opera.com/articles/efficient-javascript Occasionally, it is necessary to change the ...
- mysql_init调用卡住原因分析
有同学做类似如下的操作: class X { public: X() // 类X的构造函数ctor { _mysql_handler = mysql_init(NULL); } }; // 定义类X的 ...
- Spring学习整理-MyEclipse设置xml自动提示
操作流程如下图: 1.找到:MyEclipse中打开window–>Preferences–>MyEclipse –>Files and Editors –>XML–>X ...
- (转)mongodb学习(翻译1)
原文地址:http://www.cnblogs.com/Johnzhang/archive/2013/09/10/3313582.html 学习mongodb,试着翻译写,英语能力有限,希望大家指正, ...
- 20169219 SQL注入实验报告
实验介绍 SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术.通过把SQL命令插入到Web表单提交框.输入域名框或页面请求框中,最终欺骗服务器执行恶意的SQL命令. 在 ...
- 通过fork函数创建进程的跟踪,分析linux内核进程的创建
作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验过程 1.打开gdb, ...
- C语言编程学习开发的俄罗斯方块小游戏
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- linux下关闭防火墙命令
今天使用linux虚拟机搭建jenkins,但是在虚拟机内部使用浏览器可以访问jenkins主页,在物理机上却无法访问jenkins主页,查找原因后是因为linux虚拟机没有关闭防火墙,关闭防火墙后, ...