随笔分类 -  Hdu

摘要:题意:给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形..问最多可以拿走多少个正方形..思路: 先找出可以组成正方形的地雷组合cnt个.. 然后st = 1 7 #include 8 #include 9 using namespace std;10 11 struct Point12 {13 int x;14 int y;15 }p[30];16 17 struct Set18 {19 Point p[4];20 int sta;21 }s[200];22 23 int cnt, tmp;24 int ... 阅读全文
posted @ 2013-12-12 14:13 Griselda. 阅读(333) 评论(0) 推荐(0)
摘要:题意: 给出老虎的起始点、方向和驴的起始点、方向.. 规定老虎和驴都不会走自己走过的方格,并且当没路走的时候,驴会右转,老虎会左转.. 当转了一次还没路走就会停下来.. 问他们有没有可能在某一格相遇..思路: 模拟,深搜.. 用类似时间戳的东西给方格标记上,表示某一秒正好走到该方格.. 最后遍历一下驴在某一格方格标记时间是否和老虎在该格标记的时间一样,一样代表正好做过这里了.. 还有一种情况就是老虎或驴一直停在那里,那就算不相等,也是可以的..Tips: 我一直忘了老虎或驴停下来的情况,这样只要该方格正好是时间戳最后一秒,而且另一个动物走过的时间比停下来那一个动物的最后一... 阅读全文
posted @ 2013-12-12 14:01 Griselda. 阅读(445) 评论(0) 推荐(0)
摘要:题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数。 求出这个数列中所有mex的值。 思路: 可以看出对于一个数列,mex(r, r~l)是一个递增序列 mex(0, 0~n-1)是很好求的,只需要遍历找出第一个没有出现的最小非负整数就好了。这里有一个小技巧:1 tmp = 0;2 for (int i = 1; i = 1; --i) {2 if (mp.find(arr[i]) == mp.end()) next[i] = n+1;3 else next[i] = ... 阅读全文
posted @ 2013-11-20 14:54 Griselda. 阅读(644) 评论(0) 推荐(0)
摘要:题目: 曹操在长江上建立了一些点,点之间有一些边连着。如果这些点构成的无向图变成了连通图,那么曹操就无敌了。刘备为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥。但是诸葛亮把所有炸弹都带走了,只留下一枚给刘备。所以刘备只能炸一条桥。 题目给出n,m。表示有n个点,m条桥。 接下来的m行每行给出a,b,c,表示a点和b点之间有一条桥,而且曹操派了c个人去守卫这条桥。 现在问刘备最少派多少人去炸桥。 如果无法使曹操的点成为多个连通图,则输出-1. 思路: 就是用tarjan算法算出桥的数量,再比较哪一个的值最小。Tips: 注意三点: ①. 有重边,所以tarjan算法要处理重边... 阅读全文
posted @ 2013-11-20 13:40 Griselda. 阅读(1812) 评论(0) 推荐(0)
摘要:题意: 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字。 题目给出a,b,求出0~b有多少个不大于f(a)的数。思路: 数位DP,用来学习数位DP了。 所谓数位DP就是基于考虑数字的每一位来转移的DP。 例如求比456小的数,可以这么考虑, 4 5 6 4 5 (0~6) 4 (0~4) (0~9) (0~3)(0~9) (0~9) ... 阅读全文
posted @ 2013-11-20 12:47 Griselda. 阅读(2451) 评论(0) 推荐(1)
摘要:题意: 给出一个数组,问你对于第i个数,从最后一个比它大的数到它之间比它小的数中最大的那个数的下标,以及它右边到第一个比它大的数中比它小的数中最大的那一个数的下标。 eg:5 2 4 3 1 l 0 0 2 0 0 对5来说左边比它小的数没有,所以是0。对2来说左边比它小的数没有,所以是0。对4来说左边比它小的数是2,所以下标是2。 r 3 0 4 5 0 对5来说右边比它小的数中最大的是4,是第3个,所以答案是3。对2来说右边比它小的数是1,但是4比2大,所以无法到达1,所以答案是0。对于4,右边比它小的数中最大一个3的下标是4,所以答案是4。思路: 单调队列... 阅读全文
posted @ 2013-07-26 14:58 Griselda. 阅读(682) 评论(0) 推荐(0)
摘要:题意: 一个炮兵可以攻打和他之间曼哈顿距离为2的士兵,给出你一块n*m的战场,告诉你哪些地方可以站人哪些地方不可以,问你最多可以安放多少个士兵? n 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 int n, m; 9 int G[110], bir[1>2)&i) || ((i>1)&bir[j][0])) continue;48 dp[0][j][i] = bir[i][1]+bir[j][1];49 ans = max(ans, ... 阅读全文
posted @ 2013-07-19 17:43 Griselda. 阅读(258) 评论(0) 推荐(0)
摘要:题意: 安排计划,有4种约束方式,给出你这些时间的n个约束.. 如果计划是可行的,求出每一件事发生的最早时间..否则输出“impossible”.. ①. FAF a b a要在b完成后完成.. ②. FAS a b a要在b开始前完成.. ③. SAS a b a要在b开始前开始.. ④. SAF a b a要在b结束前开始..思路: 简述 差分约束系统.. 差分约束系统就是给出一个不等式组..每个不等式形如 xj-xi <= bk bk是一些已知的常量.. 求出所有未知量xi.. ***---要注意是小于等于---*** 其实差分约束系统就像是最短路中的松弛条... 阅读全文
posted @ 2013-06-06 21:31 Griselda. 阅读(589) 评论(0) 推荐(0)
摘要:题意: 给出一个n*m的矩阵, 0 表示不可走 1 表示可走 2 表示起点 3 表示终点 4 表示可走且走到这一步可以满血 某人一开始有6滴血,走一步少一滴..到0就死了.. 可以走到4的位置满血再走.. 求出最少走几步可以从起点到终点.. 思路: 广搜,用一个cnt表示现在走了几步,一个cur表示现在的血量.. 普通的广搜过程中如果已经走过就不可以再走了..但是第三个样例可以看出走过还可以再走.. 因为普通广搜走过不能再走只是代表这个状态已经访问过了..不需要再次访问,防止死循环.. 但是现在再次访问的时候因为血量已经不一样了.所以可以再走.. 剩下就是正常... 阅读全文
posted @ 2013-06-06 21:05 Griselda. 阅读(188) 评论(0) 推荐(0)
摘要:题意: 给出多个串,如果没有一个串是别的串的前缀,则这些串是符合要求的,输出“Set * is immediately decodable”; 否则输出 "Set * is not immediately decodable"; 输入中多个串以9表示输入结束思路: 裸的字典树,先根据多个串建树,然后遍历每一个串看是否在字典树中.. Tips: 要注意找的时候应该判断是否为叶子结点,而不是仅仅判断是否在字典树中,因为建树的时候肯定存在该串.. Code: 1 #include <stdio.h> 2 #include <cstring> 3 #incl 阅读全文
posted @ 2013-06-06 20:38 Griselda. 阅读(233) 评论(0) 推荐(0)
摘要:题意: 给出一串已加密的报文,报文的原内容是由这串密码和某一个大写字母异或而来的。 已知这串报文仅由大写字母组成,请输出原报文思路: 水题,枚举A~Z 如果加密报文的每一个大写字母和当前枚举的字母异或后在合法范围内,即都是大写字母,则该字母就是keyword..Tips: ---***这里是重点***-- ①. 规律,a^b = c --> a^c = b & b^c = a ②. 两个整型异或的结果不是整型,需要强制转换..Code: 1 #include <stdio.h> 2 #include <cstring> 3 4 int main() 5 { 阅读全文
posted @ 2013-06-06 20:29 Griselda. 阅读(331) 评论(0) 推荐(0)
摘要:题意: dos命令的cd操作有两个可执行方法 cd .. 回到上一级目录 cd 当前目录名/b/c/d 当前目录名到某一个子目录下 给出你目录的关系,然后给出a b问最少经过几步可以从a走到b..思路: 求出a和b的最近公共祖先,然后分4种情况讨论 ①. a和b有一个公共祖先c,则用 c时间戳-a的时间戳+1(1步可以直接从c到b) ②. a是b的祖先,则只用1步就可以到达b点 ③. b是a的祖先,则用a的时间戳-b的时间戳 ④. a和b是同一个点,则答案是0Tips: 求绝对值的函数还是得自己写.. 用algorithm的就wa了.. 因为algorithm... 阅读全文
posted @ 2013-06-05 17:03 Griselda. 阅读(901) 评论(0) 推荐(0)
摘要:题意: 有3个操作 D a 毁坏某一个点a R 修复上一次破坏的点 Q a 问a点附近连续的点有几个思路: 区间合并类的线段树 结构体表示 { l:节点的左界限 r:节点的右界限 ll:左起连续的点数 rr:右起连续的点数 mm:整个范围内连续最长的点数 }Tips: 主要是更新那一块要考虑父节点可能是由左右节点边界合并的 询问那一块要考虑是否可以和兄弟节点合并Code: 1 #include <stdio.h> 2 #include <cst... 阅读全文
posted @ 2013-06-05 16:32 Griselda. 阅读(171) 评论(0) 推荐(0)
摘要:题意: 知道一个人买票花的时间和和前面那个人一起买票花的时间,问最少花多少时间可以把票卖完.. 输入: 给出T,表示有T组样例 给出n,表示有n个人买票.. 给出n个数表示这个人单独买票会花的时间.. 给出n-1个数,表示这个人和前面那个人一起买票会花的时间.. 思路: 状态转移方程是:dp[i] = min(dp[i-1]+单独买花的时间, dp[i-2]+和前面那个人一起买花的时间) 初始状态是dp[1] = 第一个人单独买话的时间 Tips: nothing..??!Code: 1 #include <stdio.h> 2 #include ... 阅读全文
posted @ 2013-06-05 14:39 Griselda. 阅读(1192) 评论(0) 推荐(0)
摘要:题意: 各国的汇率兑换.. 给出各国之间汇率兑换的比例,然后问你是否可以通过不断地兑换最后挣钱.. 譬如美金兑换英镑 是0.5 英镑兑换法币是 10 法币兑换美金是 0.21 所以通过1美金兑换成0.5英镑然后兑换成0.5*10 = 5的法币再兑换成5*0.21的美金就可以得到1.05的美金就可以挣钱了~思路: 这个跟最短路的意思其实是一样的.. 不过是看看最后的dis[1][1]是否大于1 Tips: 这题由题意可以发现最后的结果是由G[1][i]*G[i][j]*G[j][k]*..G[..][1]得到的.. 这里因为是乘运算..所以其实和最短路中的负权路是一... 阅读全文
posted @ 2013-05-20 21:05 Griselda. 阅读(203) 评论(0) 推荐(0)
摘要:题意: n个队伍,一个队伍3个人,要求如果队长不在那剩下两个队员必须在,如果剩下两个队员不在队长必须在.. m种冲突关系,每种冲突关系中的两个人不能同时存在。 问方案是否可行..思路: 2-sat..根据冲突关系连边.. 然后看某人的留和不留是否会一起发生..如果会就代表方案不可行..Tips: 总结一下2-sat.. 通常都需要拆点..拆成两种状态,选或者不选.. 然后根据题目给出的点的必然关系..即a发生b不能发生,b发生a不能发生..的关系连边.. 根据建的图进行深搜..并且染色.. 最后结果就是必须发生的关系的总关系会是一种颜色.. 最后遍历每一个点,如果该... 阅读全文
posted @ 2013-05-09 11:33 Griselda. 阅读(362) 评论(0) 推荐(0)
摘要:题意: 给出一个n*n的矩阵和m个数,从m个数中选几个数填入矩阵中值为0的空格中,使矩阵的和最大。 矩阵的和的定义是:所有子矩阵的数的和的和..思路: 要想矩阵的和最大..应该使m个数中值大的数填入矩阵中出现次数多的0格中.. 所有其实可以看做是求解矩阵中每一个0格被子矩阵包含的次数.. 以前做过一道题是一维的成段更新..方法是:http://www.cnblogs.com/Griselda/archive/2012/09/15/2686074.html 这道题类似..就是譬如要更新(x, y)到(x+k, y+k)的二维矩阵.. 就在(x, y)处设为1,在(x+k+1, y+... 阅读全文
posted @ 2013-05-08 20:15 Griselda. 阅读(278) 评论(0) 推荐(0)
摘要:题意: 动态更新一段区间的值.. 最后输出总区间的和..思路: 其实就是线段树的成段更新.. 用到了lazy[] 表示懒惰标志.. 懒惰标记: 就是每次更新不更新到最后..而是更新到包含了区间的最大的节点.. 然后如果下次更新的时候更新到了上次已经更新到的节点.. 那先把上次更新暂停的节点往下更新..直到这次更新的区间最大的节点没有被标记.. 这样就省时间了..Tips: pushdown节点就是用来向下更新的.. 要注意的是modify函数..即每次更新的时候 把根节点标记为要更新的数 x 然后顺便求出最大值sum[rt].. ... 阅读全文
posted @ 2012-10-12 11:21 Griselda. 阅读(1842) 评论(0) 推荐(0)
摘要:题意: 一个board的面积是h*w..在上面贴一些announcement.. 给出告示的宽度ww..可知告示的面积为1*ww.. 问告示是否可以贴上去..可以就输出在board的第几行..不可以就输出-1思路: 以min(h, n)为长度建一棵树.. 然后每一个的叶子的长度为w.. 找出所有叶子中最大的那个..把announcement贴上去.. 用ma数组存当前区间最大值..Tips: 查询和更新可以一起写..但是我分开写了.. 然后还有一个要注意的是..树的最大宽度为min(h, n) 比较的时候是和左右节点大小比.. ※ 所以modify的时候判断条件也应该是i... 阅读全文
posted @ 2012-10-11 13:03 Griselda. 阅读(557) 评论(0) 推荐(0)
摘要:[1166 敌兵布阵]题意: 给出一些命令..要求可以: 随时增加或减少某个位置上的数 随时查询某段区间上的和.. 输入: 一个T 表示有T组样例 每组样例一个n 表示有n个位置 输入命令: Add a b 表示在 a 位置上增加 b Sub a b 表示在 a 位置上减少 b Query a b 表示求 a 到 b 的和思路: 因为数据量很大..所以无法靠暴力来遍历求和.. 所以用线段树..Tips: 更新的时候注意sum数组开到节点的4倍Code:View Code 1 #include <stdio.h> 2 #include <cstri... 阅读全文
posted @ 2012-10-09 21:12 Griselda. 阅读(334) 评论(0) 推荐(0)