HDU 4334 Trouble
摘要:和POJ1840有点像,但这里只需判断有没有解,一个简单的hash就可以搞定,以后不能滥用vector,自己手写邻接表。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<vector>typedef __int64 LL;const int MAXN = 205;const LL prime = 1000007;int head[prime + 3], e, next[MAXN * MAXN];LL val[MAXN * MAXN];LL s1[MAXN], s2[MAXN
阅读全文
posted @
2012-08-25 16:51
找回失去的
阅读(205)
推荐(0)
HDU 1540 Tunnel Warfare
摘要:线段树求一个点所处区间的最大连续长度,用lsum记录区间的左连续长度,rsum记录区间的右连续长度,查询时判断p点处于左子树还是右子树,然后计算左子树的右连续长度+右子树的左连续长度的和。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1 | 1const int MAXN
阅读全文
posted @
2012-08-24 17:19
找回失去的
阅读(192)
推荐(0)
POJ 3274 Gold Balanced Lineup
摘要:这个题看了题解之后才会写的,每头牛最多有k个属性,用给出数字的对应二进制位表示,0为没有这种属性,1为具有这种属性。要求的是最长的一个牛的序列,使得每种属性出现的次数相同。参考网上的hash函数ret=((ret<<2)+(a[i]>>4))^(a[i]<<10);用sum[i][j]表示前i头牛的第j种属性出现的次数。用c[i][j]存储sum[i][j]-sum[i][0]的值,代表前i头牛第j种属性出现次数与第0种属性出现次数的差值。如果存在i1和i2,使得c[i1][j]=c[i2][j]0<j<k,i1到i2这一段就是符合要求的一个解。
阅读全文
posted @
2012-08-24 15:27
找回失去的
阅读(164)
推荐(0)
POJ 2002 Squares
摘要:给出n个点,求出用这n个点可构成的正方形的个数。可以枚举两个点,求出正方形的另两个点。然后判断这两个是否存在。我的hash公式写得比较烂,跑了1s多。下面是求正方形剩下两点的公式:已知:(x1,y1)(x2,y2)则:x3=x1+(y1-y2)y3=y1-(x1-x2)x4=x2+(y1-y2)y4=y2-(x1-x2)或x3=x1-(y1-y2)y3=y1+(x1-x2)x4=x2-(y1-y2)y4=y2+(x1-x2)/*Accepted 1724K 1047MS C++ 1713B 2012-08-24 11:46:05*/#include<stdio.h...
阅读全文
posted @
2012-08-24 11:59
找回失去的
阅读(174)
推荐(0)
POJ 3349 Snowflake Snow Snowflakes
摘要:判断n朵雪花中,是否有完全一样的雪花。一道比较简单的hash,我们将雪花的六个边的权值加起来,记为sum,将sum相等的雪花归为一类,再在这里面根据题意找完全相同的,在同类中找到一个角相同的,然后判断顺时针或者逆时针的所有角是否一模一样。/*Accepted 3828K 3204MS C++ 1675B 2012-08-24 10:44:15*/#include<stdio.h>#include<stdlib.h>#include<vector>using namespace std;const int prime = 19999;const int MAX
阅读全文
posted @
2012-08-24 10:55
找回失去的
阅读(340)
推荐(0)
POJ 2492 A Bug's Life
摘要:并查集确定昆虫的关系,题意有点BT...用一个数组rel代表与其父节点的关系,为0则代表相同,为1代表不同。如果两者不在一个集合中则合并,在一个集合中则判断种类是否相同,相同则存在同性恋的虫子。/*Accepted 164K 766MS C++ 1224B 2012-08-24 09:28:15*/#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 1 << 11;int p[MAXN], rel[MAXN];int find_set(int x){ int
阅读全文
posted @
2012-08-24 09:45
找回失去的
阅读(233)
推荐(0)
POJ 1988 Cube Stacking
摘要:进行m次操作,Mxy将包含x的集合移动到y上面,Cx,计算x下面有几个元素。用p[x]表示x的根结点,cnt[x]表示x所在集合的元素个数,top[x]表示x上面有几个元素。每次进行路径压缩时,top[x]都要加上top[p[x]],cnt和p的操作就是并查集的基本操作。最后计算结果是用x所在集合元素的个数-在它之上的个数-它本身。/*Accepted 500K 297MS C++ 1147B 2012-08-24 08:41:18*/#include<stdio.h>#include<string.h>#include<stdlib.h>const int
阅读全文
posted @
2012-08-24 08:56
找回失去的
阅读(679)
推荐(1)
POJ 1067 取石子游戏
摘要:威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。/*黄金分割比例判断是不是非奇异局势,面对奇异局势必败两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜反之,则后拿者取胜。*///公式 ak =[k(1+√5)/2],bk= ak + k/*Accepted 184K 0MS C++ 334B 2012-08-23 16:55:14*/#include<stdio.h>#include<math.h>const double key = (sqrt(5....
阅读全文
posted @
2012-08-23 17:05
找回失去的
阅读(306)
推荐(0)
POJ 2236 Wireless Network 并查集
摘要:并查集判断两个点是否联通,只需看他们的根节点是不是相同。/*Accepted 224K 2688MS C++ 1339B 2012-08-23 16:32:01*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>const double eps = 1e-8;const int MAXN = 1 << 10;int n, in[MAXN], p[MAXN], m;double d;struct point{ double x, y;}t[MAXN
阅读全文
posted @
2012-08-23 16:34
找回失去的
阅读(232)
推荐(0)
POJ 1840 Eqs HASH
摘要:求一个五元三次方程的解的个数,虽然x的范围比较小,但是要枚举五个数字时间复杂度也是100的五次方,肯定会超时,将方程改变下,前两项移到左边,加个负号。这样算的时间复杂度就变成了100^3+100^2,不会超时了,值得注意的是HASH数组很大,用short才不会超出内存。/*Accepted 49136 KB 735 ms C++ 1156 B 2012-08-23 09:16:51*/#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 25000000;short has
阅读全文
posted @
2012-08-23 12:22
找回失去的
阅读(202)
推荐(0)
POJ 3225 Help with Intervals 线段树区间操作
摘要:/*Accepted 2364K 969MS C++ 2769B 2012-08-22 16:54:26*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1 | 1const int MAXN = 131072;bool hash[MAXN + 1];int col[MA
阅读全文
posted @
2012-08-22 16:58
找回失去的
阅读(166)
推荐(0)
POJ 3667 Hotel 线段树区间合并
摘要:线段树的区间合并,其中lsum代表区间左边最大连续长度,rsum代表区间最大连续长度,msum代表区间最大连续长度。因为本题是查询连续区间的左端点,那么如果左儿子满足条件,就继续查询左儿子,左儿子不满足条件,就判断左儿子的rsum+右儿子的lsum是不是满足条件,最后才查询右儿子。/*Accepted 2236K 594MS C++ 2574B 2012-08-21 12:15:23*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using nam
阅读全文
posted @
2012-08-22 16:02
找回失去的
阅读(167)
推荐(0)
POJ 2761 Feed the dogs
摘要:求区间第k小,划分树,又一种神奇的数据结构。2104也可以用这个代码AC,那道题是裸的求第k小。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;const int MAXN = 100010;struct Node{ int l, r;}T[MAXN << 2];int d[MAXN], s[MAXN], t[21][MAXN], tol[21][MAXN];void build(int level,
阅读全文
posted @
2012-08-20 16:58
找回失去的
阅读(351)
推荐(0)
2012/8/9 关于今天的比赛
摘要:A大数运算大数模版写得不熟,然后出了不少错误,准备自己写一个模版。G拓展欧几里德求逆元这道题公式没推错,代入参数搞错了,然后一直在调,浪费不少时间。I求线段交点很普通的计算题,WA了6次,最后才A掉,计算时没有考虑double比较大小的细节,手写的fabs没过。今天就A了三道最水的题,比较让我失望,I题不应该错这么多次,细节决定成败,这句话放在哪都没错,因为这样WA掉罚时真的很不值。希望明天比赛顺利,然后进入校队。A:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostre
阅读全文
posted @
2012-08-09 17:08
找回失去的
阅读(252)
推荐(0)
HDU 4325 Flowers
摘要:线段树的离散化和成段增减和单点查询。开始的时候二分函数写得有点问题,一直在WA,然后修改下就过了。离散化时将所有的时间点都加入到一个X数组中,经过判重后X的元素有k个,我们就可以建立一个k个元素的线段树。查询和修改时只需找到时间点在X数组中的位置,然后就和普通线段树没有任何区别了,这题不需要从叶子向根节点更新,只需从根到叶子节点更新。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;#define lson l,
阅读全文
posted @
2012-08-09 16:10
找回失去的
阅读(452)
推荐(0)
HDU 1698 Just a Hook
摘要:线段树成段更新的基础题,每次操作将x到y这个区间的值改为z,然后最后要求输出的是1到n的区间和,根据线段树的性质,1到n的区间和其实就是sum[1]。/*2012-08-08 16:07:20 Accepted 1698 1015MS 2280K 1407 B G++ Yu*/#include<stdio.h>#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1const int MAXN = 100100;int sum[MAXN << 2], col[MAXN <<
阅读全文
posted @
2012-08-08 16:15
找回失去的
阅读(133)
推荐(0)
POJ 1182 食物链
摘要:食物链是一道经典的并查集题,这道题难在怎么确定两个动物之间的关系。看了罗德安大神的分析,有种豁然开朗的感觉。问题分析:我们把已经确立了关系的动物分到一个群落里,对于每一个提到的两个数字编号, 看它们是否属于同一个群落,如果是的那么根据它们已有的关系,我们作出相应的判断 即可;若它们属于不同的群落,那么根据互相的关系将两个群落合并;若恰有一个没有 加入到任意一个群落之中,那么将这一个并入另一个的群中即可;若两个都未加入任意 群中,那么我们新建一个群即可。基本思路:这一题的难点在于记录动物之间的关系,即ABC三种动物是循环被吃的,我们用 0,1,2表示,记录在rank[i]中,如果i吃j,则让..
阅读全文
posted @
2012-08-08 15:25
找回失去的
阅读(258)
推荐(0)
HDU 1394 Minimum Inversion Number
摘要:线段树的一个应用,求逆序数。思路为:sum[i]为0代表i未出现,为1则已经出现,然后查询时我们只要统计新加入的数到n-1这个范围内有多少个sum[i]为1,也就是当前数的逆序,然后累加,就是我们要求的逆序数。因为其他形式都可以由第一次求得的逆序数递推而来,所以只需计算一次。/*2012-08-07 16:54:38 Accepted 1394 78MS 252K 1478 B G++ Yu*/#include<stdio.h>#include<algorithm>using namespace std;#define lson l, m, rt ...
阅读全文
posted @
2012-08-07 17:02
找回失去的
阅读(191)
推荐(0)
逆序数及其求法
摘要:转自http://www.2cto.com/kf/201111/111542.html1. 逆序数所谓逆序数,就是指一个序列S[i],统计处于序列的每个数的比这个数大并且排在它前面的数的数目,然后对于所有数,把这个数目加起来求和就是了。比如4 3 1 24第一个,所以数目为03的前面是4,大于3的数目为11的前面是4 3 ,大于1的数目为22的前面是4 3 1,大于2的数目为2所以逆序数为1+2+2 = 5求逆序数的两种方法常规方法是按照逆序数的规则做,结果复杂度是O(n*n),一般来说,有两种快速的求逆序数的方法分别是归并排序和树状数组法2. 归并排序归并排序是源于分而治之思想,详细的过程可
阅读全文
posted @
2012-08-07 16:20
找回失去的
阅读(6329)
推荐(0)
HDU 1754 I Hate It
摘要:同样是线段树,这道题是求区间最值,单点更新。线段树代码愈发熟练。/*2012-08-07 16:02:53 Accepted 1754 1093MS 2276K 1361 B G++ Yu*/#include<stdio.h>#include<algorithm>using namespace std;#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1const int MAXN = 200020;int Max[MAXN << 2];int n, m;void P
阅读全文
posted @
2012-08-07 16:05
找回失去的
阅读(124)
推荐(0)
HDU 1166 敌兵布阵
摘要:线段树的基础题,之前写过,今天看了刘汝佳的《高级数据结构》又写了一次,对线段树的理解也更深了。/*2012-08-07 15:45:14 Accepted 1166 343MS 736K 1598 B G++ Yu*/#include<stdio.h>#include<string.h>#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1const int MAXN = 50050;int sum[MAXN << 2];int n;void PushUp(int rt
阅读全文
posted @
2012-08-07 15:48
找回失去的
阅读(186)
推荐(0)
POJ 2352 Stars(树状数组)
摘要:星星的级别就是横坐标小于它,纵坐标不大于它的点个数。因为输入是有序的,纵坐标没有起到作用,所以只要注意x值就行了。用树状数组来实现/*Accepted 376K 110MS C++ 774B 2012-08-07 10:58:07*/#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 1 << 15;int T[MAXN], ans[MAXN];int lowb(int t){ return t & (-t);}void insert(int i){
阅读全文
posted @
2012-08-07 12:00
找回失去的
阅读(212)
推荐(1)
判断线段规范相交
摘要:算是学了一个模版吧#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>const double eps = 1e-8;struct point{ double x, y;};point a, b, c, d;inline int dcmp(double d){ if(fabs(d) < eps) return 0; return d > 0 ? 1 : -1;}inline double det(double x1, double y1, doubl
阅读全文
posted @
2012-08-07 10:01
找回失去的
阅读(254)
推荐(0)
POJ 1325 Machine Schedule
摘要:http://poj.org/problem?id=1325做的第一道二分图匹配的题,应该说代码是很基础的,但是建模确实需要一定的技巧。这也是黑书上的一个例题,将每个任务看成一条边,把A机器的每个模式看成一个X结点,B机器的看成Y结点。任务i为( ai, bj)。这道题求的是最少的点,让每条边都至少与其中一个点关联。这里有一个结论,这个最少点数就是最大匹配数M,黑书的证明如下:(1) M个是足够的。只需要让它们覆盖最大匹配的这M条边,则其他边一定被覆盖 (如果有一条边e不被覆盖,把e加入后得到一个更大的匹配)(2) M个是必需的。仅仅考虑形成最大匹配的这M条边,由于它们两两无公共点, ...
阅读全文
posted @
2012-08-06 17:02
找回失去的
阅读(265)
推荐(0)
POJ 3159 Candies
摘要:题意是给A和B发糖果,B的糖果数–A的糖果数<=c,也就是B<=A+c,最后求n比1最多多几个糖果。题目只有这一个约束条件,建图不难。将AB看成有向图的边,然后c看成边的权值,转化成最短路来求解,大牛们都说了SPFA+queue会超时,所以用了SPFA+stack。因为这道题没有负权的边,也可以用堆优化的dij来求这个最短路。SPFA + Stack/*Accepted 2396K 532MS C++ 1363B 2012-08-06 15:32:00*/#include<cstdio>#include<cstring>#include<cstdlib
阅读全文
posted @
2012-08-06 15:34
找回失去的
阅读(255)
推荐(1)
POJ 3169 Layout
摘要:题意是有N头牛,其中有ML对是相互喜欢的,它们之间不能超过一个距离,有MD对是互相不喜欢的,它们的距离不得少于D。在ML中a,b,c分别代表两头牛的编号和最大距离,有a,b中max–min<=c。而在MD中则反过来min-max<=-c.即max<=min+c,min<=max-c.根据这个条件建图,然后求出第一头牛到第n头牛的距离,如果存在,输出这个距离,如果存在负圈,输出-1,不存在答案输出-2./*Accepted 280K 47MS C++ 1803B 2012-08-06 14:53:35*/#include<stdio.h>#include<
阅读全文
posted @
2012-08-06 14:08
找回失去的
阅读(225)
推荐(0)
POJ 2983 Is the Information Reliable?
摘要:这里也要建立<=差分约束系统,判断消息是否可靠看的是建立的图是否存在负圈。如存在则不可靠,不存在则可靠。建立<=的差分系统:由于P A B X 指“确定A到B的距离(边权)为X”从P A B X得到的差分系统为dist[A] - dist[B] >= X && dist[A] - dist[B] <= X 等价于dist[B] <= dist[A] - X && dist[A] <= dist[B] + X则if(dist[B] > dist[A]-X)松弛:dist[B] = dist[A]-X由于 V A B指“只知
阅读全文
posted @
2012-08-06 13:13
找回失去的
阅读(162)
推荐(0)
POJ 1201 Intervals
摘要:做的第一个差分约束的题。读完题后一脸茫然,不会建图。看了算法导论,其实这是一个建立<=差分约束系统的过程。设s[x]=从0到x的所有在集合中的数的个数,则ai到bi的个数即S[bi]-S[ai-1]。因此有:(1)S[bi]-S[ai-1]>=ci。 又根据s[x]本身的性质,后面的一定不比前面的小,后面的最多比前面多一,有:(2)s[i+1]-s[i]>=0(3)s[i+1]-s[i]<=1根据这三个约束条件建图,使图中每一组边,均满足:S[ai-1]<=S[bi]-ciS[i]<=S[i-1]+1S[i-1]<=S[i]建完图,用Bellman-F
阅读全文
posted @
2012-08-06 13:08
找回失去的
阅读(299)
推荐(0)
快速幂取模
摘要:看到一个快速幂取模的模版,挺好用的,为了避免中间过程超int,我全部用longlong。#include<stdio.h>#include<string.h>#include<stdlib.h>typedef long long LL;const LL c = 10007;LL a, b;LL exp_mod(LL a, LL b, LL c){ LL r = 1; if(a > c) a %= c; while(b) { if(b & 1) r = (r * a) % c; a = (a * a) % c; b >>= 1; ..
阅读全文
posted @
2012-08-06 09:39
找回失去的
阅读(241)
推荐(0)
HDU 2222 Keywords Search
摘要:第一次写AC自动机,参考集训手册题解的代码,但是还是花了三个小时的时间才A掉。字符串插入字典树的过程就是一般字典树形成的过程。这里关键在于求失败指针。有点像KMP求next的过程。 对于每个结点,我们可以这样处理:设这个结点上的字母为C,沿着他父亲的失败指针走,直到走到一个结点,他的儿子中也有字母为C的节点。然后把当前结点的失败指针指向那个字母也为C的结点。如果一直走到了root都没找到,那就把失败指针指向root。最开始,我们把root加入队列(root的失败指针显然指向自己),这以后我们每处理一个结点,就将他的所有儿子几点入队。 假设有一个节点k,他的失败指针指向j。那么k,j满足...
阅读全文
posted @
2012-08-03 15:32
找回失去的
阅读(215)
推荐(0)
ZOJ 1729 Hidden Password
摘要:和POJ1509没什么区别,只是输入形式上有些许改变,而且这里要求输出的位置是字符串的下标,而不用再加1。/*Accepted 1729 C++ 10ms 276kb Yu*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;const int MAXN = 100100;char s[MAXN];int n, T;int Minpre(){ int i = 0, j = 1, k = 0, x, y; w...
阅读全文
posted @
2012-08-03 10:05
找回失去的
阅读(170)
推荐(0)
POJ 1509 Glass Beads
摘要:这道题是求字符串最小表示的第一个字符在字符串中的位置。做之前看了IOI2003冬令营周源大神的论文《浅析“最小表示法”思想在字符串循环同构问题中的应用》。这里虽然每个样例只有一个字符串,但是我们可以构造出一个字符串s+1,和s来找同构,然后取找到的位置i,j之中小的那个。/*Accepted 100K 16MS C++ 700B 2012-08-03 09:39:45*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace s
阅读全文
posted @
2012-08-03 09:45
找回失去的
阅读(273)
推荐(0)
POJ 1007 DNA Sorting
摘要:按照字符串的逆序排序。/*Accepted 100K 16MS C++ 863B 2012-08-03 08:30:48*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;const int MAXN = 55, MAXM = 110;struct str{ char s[MAXN]; int r;}t[MAXM];int n, m;bool cmp(str a, str b){ return a.r <
阅读全文
posted @
2012-08-03 08:38
找回失去的
阅读(154)
推荐(0)
POJ 2388 Who's in the Middle
摘要:排序后输出中位数,直接用algorithm的sort。/*Accepted 204K 32MS C++ 347B 2012-08-02 17:13:37*/#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int MAXN = 10010;int a[MAXN], n;int main(){ int i; while(scanf("%d", &n) == 1) { for(i = 0; i < n; i ++) ..
阅读全文
posted @
2012-08-02 17:16
找回失去的
阅读(114)
推荐(0)
POJ 2299 Ultra-QuickSort
摘要:题意描述的是求冒泡排序过程中交换的次数。如果用冒泡排序统计次数的话会超时,因为有这么一条性质,排序交换的次数等于逆序数之和,所以转化成求逆序数之和。用归并排序。#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 500050;int A[MAXN], T[MAXN], n;__int64 cnt;void MergeSort(int l, int r){ int p, q, i, m; if(r - l > 1) { m = l + r >> 1; p
阅读全文
posted @
2012-08-02 17:07
找回失去的
阅读(159)
推荐(0)
POJ 3764 The xor-longest Path
摘要:建立字典树,树的结点记录根结点到该结点的连续异或值。由(a^c)^(b^c)==a^b可得任意两结点的异或值,等于两结点之间这条路的连续异或值。由此把每个结点的值插入01字典树,从二进制31位~0位,并查找,尽可能的向每一位的不同方向查找(这样异或这一位能得1),取最大值。位运算还得继续学习。/*Accepted 44068K 875MS C++ 1756B 2012-08-02 16:10:05*/#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 210000;typ
阅读全文
posted @
2012-08-02 16:26
找回失去的
阅读(515)
推荐(0)
POJ 3630 Phone List
摘要:和1056一样是判断前缀,唯一的区别就是这里是个10叉树。/*Accepted 2776K 110MS C++ 961B 2012-08-02 14:06:58*/#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct{ int next[10]; int alr, end;}Trie;Trie t[110000];int tp, n;int insert(char *x, int site){ if(t[site].end) return 1; ...
阅读全文
posted @
2012-08-02 14:12
找回失去的
阅读(177)
推荐(0)
POJ 1056 IMMEDIATE DECODABILITY
摘要:判断编码是否合法。合法的编码不允许出现一个编码是另一个编码的前缀。问题就在判断是否出现这样的情况。用字典树存储,定义两个标记,end为0代表当前结点是一个编码的结束,alr为1代表有一个编码经过了这个结点。由字典树的性质,当一个编码结束的结点alr为1,那么代表这个编码是另一个编码的前缀。此外,当一个编码经过的某个结点出现end值为1的情况,说明有一个编码是当前编码的前缀。/*Accepted 168K 0MS C++ 1044B 2012-08-02 13:05:53*/#include<stdio.h>#include<string.h>#include<..
阅读全文
posted @
2012-08-02 13:16
找回失去的
阅读(1367)
推荐(0)
POJ 2513 Colored Sticks
摘要:字典树存储,用并查集判连通,欧拉回路判通路。/*Accepted 59208K 422MS C++ 1191B 2012-08-02 11:38:21*/#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct{ int next[26]; int cnt, ord;}Trie;Trie t[3000000];int tp, op;int p[510000];char s1[20], s2[20], odd;int find(int x){ return p[x] ==...
阅读全文
posted @
2012-08-02 11:43
找回失去的
阅读(186)
推荐(0)
HDU 4082 Hou Yi's secret
摘要:这是去年北京赛区的B题,给出n个点,用这些点构造三角形,然后找出相似三角形个数的最大值。昨天看这题的时候以为很难,后面发现n的范围也就18,18^3也不大,可以直接暴力做。构造三角形的时候要注意两点:(1)这道题会有重点,需要判重。判重时可以将点平移,然后用一个200*200的数组做标记就行了。(2)判断三点共线,只需求出第一个与第三个点、第二个点与第三个点连线的斜率,斜率相等必然共线。此外,处理的时候将a作为最小边、b作为中边、c作为最长边。方便判断相似。/*Accepted 4082 0MS 416K 2343 B G++ Yu*/#include<st...
阅读全文
posted @
2012-08-02 09:56
找回失去的
阅读(450)
推荐(0)
POJ 1521 Entropy
摘要:求哈夫曼树的平均码长,用优先队列来写,先记录某个字符在字符串里出现的次数,然后放入队列。依次取出第一小和第二小的数,将两个数相加,构成新的虚拟结点,放入队列中。/*Accepted 196K 0MS C++ 918B 2012-08-01 17:25:00*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>using namespace std;int key[1 << 7], len;char t[1 << 10];int huffm
阅读全文
posted @
2012-08-01 17:33
找回失去的
阅读(256)
推荐(0)
POJ 2752 Seek the Name, Seek the Fame
摘要:给出一个字符串A,求A有多少个前缀同时也是后缀,从小到大输出这些前缀的长度分析:KMP对于长度为len的字符串,由next的定义知:A[0]A[1]...A[next[len]-1]=A[len-next[len]]...A[len-1]此时A[0]A[1]...A[next[len]-1]为一个符合条件的前缀有A[0]A[1]....A[next[next[len]]-1]=A[len-next[next[len]-next[next[len]]]...A[next[len]-1],故A[0]A[1]....A[next[next[len]]-1]也是一个符合条件的前缀故从len=>n
阅读全文
posted @
2012-08-01 16:55
找回失去的
阅读(204)
推荐(1)
POJ 2406 Power Strings
摘要:用KMP求循环节。/*Accepted 5288K 110MS G++ 712B 2012-08-01 16:03:19*/#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 1 << 20;char t[MAXN];int next[MAXN], len;void Make_Next(){ int i = 0, j = -1; next[0] = -1; len = strlen(t); while(i < len) { if(-1...
阅读全文
posted @
2012-08-01 16:10
找回失去的
阅读(205)
推荐(0)
POJ 3461 Oulipo
摘要:字符串模式匹配,KMP算法相当高效,O(n+m)。关键在求出模式串的next数组,求完这个,一些基本的题应该都是没有问题了的,文本串只要扫描一次。求模式串在文本中出现的次数,当匹配模式串的最后一个字符时,就说明出现了一次。/*Accepted 1192K 94MS C++ 987B 2012-08-01 09:21:25*/#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXT = 1000100;const int MAXW = 10010;char T[MAXT], W[MA
阅读全文
posted @
2012-08-01 09:29
找回失去的
阅读(271)
推荐(0)