Poj1733 Parity Game(带权并查集)
题面
题解
反正只要你判断是否满足区间的奇偶性,假设每一位要么是$1$要么是$0$好了。
假设有$S$的前缀和为$sum[]$,则有:
若$S[l...r]$中有奇数个$1$,则$sum[l-1]$与$sum[r]$不同奇偶;反之,则同奇偶
用一个带权并查集维护,设权值数组$s[i]$表示区间$[root[i]...i]$的和的奇偶性。
对于一个区间$[l,r]$,分情况讨论:
如果$root[l]=root[r]$,直接判断就行了。
否则的话,计算一下$s[fv]=t\oplus s[u]\oplus s[v]$
但是$n$太大了,需要离散化(懒人离散化用$map$,美滋滋)
#include <map>
#include <cstdio>
#include <cstring>
using std::map;
typedef long long ll;
const ll N = 1e4 + 10, Q = 5e3 + 10;
ll n, q, s[N], f[N], cnt;
map <ll, ll> m;
ll find (ll x) {
if(f[x] == -1) return x;
ll tmp = find(f[x]);
s[x] ^= s[f[x]];
return f[x] = tmp;
}
ll insert (ll x) {
if (m.find(x) == m.end()) m[x] = ++cnt;
return m[x];
}
int main() {
while (scanf ("%lld%lld", &n, &q) != EOF) {
char str[4];
memset(f, -1, sizeof f);
memset(s, 0, sizeof s);
ll ans = q;
for (register ll i = 1, u, v; i <= q; ++i) {
scanf ("%lld%lld%s", &u, &v, str);
if (ans < q) continue;
u = insert(u - 1), v = insert(v);
ll fu = find(u), fv = find(v);
ll t = 0;
if (str[0] == 'o') ++t;
if (fu == fv) { //root相等
if (s[u] ^ s[v] != t)
ans = i - 1;
} else { //一定有fu<fv(编号比较)
f[fv] = fu;
s[fv] = s[u] ^ s[v] ^ t;
//矢量的异或运算
}
}
printf ("%lld\n", ans);
}
return 0;
}
Poj1733 Parity Game(带权并查集)的更多相关文章
- poj1733 Parity game[带权并查集or扩展域]
地址 连通性判定问题.(具体参考lyd并查集专题该题的转化方法,反正我菜我没想出来).转化后就是一个经典的并查集问题了. 带权:要求两点奇偶性不同,即连边权为1,否则为0,压缩路径时不断异或,可以通过 ...
- URAL - 1003:Parity (带权并查集&2-sat)
Now and then you play the following game with your friend. Your friend writes down a sequence consis ...
- POJ1733 Party game [带权并查集or扩展域并查集]
题目传送 Parity game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10870 Accepted: 4182 ...
- POJ 1773 Parity game 带权并查集
分析:带权并查集,就是维护一堆关系 然后就是带权并查集的三步 1:首先确定权值数组,sum[i]代表父节点到子节点之间的1的个数(当然路径压缩后代表到根节点的个数) 1代表是奇数个,0代表偶数个 2: ...
- POJ 1733 Parity game (带权并查集)
题意:有序列A[1..N],其元素值为0或1.有M条信息,每条信息表示区间[L,R]中1的个数为偶数或奇数个,但是可能有错误的信息.求最多满足前多少条信息. 分析:区间统计的带权并查集,只是本题中路径 ...
- 【poj1733】Parity game--边带权并查集
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15776 Accepted: 5964 Description Now ...
- POJ1733 Parity game 【带权并查集】*
POJ1733 Parity game Description Now and then you play the following game with your friend. Your frie ...
- POJ1733:Parity Game(离散化+带权并查集)
Parity Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12853 Accepted: 4957 题目链接 ...
- POJ-1733 Parity game(带权并查集区间合并)
http://poj.org/problem?id=1733 题目描述 你和你的朋友玩一个游戏.你的朋友写下来一连串的0或者1.你选择一个连续的子序列然后问他,这个子序列包含1的个数是奇数还是偶数.你 ...
随机推荐
- 51nod 1873 高精度计算
JAVA BigDecimal import java.util.*; import java.math.*; public class Main { public static void main( ...
- bzoj 2038 莫队入门
http://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意:多次询问区间内取出两个相同颜色的种类数 思路:由于不是在线更新,那么可以进行离线查询,而 ...
- Jenkins有用的插件
1. Multijob plugin: 多个任务同时运行 2. ssh slave plugin: 用于安装slave? Allows to launch over ssh, using a java ...
- Windows下端口占用查看
假如我们需要确定谁占用了我们的80端口 1.Windows平台在windows命令行窗口下执行:C:\>netstat -aon|findstr "80" TCP 1 ...
- Microsoft Visual Studio TFS 切换登录用户的方法
方法一 用VS2012开发项目,一直困扰着我的是不知道怎么去切换TFS的登录帐户,因为每次TFS都是用默认的账户连接到TFS服务器,有时想切换另一个用户登录TFS服务器, 不知道从何下手,今天总算找到 ...
- JQGrid 导出Excel 获取筛选条件
需求描述:页面加载后,进行相关数据搜索,要求点击导出按钮后 下载Excel文件. 思路:希望在点击[导出Excel]按钮时,获取到表格搜索时的filters内容. 在百度.api.jqgrid.js ...
- web服务器和数据库服务器不在一台机器上
把localhost改成数据库所在的IP就行了. $link=mysql_connect( "202.195.246.202 ", "root ", " ...
- netlink socket编程
转载 原文地址:netlink socket编程之why & how (转) 作者:renyuan000 作者: Kevin Kaichuan He@2005-1-5 翻译整理:duanjig ...
- rtems-os-source
http://blog.csdn.net/xpx3216/article/details/5776941 http://tech.hqew.com/fangan_421204 https://gith ...
- C中级 消息队列设计
引言 - 补充好开始 消息队列在游戏服务器层应用非常广泛. 应用于各种耗时的IO操作业务上.消息队列可以简单理解为 [消息队列 = 队列 + 线程安全]本文参照思路如下, 最后献上一个大神们斗法的场 ...