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的个数为偶 ...
随机推荐
- A Recipe for Training Neural Networks [中文翻译, part 1]
最近拜读大神Karpathy的经验之谈 A Recipe for Training Neural Networks https://karpathy.github.io/2019/04/25/rec ...
- 一个小仓鼠的js动画
直接在网页打开就可以玩了: http://cdn.abowman.com/widgets/hamster/hamster.swf?up_bodyColor=f0e9cc&up_feetColo ...
- Docker学习笔记_安装和使用Python
一.实验目标 在Docker里安装Python3.5 二.准备 1.宿主机OS:Win10 64 2.虚拟机OS:Ubuntu18.04 3.操作账号:Docker 二.安装过程 1.搜索Python ...
- Apache htpasswd命令
一.简介 htpasswd是apache的一个工具,该工具主要用于建立和更新存储用户名.密码的文本文件,主要用于对基于http用户的认证. 二.语法 Usage: htpasswd [-cimBdps ...
- https抓包
- MVC异常过滤器在三种作用范围下的执行顺序
对于一般过滤器(即:除了IExceptionFilter ),当同时在Controller和Action中都设置了同一个过滤器后(例如IActionFilter),执行顺序一般是由外到里,即“全局”- ...
- Redesign Your App for iOS 7 之 页面布局【转】
前言 iOS7是目前iOS史上最颠覆的一次改版. 它的出现令人兴奋,因为它将会带我们进入一个全新的时代: 它的到来也让我们忧心,因为它颠覆了一切,包括我们过去做过的很多努力. 但是,相信大家乐意为这个 ...
- phpmyadmin安全预防
头疼的安全 之前服务器总是本人黑,千疮百孔,只能一步步的去做一些安全防范,如何防范自然先从如何渗透开始. 文章及建议 前段时间看到了个phpmyadmin提权的教程,很多人都说现在那里还有root帐号 ...
- Transaction And Lock--快照事务隔离级别
--================================================--准备数据GOCREATE DATABASE DB5GOUSE DB5GOCREATE TABLE ...
- JavaScript中事件冒泡之实例理解
此#btnComfirmChooseCompany是Bootstrap模态弹层上的按钮,但点击后,点击事件被Bootstrap外层监听到了, 效果就是模态弹出层被关闭了,所以,我不想这个点击事件被&q ...