题目链接http://poj.org/problem?id=1733

题目大意:有一个很长很长含有01的字符串,长度可达1000000000,首先告诉你字符串的长度n,再给一个m,表示给你m条信息,接下来的m行每行包含x,y,even/odd,表示区间【x,y】中1的个数,even为偶数,odd为奇数。判断前几条是对的,也就是说假设k+1条信息与前面相互矛盾,就输出k,说明前k条正确。

例:
Sample Input

10
5
1 2 even
3 4 odd
5 6 even
1 6 even
7 10 odd

Sample Output

3

解题思路:wa了n多次,但是思路正确了,字符串长度太大,开不了那么大的数组,看了题解才知道还可以离散化。

如果不会离散化,就看下这个博客:https://blog.csdn.net/xiangaccepted/article/details/73276826

不过我没有用那里的方法离散化,直接看大佬的,用map离散化挺方便的,因为这些数本身大小不重要,而重要的是他们的相对关系,所以可以进行离散化处理。

做法就是运用带权并查集,区间【x,y】中1的个数为偶数时,说明前x-1个数和前y个数中1的个数奇偶性相同,反之区间【x,y】1的个数为奇数,说明前x-1个数和前y个数中1的个数奇偶性不同。我们就可以用一个关系数组relation【】存储该节点与其父亲节点的奇偶性是否一致(0相同,1不相同)。

然后问题就在于更新它们的关系域了

第一个是查找的时候,还要进行路径压缩,所以节点的关系域要更新。

假设做图是路径压缩前,右图是路径压缩后,我们把可以简单的对他们的关系进行枚举,就可以找到他们的关系了

relation【x】  relation【fx】  更新后relation【x】

0  0  0

0  1  1

1  0  1

1  1  0

很明显就是异或的关系,所以可以得到relation[x]=(relation[x]+relation[par[x]])%2,也就是relation[x]=relation[x]^relation[par[x]].

还有就是当两个元素的根不一样时需要合并两个集合,假如是将x所在集合的根rootx合并到y所在的集合的根rooty,这时候rootx的关系域也要进行更新,因为原本它的父亲节点是它自己,后来变成了rooty。

从左图变成右图,再作了一条辅助线,x->y便于理解下,我们要求的更新后relation【rootx】与它的父亲节点rooty的关系

看到这图我们是不是可以想想可不可以用向量去做呢?事实证明是可以的

根据向量的知识我们可以知道:rootx->rooy=x->y+y->rooty-x->rootx

这不就等价于我们的:relation[rootx]=x与y的关系d+relation[y]-relation[x]

为了保证不超出我们的关系的范围(【0,1】)所以我们的式子为relation[fx]=(d+relation[y]-relation[x]+2)%2(加2保证结果不为负数)

还有最后一个就是当x和y的根节点已经相同时,我们怎么判断是否与前面的信息有矛盾呢?

其实就是我们查找时更新关系域是一样的。

relation【x】  relation【y】  d(x与y的关系)

0  0  0

0  1  1

1  0  1

1  1  0

直接判断relation[x]^relation[y]==d

如果不等于肯定是有矛盾的。

思路基本就这样,其他也没什么了,看代码吧。

这应该是我写的最详细的一篇解题报告了。。。

附上代码:

 #include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;
int par[*],relation[*];
int ans,q; void init(int x)
{
for(int i=;i<=x;i++)
{
par[i]=i;
relation[i]=;
}
} int find(int x)
{
if(x!=par[x])
{
int temp=find(par[x]);
relation[x]=(relation[x]+relation[par[x]])%; //更新relation[x]
par[x]=temp;
}
return par[x];
} void unite(int x,int y,int d,int cnt) //d是x和y的关系,cnt是第几条消息
{
int fx=find(x);
int fy=find(y);
if(fx==fy)
{
if(relation[x]^relation[y]!=d&&q==)
{
ans=cnt-; //第cnt条消息矛盾,说明前cnt-1条消息对的
q++;
}
return;
}
else
{
par[fx]=fy;
relation[fx]=(d+relation[y]-relation[x]+)%;
}
} bool same(int x,int y)
{
return find(x)==find(y);
} signed main()
{
int n,m;
map<int,int> mp; //用于离散化
while(cin>>n>>m)
{
mp.clear();
init(*);
ans=m;
int count=;
int k=,q=;
while(m--)
{
int a,b,d;
char s[];
cin>>a>>b>>s;
if(!mp[a-])
mp[a-]=count++;
if(!mp[b])
mp[b]=count++;
if(s[]=='e') d=; //偶数,x-1和y奇偶性相同
else d=;
unite(mp[a-],mp[b],d,k); //k是记录第几条消息
k++;
}
cout<<ans<<endl;
}
return ;
}

