2012年1月29日

位运算简介及实用技巧(四):实战篇

摘要: 下面分享的是我自己写的三个代码,里面有些题目也是我自己出的。这些代码都是在我的Pascal时代写的,恕不提供C语言了。代码写得并不好,我只是想告诉大家位运算在实战中的应用,包括了搜索和状态压缩DP方面的题目。其实大家可以在网上找到更多用位运算优化的题目,这里整理出一些自己写的代码,只是为了原创系列文章的完整性。这一系列文章到这里就结束了,希望大家能有所收获。Matrix67原创,转贴请注明出处。Problem : 费解的开关题目来源06年NOIp模拟赛(一) by Matrix67 第四题问题描述你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。 阅读全文

posted @ 2012-01-29 17:07 [S*I]SImMon_WCG______* 阅读(271) 评论(0) 推荐(0) 编辑

位运算简介及实用技巧(二):进阶篇(1)

摘要: ===== 真正强的东西来了! =====二进制中的1有奇数个还是偶数个我们可以用下面的代码来计算一个32位整数的二进制中1的个数的奇偶性,当输入数据的二进制表示里有偶数个数字1时程序输出0,有奇数个则输出1。例如,1314520的二进制101000000111011011000中有9个1,则x=1314520时程序输出1。var i,x,c:longint;begin readln(x); c:=0; for i:=1 to 32 do beginc:=c + x and 1;x:=x shr 1; end; writeln( c and 1 );end.但这样的效率并不高,位运算的神奇之处 阅读全文

posted @ 2012-01-29 17:05 [S*I]SImMon_WCG______* 阅读(316) 评论(0) 推荐(0) 编辑

位运算简介及实用技巧(三):进阶篇(2)

摘要: 今天我们来看两个稍微复杂一点的例子。n皇后问题位运算版n皇后问题是啥我就不说了吧,学编程的肯定都见过。下面的十多行代码是n皇后问题的一个高效位运算程序,看到过的人都夸它牛。初始时,upperlim:=(1 shl n)-1。主程序调用test(0,0,0)后sum的值就是n皇后总的解数。拿这个去交USACO,0.3s,暴爽。procedure test(row,ld,rd:longint);varpos,p:longint;begin{ 1}if row<>upperlim then{ 2}begin{ 3} pos:=upperlim and not (row or ld or 阅读全文

posted @ 2012-01-29 17:05 [S*I]SImMon_WCG______* 阅读(310) 评论(0) 推荐(0) 编辑

位运算简介及实用技巧(一):基础篇

摘要: 去年年底写的关于位运算的日志是这个Blog里少数大受欢迎的文章之一,很多人都希望我能不断完善那篇文章。后来我看到了不少其它的资料,学习到了更多关于位运算的知识,有了重新整理位运算技巧的想法。从今天起我就开始写这一系列位运算讲解文章,与其说是原来那篇文章的follow-up,不如说是一个remake。当然首先我还是从最基础的东西说起。什么是位运算?程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 an 阅读全文

posted @ 2012-01-29 17:03 [S*I]SImMon_WCG______* 阅读(229) 评论(0) 推荐(1) 编辑

位运算

摘要: 运算方法有六种:& 与运算 | 或运算 ^ 异或运算 ~ 非运算(求补) >> 右移运算 << 左移运算 运用这些基本的运算,我们可以解决acm所需的各种运算,给Bit赋1,赋0,给他的值取反,还有好多段操作。如下:功能 | 示例 | 位运算----------------------+---------------------------+--------------------去掉最后一位 | (101101->10110) | x >> 1在最后加一个0 | (101101->1011010) | x < < 1在最后加 阅读全文

posted @ 2012-01-29 15:58 [S*I]SImMon_WCG______* 阅读(306) 评论(2) 推荐(0) 编辑

【转载】Tarjan算法

摘要: 【转载】Tarjan算法在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。直接根据定义,用双向遍历取交集的方法求强连通分量,时间复杂度为O(N^2+M)。更好的方法是Kosaraju算法或Tarjan算法,两者的时间复杂度都是O(N+M)。本文介绍的是Tarja 阅读全文

posted @ 2012-01-29 14:51 [S*I]SImMon_WCG______* 阅读(284) 评论(0) 推荐(0) 编辑

导航