HDU1517 A Multiplication Game(博弈)
摘要:题目链接。题意:两人轮流乘一个2-9的数,从1开始乘,求谁的乘积先大于N。分析: 如果是加法就好做了。凑到剩下的数能整除11,然后对称着加。问题是乘法。所以寻找必胜点(段)。以1000为例。 1000 | 999 ... 112 | 若占住999到112,则对手必胜。必须让对手占领此段。 1000 | 999 ... 112 |111 ... 56 | 因此必占段是111 -? 。如果56被对手占住,则56×2=112,入必败段。问题转化成为占56。 如此循环。如下 1000 | 999 ... 112 |111 ... 56 |55 ... 7 | 6 ... 4 | 3 ...
阅读全文
posted @
2013-05-31 21:16
Still_Raining
阅读(497)
推荐(0)
HDU1944 S-Nim (SG,博弈)
摘要:题目链接。分析:SG模版。详情请参见LCY的课件:http://acm.hdu.edu.cn/forum/read.php?tid=6875AC代码如下:#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 100 + 10;int sg[10000+10], a[maxn], k;int mex(int n) { bool vis[maxn] = {false}; for(int
阅读全文
posted @
2013-05-31 21:12
Still_Raining
阅读(352)
推荐(0)
博弈之简单总结
摘要:最近看了一下《算法竞赛入门经典——训练指南》中的博弈部分,便急切的做了几道HDU上的博弈水题。大喊一声:我以后会继续更新的(希望如此)。两条规则:规则1:一个状态是必败状态当且仅当它的所有后继都是必胜状态。规则2:一个状态时必胜状态当且仅当它至少有一个后继是必败状态。HDU2188 悼念512汶川大地震遇难同胞——选拔志愿者(水)分析:这种类型的题目叫做巴什博奕(BashGame),可以直接做.AC代码如下:#includeint main(){ int T,n,m; while(scanf("%d",&T)!=EOF) while(T--) { scan...
阅读全文
posted @
2013-05-28 21:40
Still_Raining
阅读(281)
推荐(0)
POJ2926 Requirements(最远曼哈顿距离)
摘要:题目链接。分析:借机学习了一下曼哈顿距离问题。(这图很好)我们可以定义曼哈顿距离的正式意义为L1-距离或城市区块距离,也就是在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。例如在平面上,座标(x1,y1)的点P1与座标(x2,y2)的点P2的曼哈顿距离为:以二维平面为例:设距离最远的两点为 i, j,可知所求的最大距离必定有以下四种形式之一:(xi-xj)+(yi-yj), (xj-xi)+(yi-yj), (xi-xj)+(yj-yi), (xj-xi)+(yj-yi) 变形一下,把相同点的坐标放到一起,即 (xi+yi)-(xj+yj), (-xi+yi)-(-x
阅读全文
posted @
2013-05-25 22:23
Still_Raining
阅读(1791)
推荐(0)
UVA10054 The Necklace(欧拉回路)
摘要:题目链接。题意:每个珠子两半有两种不同的颜色组成,相邻两珠子在接触的地方颜色相同,确认一些零碎的珠子,能否还原成完整的项链。分析:把每种颜色看成一个结点,珠子的两半连一条有向边,则题目转化为了欧拉回路问题。注意:注意编号问题,因为颜色1~50,所以最多有50个结点。对欧拉回路输出有疑问的可参考本随笔。#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <queue>#include <stack>using nam
阅读全文
posted @
2013-05-24 20:55
Still_Raining
阅读(500)
推荐(0)
欧拉回路心得
摘要:对于欧拉回路为什么一定要用栈,偶进行了一下小小的探究(感谢崔学长的数据)。样例如图所示:不用栈,直接输出会怎样呢?void euler(int u){ for(int v=1; v<=n; v++){ if(G[u][v]){ G[u][v]--; G[v][u]--; printf("%d %d\n", u, v); euler(v); } }}输出结果如下:一开始输出路径会是1->2->3->4->1,搜完这些,会从3开始继续搜索并输出,3->5->6->7->3...
阅读全文
posted @
2013-05-24 07:35
Still_Raining
阅读(472)
推荐(0)
UVA10047 The Monocycle(BFS)
摘要:题目链接。题意:一自行车的轮子被分成5个扇区,涂了5种不同颜色。自行车每1秒要么骑到下一个格子,要么左转或者右转90。。一开始自行车面向北,颜色为绿,到达目标格时,必须触底颜色为绿,但朝向无限制。求到达目标格的最短时间。分析:在原来的二维,增加两个附加因素:朝向和颜色。然后普通BFS就可以了。AC代码如下:#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <queue>using namespace std;const in
阅读全文
posted @
2013-05-23 09:29
Still_Raining
阅读(375)
推荐(0)
UVA11324 The Largest Clique(DP+SCC)
摘要:题目链接。题意:给一张有向图G,求一个结点数最大的结点集,使得该结点中任意两个结点 u 和 v满足:要么 u 可以到达 v, 要么 v 可以到达 u(u 和 v 相互可达也可以)。分析:”同一个强连通分量中的点要么都选,要么不选。把强连通分量收缩点后得到SCC图,让每个SCC结点的权等于它的结点数,则题目转化为求SCC图上权最大的路径。由于SCC图是一个 DAG, 可以用动态规划求解。“注意:假设含有 n 个点的图中不含结点数大于 1 的强连通分量,那么缩点后的图含有 n 个点,由于 scc_cnt 是从 1 开始编号,所以初始化时要用<=n 而非 <n。for(int i=1;
阅读全文
posted @
2013-05-21 21:18
Still_Raining
阅读(606)
推荐(0)
HDU2767 Proving Equivalences(scc)
摘要:题目链接。题意:至少增加几条边,才能让图强连通。分析:“首先,找出强连通分量,然后把每个强连通分量缩成一个点(缩点),得到一个DAG。 接下来,设有a个结点的入读为0, b个结点的出度为0, 则 max{a, b}就是答案。 注意特殊情况: 当原图已经强连通时, 答案是0而不是1."这是《算法竞赛入门经典——训练指南》上的原话。对于证明,搜了一下,没有找到。自己呢,试着画了一下,记下个人心得。自己的理解如下;一个含n个点的图,至少要有n条边,才能强连通。即每一个点至少都会有一个入度和出度。对于得到的DAG,设有a个结点的入度为0, b个结点的出度为0,因为增加一条边会同时增加一个入度
阅读全文
posted @
2013-05-21 19:28
Still_Raining
阅读(811)
推荐(0)
HDU1269 迷宫城堡(有向图的强连通分量(scc))
摘要:题目链接。题意:判断是否有向图是否强连通。分析:模板题。判断一个图是否为强连通,即用Tarjan算法看强连通分量(SCC)是否为1.#include <iostream>#include <vector>#include <stack>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int maxn = 10000+10;const int maxm = 100000+10;vector<int>
阅读全文
posted @
2013-05-21 16:35
Still_Raining
阅读(231)
推荐(0)
无向图的割顶和桥、无向图的双连通分量、有向图的强连通分量
摘要:总结自《算法竞赛入门经典——训练指南》(刘汝佳),具体分析请详见书中解析。时间戳:说白了就是记录下访问每个结点的次序。假设我们用 pre 保存,那么如果 pre[u] > pre[v], 那么就可以知道先访问的 v ,后访问的 u 。现在给定一条边, (u, v), 且 u 的祖先为 fa, 如果有 pre[v] < pre[u] && v != fa, 那么 (u, v) 为一条反向边。无向图的割顶和桥:求割顶:#include <iostream>#include <cstdlib>#include <cstdio>#incl
阅读全文
posted @
2013-05-20 22:41
Still_Raining
阅读(1681)
推荐(1)
Greatest Number
摘要:GreatestNumberProblem Description Saya likes math, because she think math can make her cleverer. One day, Kudo invited a very simple game: Given N integers, then the players choose no more than four integers from them (can be repeated) and add them together. Finally, the one whose sum is the larg...
阅读全文
posted @
2013-05-18 20:36
Still_Raining
阅读(472)
推荐(0)
UVA1449 Dominating Patterns(AC自动机)
摘要:题目链接。分析:表示对AC自动机还不能完全理解,所以在纸上手绘了下 getFail 和 find 的过程,表示理解的深刻些了。好,继续加油!分析详见《算法竞赛入门经典——训练指南》P216。#include <iostream>#include <cstdlib>#include <cstdio>#include <algorithm>#include <cstring>#include <stack>#include <vector>#include <queue>#include <map
阅读全文
posted @
2013-05-17 21:28
Still_Raining
阅读(248)
推荐(0)
AC自动机
摘要:AC自动机,不得不说,很难理解。这里的代码是《算法竞赛入门经典——训练指南》上的代码,自己把散碎的代码整理了整理。#include <iostream>#include <cstdlib>#include <cstdio>#include <algorithm>#include <cstring>#include <stack>#include <vector>#include <queue>#include <map>using namespace std;const int maxn
阅读全文
posted @
2013-05-16 22:50
Still_Raining
阅读(366)
推荐(0)
UVA11624 Fire!(BFS)
摘要:题目链接。分析:先用BFS将所有的火能到达的时间计算出来,然后再一次BFS,计算最短路径。要求人每到一个方格的时间,必须小于该方格的着火时间。直到走到边界。注意:WA很多次。。后来想出来了。少考虑了一种情况,那就是人一开始就在边界的情况。AC代码如下:#include <iostream>#include <cstdlib>#include <cstdio>#include <algorithm>#include <cstring>#include <stack>#include <vector>#includ
阅读全文
posted @
2013-05-13 20:58
Still_Raining
阅读(465)
推荐(0)
SDUT2622 最短路(spfa)
摘要:题目链接。题目:最短路径题目描述为了准备一年一度的校赛,大家都在忙着往赛场搬运东西,比如气球什么的。这时YY也没有闲着,他也加入了搬运工的行列。已知学校有N个路口和M条路,YY并不是把东西直接搬到赛场,而是从S路口搬运到T路口。由于YY非常懒而且他有轻度强迫症。所以他要走的路需要尽可能的短,并且走过路径的数目要为X的倍数。输入输入的第一行为一个正整数T(1≤T≤20),代表测试数据组数。对于每组测试数据:输入的第一行为两个正整数N和M(1≤N≤100, 1≤M≤10000)。接下来M行每行三个正整数U、V、W(0≤U,V<N, 0≤W≤230),代表有一条从U到V的长度为W的有向路径。最
阅读全文
posted @
2013-05-12 12:41
Still_Raining
阅读(354)
推荐(0)
SDUT2619 地板砖(状态压缩DP)
摘要:题目链接。题目原文:地板砖题目描述利用假期时间,豆豆找个了临时工,帮有钱人家贴地板砖,假设房子的形状为N x M的矩形,每个地板砖的大小为1 x 1,且只有黑白两种颜色,这家人很奇怪,他们不喜欢房间中任何一个2 x 2的局部区域的4块地板砖的颜色一样。如果出现这种图案,豆豆就要重新贴,这当然难不倒豆豆,但爱学习的豆豆,想知道满足要求的贴法一共用多少种。如下图所示:Figure 1.为满足要求的贴法,Figure 2.为不满足要求的贴法输入输入包含多组测试数据,对于每组测试数据:输入只有两个正整数N、M(N≤500, M≤5),分别代表房间的长度和宽度。输出对于每组测试数据,输出满足要求的贴法总
阅读全文
posted @
2013-05-10 23:04
Still_Raining
阅读(284)
推荐(0)
POJ3630 Phone List
摘要:题目链接。分析:之前做过类似的题,用的字典树链表写法,今天在训练指南上学了字典树数组的写法。#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int maxnode = 10000*10+10;const int sigma_size = 10;struct Trie { int ch[maxnode][s
阅读全文
posted @
2013-05-09 22:53
Still_Raining
阅读(162)
推荐(0)
UVA1428 Ping pong(树状数组)
摘要:题目链接。题意:n个人,从左到右排列,每个人都有一个不同的技能值 ai, 每场比赛3个人: 两名选手, 一名裁判。 裁判必须在两名选手中间, 并且技能值也在两名选手之间, 问一共能组织多少种比赛。分析: 考虑第i个人当裁判的情形。假设 ai 到 ai-1 中有 ci 个比 ai 个小, 那么就有 (i-1)-ci 个比 ai 大; 同理, 假设 ai+1 到 an 中有di个比ai 小, 那么就有 (n-i)-di 个比 ai 大。 根据乘法原理和加法原理, i当裁判 有 ci(n-i-di)+(i-ci-1)*di 种比赛。 这样问题转化为求 ci 和 di. 题目已经明确每个人都有一个..
阅读全文
posted @
2013-05-07 20:51
Still_Raining
阅读(227)
推荐(0)
校赛之简单总结
摘要:校赛已经结束了几天了,除去名次,就表现而言,我不得不进行一次深刻的反省。 校赛,总共有八道题,5到水题,另外3道是有些难度的题。自己AC水题的速度还算凑合,基本上不到一个小时(或者是半个?忘了)就结束了。但剩下的三个题,我只做出来了一道。想想就有些羞愧了,3个小时一道题? 不应该啊,马虎了,大意了?这样的借口面对自己的过失,弥补不了吧。 兵器磨得还不够锋利,使用的还不够熟练? 我想应当是这样。 想想也是,不熟练兵器的太多了。比如说,状态压缩DP(比赛就碰到了),树状数组等等还有很多其它兵器。 想到这,接下来要做的事就不言而喻了。 我想要站得更高,我要把所有的结果都变成自己进步的...
阅读全文
posted @
2013-05-07 16:28
Still_Raining
阅读(296)
推荐(0)
HDU1754 I Hate It(树状数组 or 线段树)
摘要:题目链接。分析:本题可以用树状数组,也可以用线段树。树状数组:对于树状数组,请详见本随笔。要注意的是,比如说上图,要求 2 到 4 之间的最大值, c[4] 并非 2 到 4 之间的最大值,因为 c[4] 是 1 到 4 之间的最大值。这时候就只能单独看A[4], A[3], A[2]了。AC代码:#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;const int maxn = 200000 + 10;int n
阅读全文
posted @
2013-05-03 09:46
Still_Raining
阅读(219)
推荐(0)
树状数组
摘要:树状数组又称二叉索引树(Binary Indexed Tree,BIT),是一种解决动态连续和查询问题的数据结构。辅助数组 C: Ci= Ai-lowbit(i)+1 + Ai-lowbit(i)+2 + ... + Ai其中 lowbit(x) 代表 x的二进制表达式中最右边的1所对应的的值, 那么lowbit(x) = x & -x即C[6] 代表 A[5] 和 A[6] 的和, C[4] 代表 A[1] + A[2] + A[3] + A[4]那么如何求前缀和 Si 呢, 顺着结点i往左走, 边走边“往上爬”, 把沿途经过的 Ci 累加起来就可以了。int sum(int x){
阅读全文
posted @
2013-05-03 09:38
Still_Raining
阅读(280)
推荐(0)