poj1733 Parity game[带权并查集or扩展域]
连通性判定问题。(具体参考lyd并查集专题该题的转化方法,反正我菜我没想出来)。转化后就是一个经典的并查集问题了。
带权:要求两点奇偶性不同,即连边权为1,否则为0,压缩路径时不断异或,可以通过0或1得到两点的关系。合并时解一个位运算的方程,可得一个根连向另一个根的权值,看code,就不细讲了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define dbg(x) cerr<<#x<<" = "<<x<<endl
#define ddbg(x,y) cerr<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<endl
using namespace std;
typedef long long ll;
template<typename T>inline char MIN(T&A,T B){return A>B?A=B,:;}
template<typename T>inline char MAX(T&A,T B){return A<B?A=B,:;}
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=+;
struct kishin_sagume{
int l,r,p;
}q[N];
int a[N<<],fa[N<<],d[N<<];
int L,n,m,x,y,fx,fy,flag,i;
inline int Get(int x){
if(fa[x]==x)return x;
int ret=Get(fa[x]);d[x]^=d[fa[x]];
return fa[x]=ret;
} int main(){//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);
read(L),read(n);char s[];
for(i=;i<=n;++i){
read(q[i].l),read(q[i].r),a[++m]=--q[i].l,a[++m]=q[i].r;
scanf("%s",s);q[i].p=s[]=='o';
}
sort(a+,a+m+),m=unique(a+,a+m+)-a-;
for(i=;i<=m;++i)fa[i]=i;
for(i=;i<=n;++i){
x=lower_bound(a+,a+m+,q[i].l)-a,y=lower_bound(a+,a+m+,q[i].r)-a;
fx=Get(x),fy=Get(y);
if(fx^fy)fa[fx]=fy,d[fx]=q[i].p^d[x]^d[y];
else if(d[x]^d[y]^q[i].p)break;
}
return printf("%d\n",i-),;
}
扩展域:同奇偶时连奇数域和偶数域分别连边,否则交错,边的含义是可以产生关系,或者说可以推出。已知他是满足传递性的。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define dbg(x) cerr<<#x<<" = "<<x<<endl
#define ddbg(x,y) cerr<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<endl
using namespace std;
typedef long long ll;
template<typename T>inline char MIN(T&A,T B){return A>B?A=B,:;}
template<typename T>inline char MAX(T&A,T B){return A<B?A=B,:;}
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=+;
struct matara_okina{
int l,r,p;
}q[N];
int a[N<<],fa[N<<];
int L,n,m,x,y,i;
inline int Get(int x){
return fa[x]^x?fa[x]=Get(fa[x]):x;
} int main(){//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);
read(L),read(n);char s[];
for(i=;i<=n;++i){
read(q[i].l),read(q[i].r),a[++m]=--q[i].l,a[++m]=q[i].r;
scanf("%s",s);q[i].p=s[]=='o';
}
sort(a+,a+m+),m=unique(a+,a+m+)-a-;
for(i=;i<=(m<<);++i)fa[i]=i;
for(i=;i<=n;++i){
x=lower_bound(a+,a+m+,q[i].l)-a,y=lower_bound(a+,a+m+,q[i].r)-a;
if(q[i].p){
if(Get(x)==Get(y))break;
fa[Get(x)]=Get(y+m),fa[Get(x+m)]=Get(y);
}
else{
if(Get(x)==Get(y+m))break;
fa[Get(x)]=Get(y),fa[Get(x+m)]=Get(y+m);
}
}
return printf("%d\n",i-),;
}
poj1733 Parity game[带权并查集or扩展域]的更多相关文章
- POJ1733 Party game [带权并查集or扩展域并查集]
题目传送 Parity game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10870 Accepted: 4182 ...
- URAL - 1003:Parity (带权并查集&2-sat)
Now and then you play the following game with your friend. Your friend writes down a sequence consis ...
- 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 题目链接 ...
- Poj1733 Parity Game(带权并查集)
题面 Poj 题解 反正只要你判断是否满足区间的奇偶性,假设每一位要么是\(1\)要么是\(0\)好了. 假设有\(S\)的前缀和为\(sum[]\),则有: 若\(S[l...r]\)中有奇数个\( ...
- POJ-1733 Parity game(带权并查集区间合并)
http://poj.org/problem?id=1733 题目描述 你和你的朋友玩一个游戏.你的朋友写下来一连串的0或者1.你选择一个连续的子序列然后问他,这个子序列包含1的个数是奇数还是偶数.你 ...
随机推荐
- Lua学习六----------Lua流程控制
© 版权声明:本文为博主原创文章,转载请注明出处 Lua流程控制 - 通过程序设定一个或多个条件语句 - 在条件为true时执行指定程序代码,在条件为false时指定其他指定程序代码 - 控制结构语句 ...
- netbeans xdebug
xdebug配置 装了wamp后,xdebug默认就安装好了,为了能够用netbeans远程调试,配置文件里得加几句 [xdebug] xdebug.remote_enable = on xdebug ...
- python学习(十四)面向对象
Python中的面向对象,先写类,会生成类对象,类对象然后创建对象,对象就可以拿来用了. Python支持多重继承. class语句创建类对象,并将其赋值给变量名. class语句内的赋值语句会创建类 ...
- 30天自制操作系统(三)进入32位模式并导入C语言
1 制作真正的IPL IPL(Initial Program Loader),启动程序装载器,但是之前并没有实质性的装载任何程序,这次作者要开始装载程序了. 虽然现在开发的操作系统啥功能也没有,作者说 ...
- InputFormat的认识
InputFormat 负责处理MR的输入部分. 有三个作用: 一.验证作业的输入是否规范. 二.把输入文件切分成InputSplit. 三.提供RecordReader 的实现类,把InputSpl ...
- Idftp.DirectoryListing 里面的内容为什么会是空的呢?(转)
最近在项目中要用到FTP上传,用的是delphi的IdFTP控件,用IdFtp.List(list),发现List里面有内容,可 是到IdFtp.DirectoryListing.Items[iCou ...
- 关于erlang的-run 的启动参数
在github上,关于erlang的一致性hash,有erlang-ryng和 hash_ring .在这里先聊下erlang-ryng这个. 在erlang-ryng的启动方式上,github上提供 ...
- CString 成员函数用法大全(转)
CString( );例:CString csStr; CString( const CString& stringSrc );例:CString csStr("ABCDEF中文12 ...
- 【BZOJ2151】种树 双向链表+堆(模拟费用流)
[BZOJ2151]种树 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n. ...
- 2-phase-commit 3-phase-commit
2 prepare commit rollback acknowledge