题目链接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. mybatis出现NoSuchMethodException异常

    今天在idea中调试项目(ssm搭建的项目)的时候,mybatis突然出现了NoSuchMethodException异常,具体的异常时: java.lang.NoSuchMethodExceptio ...

  2. [转帖]全国产 台式机/笔记本/服务器都有 方正龙芯3A3000整机三连发

    台式机/笔记本/服务器都有 方正龙芯3A3000整机三连发 2019年03月29日 17:17 4171 次阅读 稿源:快科技 7 条评论 https://www.cnbeta.com/article ...

  3. IntelliJ IDEA使用教程(非常全面)

    这个编辑器我就不再多做介绍了.直接开始新建maven hello world 的Java web项目啦 你电脑上得有jdk1.7,或者1.8,然后就是maven3.x吧,再有就是tomcat7以上吧. ...

  4. embed标签的flash层级太高问题

    因为客户要求,项目得兼容IE的兼容模式 页面到了flash都会遮挡底部悬浮的导航. 改变浮动窗口和embed的层级还是不可以.应该不是层级的关系. 最后百度解决方案:在embed标签内添加了wmode ...

  5. MySqlHelper的封装

    其实MySqlHelper和SqlHelper是一样的,只是使用的驱动不一样而已. public class MySQLHelper { public static final String url ...

  6. K3BOM跳层

    A自制件,B自制件,C外购件 ,结构为A-B-C 如果需要跳层,则设置A-B跳层,B-C跳层,则生成A计划订单,C计划订单, 假设单独A-B跳层,则MRP运算出的结果也是A计划订单,B计划订单,C计划 ...

  7. Linux基础操作二

    编程语言的作用及与操作系统和硬件的关系 编程语言的作用:用来定义计算机程序的形式,程序员用它来编写程序,进而控制其向计算机发出指令,使计算机完成人类布置的任务. 编程语言的作用及与操作系统和硬件的关系 ...

  8. java中解决小数精度问题

    public class TestDouble { public static void main(String[] args) { Double d1 = 0.1; Double d2 = 0.2; ...

  9. django rest framework批量上传图片及导入字段

    一.项目需求 批量上传图片,然后批量导入(使用excel)每个图片对应的属性(属性共十个,即对应十个字段,其中外键三个). 二.问题 一次可能上传成百上千张图片和对应字段,原来数据库的设计我将图片和对 ...

  10. 解决mybatis generator警告Cannot obtain primary key information from the database, generated objects may be incomplete

    使用 mybatis generator 生成pojo.dao.mapper时 经常出现 Cannot obtain primary key information from the database ...