Parity game(带权并查集+离散化)
题目链接 //kuangbin
题意:
现在你和你的朋友正在玩一种游戏。 你的朋友写下一串0和1的序列,然后你选择其中一串子序列(如[3,5])并且问他这个序列是包含奇数个1还是偶数个1(和是奇数还是偶数)。 你可以问你的朋友任意个问题,而你的朋友会回答你的问题。 你的任务是猜出整个朋友的序列。但是,你发现你的朋友告诉你的信息可能有误,所以你想写一个程序来指出他的错误。这个程序应该接受一系列你的问题和答案。程序的目标是找到第一个错误的答案。
思路:
由之前做树状数组的题目经验得到,左区间可以-1,使得连贯起来。
因为1e9很大数组开不下,所以离散化(这一步要在左区间-1的步骤之后)。
带权。
#include<iostream>
#include<cstdio>
#include <cctype>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#include<map>
using namespace std;
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
#define se second
#define fi first
const ll mod=;
const int INF= 0x3f3f3f3f;
const int N=2e5+; int n,m;
int f[N];
int book[N];
int sum[N];
vector<int>v; struct node
{
int f,s;
}a[N];
string str; int getf(int x)
{
if(x!=f[x])
{
int t=f[x];
f[x]=getf(f[x]);
sum[x]+=sum[t]; // 其实sum[x]^=sum[t]也行,更快,110ms
}
return f[x];
}
int main()
{
cin>>n>>m;
int ans=;
for(int i=;i<=N;i++) f[i]=i; for(int i=;i<=m;i++)
{
scanf("%d%d",&a[i].f,&a[i].s);
if(a[i].f>a[i].s) swap(a[i].f,a[i].s);
a[i].f--;
v.push_back(a[i].f);
v.push_back(a[i].s); cin>>str;
if(str[]=='o') book[i]=;
else book[i]=;
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()) , v.end()); for(int i=;i<=m;i++)
{
a[i].f= lower_bound(v.begin(),v.end(),a[i].f)-v.begin()+;
a[i].s= lower_bound(v.begin(),v.end(),a[i].s)-v.begin()+;
int f1=getf(a[i].f);
int f2=getf(a[i].s);
if(f1!=f2)
{
f[f1]=f2;
sum[f1]=sum[a[i].s]+book[i]-sum[a[i].f]; //sum[f1]=sum[a[i].s]^book[i]^sum[a[i].f]
ans++;
}
else
{
if( abs(sum[a[i].f]-sum[a[i].s]) % != book[i] ) break; //一定要abs。
else ans++;
}
}
cout<<ans<<endl; }
Parity game(带权并查集+离散化)的更多相关文章
- poj 1733 Parity game(带权并查集+离散化)
题目链接:http://poj.org/problem?id=1733 题目大意:有一个很长很长含有01的字符串,长度可达1000000000,首先告诉你字符串的长度n,再给一个m,表示给你m条信息, ...
- POJ 1773 Parity game 带权并查集
分析:带权并查集,就是维护一堆关系 然后就是带权并查集的三步 1:首先确定权值数组,sum[i]代表父节点到子节点之间的1的个数(当然路径压缩后代表到根节点的个数) 1代表是奇数个,0代表偶数个 2: ...
- poj1733(带权并查集+离散化)
题目链接:http://poj.org/problem?id=1733 题意:给定由0.1组成的数串长度n,询问次数m,每次询问给出a,b,s,表示区间[a,b]内1的数量为s(odd-奇数或even ...
- URAL - 1003:Parity (带权并查集&2-sat)
Now and then you play the following game with your friend. Your friend writes down a sequence consis ...
- 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[带权并查集or扩展域]
地址 连通性判定问题.(具体参考lyd并查集专题该题的转化方法,反正我菜我没想出来).转化后就是一个经典的并查集问题了. 带权:要求两点奇偶性不同,即连边权为1,否则为0,压缩路径时不断异或,可以通过 ...
- poj 1733(带权并查集+离散化)
题目链接:http://poj.org/problem?id=1733 思路:这题一看就想到要用并查集做了,不过一看数据这么大,感觉有点棘手,其实,我们仔细一想可以发现,我们需要记录的是出现过的节点到 ...
- POJ1733:Parity Game(离散化+带权并查集)
Parity Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12853 Accepted: 4957 题目链接 ...
随机推荐
- [PHP] 浅谈 Laravel Authentication 的 guards 与 providers
从文档的简单介绍上来讲,有一些抽象. 个人感觉,对于概念上的大多数不理解主要还是来自于 文档不是讲设计思路,而是实际操作. 查看英文文档,通常来说可以给你最准确的直觉,而本地翻译一般比较字面或者带有理 ...
- 【ARM-Linux开发】用VS2013+VELT-0.1.4进行海思平台 Linux内核 的开发
1.1 什么是VELT VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件 ...
- Android Studio使用adb命令连接平板
有需要使用adb命令连接调试平板的同学可以参考下(下面是android官方文档,有点老). http://donandroid.com/how-to-install-adb-interface-dri ...
- PHP多进程编程初步
转自:https://www.pureweber.com/article/php-multi-process-programming-preview/ 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是 ...
- a++与++a,谈谈C++的参数传递
先看一段代码: #include<iostream> using namespace std; void func(int a, int b) { cout << a < ...
- .net core 读取、修改配置文件appsettings.json
.net core 设置读取JSON配置文件 appsettings.json Startup.cs 中 public class Startup { public Startup(IHostingE ...
- Python进阶(六)----装饰器
Python进阶(六)----装饰器 一丶开放封闭原则 开放原则: 增加一些额外的新功能 封闭原则: 不改变源码.以及调用方式 二丶初识装饰器 装饰器: 也可称装饰器函数,诠释开放封闭原则 ...
- Linux的巡检命令
# uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo # 查看CPU信息# hostname ...
- java实现顺序表、链表、栈 (x)->{持续更新}
1.java实现节点 /** * 节点 * @luminous-xin * @param <T> */ public class Node<T> { T data; Node& ...
- java基本结构
前言 Java文件的运行过程: 1,javac.exe:编译器 2,java.exe:解释器 微软shell下运行实例: C:\Users\Administrator>cd D:\文档\JAVA ...