poj 1733 Parity game(带权并查集+离散化)的更多相关文章

  1. POJ 1733 Parity game (带权并查集)

    题意:有序列A[1..N],其元素值为0或1.有M条信息,每条信息表示区间[L,R]中1的个数为偶数或奇数个,但是可能有错误的信息.求最多满足前多少条信息. 分析:区间统计的带权并查集,只是本题中路径 ...

  2. POJ 1773 Parity game 带权并查集

    分析:带权并查集,就是维护一堆关系 然后就是带权并查集的三步 1:首先确定权值数组,sum[i]代表父节点到子节点之间的1的个数(当然路径压缩后代表到根节点的个数) 1代表是奇数个,0代表偶数个 2: ...

  3. URAL - 1003:Parity (带权并查集&2-sat)

    Now and then you play the following game with your friend. Your friend writes down a sequence consis ...

  4. POJ 1182 食物链 【带权并查集】

    <题目链接> 题目大意: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我 ...

  5. POJ 1182 食物链 (带权并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 78551   Accepted: 23406 Description ...

  6. POJ 1182 食物链 【带权并查集/补集法】

    动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种.有人用两种说 ...

  7. poj 1182 食物链【带权并查集】

    设相等的边权为0,吃的边权为,被吃的边权为2,然后用带权并查集在%3的意义下做加法即可 关系为简单环的基本都可以用模环长的方式是用带权并查集 #include<iostream> #inc ...

  8. A Bug's Life POJ - 2492 (种类或带权并查集)

    这个题目的写法有很多,用二分图染色也可以写,思路很好想,这里我们用关于并查集的两种写法来做. 题目大意:输入x,y表示x和y交配,然后判断是否有同性恋. 1 带权并查集: 我们可以用边的权值来表示一种 ...

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

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

随机推荐

  1. python 3.6.1 安装scrapy踩坑之旅

    系统环境:win10 64位系统安装 python基础环境配置不做过多的介绍 window环境安装scrapy需要依赖pywin32,下载对应python版本的exe文件执行安装,下载的pywin32 ...

  2. spring遇到的Error applying BeanValidation relational constraints

    spring3.1+hibernate4集成测试时遇到的问题: log4j:WARN No appenders could be found for logger (org.springframewo ...

  3. package-lock.json和package.json的作用

    转自:https://www.cnblogs.com/cangqinglang/p/8336754.html package-lock.json的作用就是锁定安装依赖时包的版本,并且需要上传到git, ...

  4. C++类的内存结构

    摘自Jerry19880126 简单类 class Base { int a; int b; public: void CommonFunction(); }; 简单类继承 class Derived ...

  5. 【学亮IT手记】Ajax跨域问题精讲--jQuery解决跨域操作

    什么是跨域 跨域,它是不同的域名(服务器)之间的相互的资源之间的访问. 当协议,域名,端口号任意一个不同,它们就是不同的域. 正常情况下,因为浏览器安全的问题,不同域之间的资源是不可以访问的. 跨域的 ...

  6. CRM系统数据授权

    1.新建角色,华东二区 2.业务对象中找到客户管理 3.在数据范围中新建数据规则,并进行设置 4.点击授权后,生效. 另:数据权限设置

  7. vue-router路由懒加载(解决vue项目首次加载慢)

    懒加载:----------------------------------------------------? 也叫延迟加载,即在需要的时候进行加载,随用随载. 为什么需要懒加载? 像vue这种单 ...

  8. from组件补充

    一.定义的规则 class TeacherForm(Form): #必须继承Form # 创建字段,本质上是正则表达式 username = fields.CharField( required=Tr ...

  9. shit iview docs & i-radio bug

    shit iview docs & i-radio bug https://github.com/iview/iview/issues/5627 <i-row> <i-col ...

  10. Ajax的post表单,不在url后接一大串参数键值对的方法

    $('#loginForm').on('submit',function (ev) { //阻止表单参数附在url后面 ev.stopPropagation(); ev.preventDefault( ...