随笔分类 -  acm

位运算 的探究
摘要:给学弟出了一道题, 告诉你n个数, 其中只有一个数出现一次, 其他的数都出现三次.求出现一次的那个数. 学弟发给我一个代码, 第一眼竟然没看明白. int run(int n, int* A) { int ones = 0;// 出现一次的标志位 int twos = 0;// 出现第二次标志位 for(int i = 0; i n; i++) { ones = (ones ^ A[i]) & ~twos; twos = (twos ^ A[i]) & ~ones; } return ones; } 阅读全文
posted @ 2014-10-23 10:08 tiankonguse 阅读(342) 评论(0) 推荐(1)
2014年北京网络赛 Instrusive HDU 5040 题解 优先队列
摘要:网赛的时候看了这道题,发现就是平常的那种基础搜索题。 由于加了一个特殊条件:可以一次消耗3秒或原地停留1秒。 那就不能使用简单的队列了,需要使用优先队列才行。 题意 告诉一副地图:一个起点,一个终点,若干墙,若干监视器,剩下的是空地。 起点,终点,监视器都算空地。 监视器初始值会指定一个方向,共有四个方向。 监视器每秒顺时针转动到下个方向。 监视器视野距离为2. 在监视器的位置或在监视器面向的格子是监视区域。 普通的移动一格需要消耗1秒时间。 在监视器下移动一格需要消耗3秒时间。 如果呆在原地不动,即使在监视器视野内也不会被发现。 求最少时间从起点到达终点。 不能到达输出-1。 阅读全文
posted @ 2014-09-24 10:19 tiankonguse 阅读(433) 评论(0) 推荐(0)
【百度之星2014~复赛 解题报告~正解】The Query on the Tree
摘要:昨天写了 The Query on the Tree 的解题报告,但是遗留下一个问题,不能算是完美解决这道题. 因为如果精心构造数据的话,昨天的题解还是会被卡住的. 今天中午睡觉的时候突然想起一个不会被卡住的方法. 题意   有一棵树,树的每个点有点权,每次有三种操作:   1. Query x 表示查询以x为根的子树的权值和。   2. Change x y 表示把x点的权值改为y(0=y=100)。   3. Root x 表示把x变为根。 阅读全文
posted @ 2014-06-03 20:40 tiankonguse 阅读(830) 评论(0) 推荐(0)
【百度之星2014~复赛)解题报告】The Query on the Tree
摘要:这几天把毕业答辩的事弄完了,于是买票出来玩,结果周六是百度之星的复赛,于是我就没有办法来做比赛了,不过看了看题,目测可以过我两三道题. 今天已经是比赛的第二天了,我还一直没有时间来A掉这些题,今晚抽空先把最简单的线段树那道题A了再说. 题目说的很清楚了,自己看吧. 有一棵树,树的每个点有点权,每次有三种操作:   1. Query x 表示查询以x为根的子树的权值和。   2. Change x y 表示把x点的权值改为y(0=y=100)。   3. Root x 表示把x变为根。 阅读全文
posted @ 2014-06-02 12:30 tiankonguse 阅读(1179) 评论(0) 推荐(1)
【百度之星2014~初赛解题报告】
摘要:最近要毕业了,有半年没做比赛了. 这次参加百度之星的初赛娱乐一下. 现在写一下解题报告. 还是先看看四道题的类型吧 1.Scenic Popularity 暴力 复杂度O( 100 * 100 * 10000 ) 或者O( T * K * R) 线段树 2.Chess DP 复杂度 O(n^2) 3.Best Financing DP 复杂度O(n) 4.JZP Set 数论或DP 复杂度 O(n * log(n)) 阅读全文
posted @ 2014-05-27 14:30 tiankonguse 阅读(742) 评论(0) 推荐(0)
【百度之星2014~初赛(第二轮)解题报告】JZP Set
摘要:最近要毕业了,有半年没做比赛了. 这次参加百度之星第二轮娱乐一下. 现在写一下 JZP Set 这道题的的解题报告. 题意是:给你n个数(1到n),给你一个规则,问用这个规则可以得到多少个合法的集合. 具体规则是:一个合法集合里任意挑两个数,如果这两个数之和是偶数,这个偶数除以2得到的数也要在这个合法集合里. 比如: 3 和9 在集合里,3+9是偶数,所以 (3+9)/2 = 6 也要在这个集合里.然后 {3,6,9}就是一个合法的集合. 阅读全文
posted @ 2014-05-26 14:34 tiankonguse 阅读(741) 评论(0) 推荐(0)
【百度之星2014~资格赛解题报告】
摘要:最近要毕业了,有半年没做比赛了. 这次参加百度之星娱乐一下. 现在写一下解题报告. 这次比赛大牛都不屑于做百度之星了,于是我很幸运达到前百名,百度不知道会不会实现说的那样发一件衣服. 这次比赛有四道题,起初只是随便做做,所以我是倒着做的. 先看看四道题的类型: Energy Conversion 暴力 复杂度 O( log(n) ) Disk Schedule DP 复杂度 O( n ^ 2) Xor Sum 字典树 复杂度 O( 32n ) Labyrinth DP 或搜索 复杂度 O(n*m) 阅读全文
posted @ 2014-05-26 12:53 tiankonguse 阅读(1127) 评论(0) 推荐(0)
【百度之星2014~初赛(第二轮)解题报告】Chess
摘要:最近要毕业了,有半年没做比赛了. 这次参加百度之星娱乐一下. 现在写一下 Chess 这道题的的解题报告. 题意很简单,告诉你一个矩阵,以及一个起始坐标. 问走k步有多少个不同的路线. 一个路线可以记为上下左右,则k步有k个上下左右,比如 "上上左左下下" 是一个路线. 阅读全文
posted @ 2014-05-26 12:36 tiankonguse 阅读(304) 评论(0) 推荐(0)
关于 double sort 这道题的思考
摘要:前几天学弟学妹们有一场比赛,学弟邀请我作为技术支持者去帮忙,在那个过程中我看了几道题。 其中有两道题正常比赛没有其他人提交,于是我研究了一下。 研究的第一道就一个暴力dfs就可以过,只是可能正常比赛没人看懂题意,我看了好几个小时才看懂的。 第二道就是 double sort。 什么是 double sort 呢? 就以题目中的讲解例子来说说吧。 题目说对于一组数 [5; 4; 3; 2; 1], 如果只可以交换相邻的数字,要使这组数达到升序至少需要 10 步。 这个很好理解,假设一个数字要和左面的数字交换,那只有一种情况。 但是对于两组数 [5,5; 4,4; 3,3; 2,2; 1,1] 来说,也是只能交换相邻的数字。这是一个数字和左面的数字交换时就有两种情况了。 比如对于 4 可以和 第一个5交换,也可以和第二个5交换。 目标是使这两组数字达到升序。题意还说这个例子的答案是 15 ,不是 20. 阅读全文
posted @ 2014-05-15 19:02 tiankonguse 阅读(256) 评论(0) 推荐(0)
vijos 1243 生产产品 单调性优化动态规划
摘要:描述 Description在经过一段时间的经营后,dd_engi的OI商店不满足于从别的供货商那里购买产品放上货架,而要开始自己生产产品了!产品的生产需要M个步骤,每一个步骤都可以在N台机器中的任何一台完成,但生产的步骤必须严格按顺序执行。由于这N台机器的性能不同,它们完成每一个步骤的所需时间也不同。机器i完成第j个步骤的时间为T[i,j]。把半成品从一台机器上搬到另一台机器上也需要一定的时间K。同时,为了保证安全和产品的质量,每台机器最多只能连续完成产品的L个步骤。也就是说,如果有一台机器连续完成了产品的L个步骤,下一个步骤就必须换一台机器来完成。现在,dd_engi的OI商店有史以来的第 阅读全文
posted @ 2012-08-17 14:40 tiankonguse 阅读(431) 评论(0) 推荐(0)
乘法逆元
摘要:定义:满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元。为什么要有乘法逆元呢?当我们要求(a/b) mod p的值,且a很大,无法直接求得a/b的值时,我们就要用到乘法逆元。我们可以通过求b关于p的乘法逆元k,将a乘上k再模p,即(a*k) mod p。其结果与(a/b) mod p等价。证:(其实很简单。。。)根据b*k≡1 (mod p)有b*k=p*x+1。k=(p*x+1)/b。把k代入(a*k) mod p,得:(a*(p*x+1)/b) mod p=((a*p*x)/b+a/b) mod p=[((a*p*x)/b) mod p +(a/b)] mod p=[(p*(a* 阅读全文
posted @ 2012-08-14 22:24 tiankonguse 阅读(7763) 评论(2) 推荐(5)
约瑟夫环的数学方法
摘要:无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个过程。因此如果要追求效率,就要打破常规,实施一点数学策略。 为了讨论方便,先把问题稍微改变一下,并不影响原意: 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出 ,剩下的人继续从0开始报数。求胜利者的编号。 我们知道第一个人(编号一定是(m-1)%n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号 阅读全文
posted @ 2012-08-14 22:22 tiankonguse 阅读(450) 评论(0) 推荐(0)