传送门

题意:有一个长度已知的01串,给出[l,r]这个区间中的1是奇数个还是偶数个,给出一系列语句问前几个是正确的

思路:如果我们知道[1,2][3,4][5,6]区间的信息,我们可以求出[1,6]的信息

   可以将将闭区间[x,y]转换成(x - 1,y]左开右闭区间

   那么我们可以用并查集来做,每次输入两个数 x 和 y 判断两者是否在同一并查集中,如果在,那么可以直接判断奇偶

   如果两者不在同一并查集中将两者合并,并求出两者的根之间的距离

   距离可在 find 函数中维护

注意:数据范围比较大,需要离散化

——代码

 #include <cstdio>
#include <iostream>
#include <algorithm>
#define N 1000001 int n, m, cnt, ans;
int a[N], b[N], q[N << ], f[N << ], d[N << ];
char s[N][]; inline int read()
{
int x = , f = ;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
return x * f;
} inline int find(int x)
{
if(x ^ f[x])
{
int fx = f[x];
f[x] = find(f[x]);
d[x] = d[x] ^ d[fx];
}
return f[x];
} int main()
{
int i, x, y, fx, fy;
while(scanf("%d", &n) != EOF)
{
m = read();
ans = cnt = ;
for(i = ; i <= m; i++)
{
a[i] = read() - ;
b[i] = read();
scanf("%s", s[i]);
q[++cnt] = a[i];
q[++cnt] = b[i];
}
std::sort(q + , q + cnt + );
cnt = std::unique(q + , q + cnt + ) - q - ;
for(i = ; i <= cnt; i++) f[i] = i, d[i] = ;
for(i = ; i <= m; i++)
{
x = std::lower_bound(q + , q + cnt + , a[i]) - q;
y = std::lower_bound(q + , q + cnt + , b[i]) - q;
fx = find(x);
fy = find(y);
if(fx == fy)
{
if((d[x] == d[y]) == (s[i][] == 'o')) break;
}
else
{
f[fx] = fy;
d[fx] = d[x] ^ d[y] ^ (s[i][] == 'o');
}
ans++;
}
printf("%d\n", ans);
}
return ;
}

[POJ1733]Parity game(并查集 + 离散化)的更多相关文章

  1. POJ_1733 Parity game 【并查集+离散化】

    一.题面 POJ1733 二.分析 该题与之前做过的带权并查集的唯一区别就是数组开不下.所以需要用离散化的思想,只取那些有用的点来解决该问题. 离散化其实就是把这些所有用到的点收集后,去重,再排一下序 ...

  2. poj1733(种类并查集+离散化)

    题目链接: http://poj.org/problem?id=1733 题意: 输入n表示有一个长度为n的0,1字符串, m表示接下来有m行输入, 接下来的m行输入中x, y, even表示第x到第 ...

  3. POJ - 1733 Parity game 种类并查集+离散化

    思路:d(i, j)表示区间(i, j]的1的个数的奇偶性.输入最多共有5000*2个点,需要离散化处理一下.剩下的就是并查集判冲突. AC代码 #include <cstdio> #in ...

  4. poj 1733 Parity game(带权并查集+离散化)

    题目链接:http://poj.org/problem?id=1733 题目大意:有一个很长很长含有01的字符串,长度可达1000000000,首先告诉你字符串的长度n,再给一个m,表示给你m条信息, ...

  5. poj1733(并查集+离散化)

    题目大意:有一个长度为n的0,1字符串, 给m条信息,每条信息表示第x到第y个字符中间1的个数为偶数个或奇数个, 若这些信息中第k+1是第一次与前面的话矛盾, 输出k; 思路:x, y之间1的个数为偶 ...

  6. poj1733(带权并查集+离散化)

    题目链接:http://poj.org/problem?id=1733 题意:给定由0.1组成的数串长度n,询问次数m,每次询问给出a,b,s,表示区间[a,b]内1的数量为s(odd-奇数或even ...

  7. BZOJ-4195 NOI2015Day1T1 程序自动分析 并查集+离散化

    总的来说,这道题水的有点莫名奇妙,不过还好一次轻松A 4195: [Noi2015]程序自动分析 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 836 ...

  8. poj1733 带权并查集

    题意:有一个 0/1 数列,现在有n组询问和回答,表示某个区间内有奇数或者偶数个1,问到前多少个都没有逻辑错误,而下一个就不满足 可以定奇数为 1 偶数为 0作为每个元素的权值,表示它与它的祖先元素的 ...

  9. HDU 1856 More is better(并查集+离散化)

    题目地址:HDU 1856 水题.因为标号范围太大,而数据数仅仅有10w,所以要先进行离散化.然后就是裸的并查集了. 代码例如以下: #include <iostream> #includ ...

随机推荐

  1. nova service-list for juno kilo,liberty openstack

  2. 64. Extjs中grid 的ColumnModel 属性配置

    转自:https://blog.csdn.net/u011530389/article/details/45821945 本文导读:Ext.grid.ColumnModel 该类用于定义表格的列模型, ...

  3. ubuntu/linuxmint下java环境变量设置

    1.root权限下使用vi或gedit打开/etc目录下的profile文件,末尾加入环境变量. 1)命令: sudo gedit /etc/profile 2)环境变量个人案例: export JA ...

  4. jeesite自定义主题

    jeesite cms首页太丑不够逼格,然而国内有很多高大上的皮肤供你选择,那么本文就一步一步教你如何定制自己的CMS站点视图. 1.下载 jeesite 源码,并安装配置成功 2.进入jeesite ...

  5. eclipse.ini启动参数配置的解析及方法

    原文地址 - http://www.uzzf.com/news/18444.html 1.先了解下JVM内存管理机制,JVM内存分为堆内存和非堆内存 2.JVM内存限制 首先JVM内存限制于实际的最大 ...

  6. sql简单学习---备忘

    2:Hibernate public boolean deleteFlowerById(int id) { Session session = sessionFactory.openSession() ...

  7. markdownpad2下载安装教程

    1.下载安装 http://markdownpad.com/download/markdownpad2-setup.exe 直接下载,安装过程中提醒要安装微软的一个什么环境,不用理会直接跳过,实测没有 ...

  8. 个人微信二次开发API接口

    通过这个API接口可以做什么? 通过我们提供的API接口您可以开发: 工作手机(如:X创,X码,XX管家等) 微信群讲课软件(如:讲课X师,一起X堂等) 微信社群管理软件(如:小X管家,微X助手等) ...

  9. 342 Power of Four 4的幂

    给定一个整数 (32位有符整数型),请写出一个函数来检验它是否是4的幂.示例:当 num = 16 时 ,返回 true . 当 num = 5时,返回 false.问题进阶:你能不使用循环/递归来解 ...

  10. 327 Count of Range Sum 区间和计数

    Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...