c++&oi

POJ 1733

离散化+二分+并查集
很不幸的开学考到,写残了,70分。
主要是并查集的运用上没有灵活。
我加上了一个opp域,存储对立的节点。
合并时合并opp。很显然更新时十分麻烦。
经过N久的修改才AC。
网上看到一种和好的方法:(这种方法没有增加域,而是从另外的角度上构造问题的答案)

解题思路:hash离散化+并查集

首先我们不考虑离散化:s[x]表示(root[x],x]区间1的个数的奇偶性,0-偶数,1-奇数

每个输入区间[a,b],首先判断a-1与b的根节点是否相同

a)如果相同表示(a-1,b]之间1的个数奇偶性已知s((a-1,b])=s[a-1]^s[b],此时只需简单判断即可

b)如果不同,我们需要合并两个子树,我们将root较大的子树(例root[a])合并到root较小的子树(例root[b]),且此时s[root[a]]=s[a]^s[b]^s((a-1,b])

在路径压缩的过程中s[i]=s[i]^s[root[i]],s[root[i]]为(root[root[i]], root[i]]区间内1个数的奇偶性,例(a, b]区间1的个数为偶数,(b, c]区间1的个数为奇数,(a, c]之间1的个数显然为0^1=1奇数
原文:POJ 1733 Parity game

几次市赛由于敲代码速度跟不上思维而惨挂。。。。。。问题很严重啊。。。。。。

posted on 2012-02-19 20:06 zyn.cpp 阅读(551) 评论(1)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

导航

统计

常用链接

留言簿

随笔档案(57)

文章档案(13)

搜索

最新评论

阅读排行榜

评论排行榜