HDU 4417 Super Mario
摘要:划分树 + 二分二分枚举第k小的数与h比较大小。#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>using namespace std;const int MAXN = 100100;struct Node{ int l, r;}T[MAXN << 2];int d[MAXN], s[MAXN], t[35][MAXN], tol[35][MAXN];void build(int level, int rt, int l, int
阅读全文
posted @
2012-09-23 17:20
找回失去的
阅读(1114)
推荐(0)
HDU 4268 Alice and Bob
摘要:这是昨天网络赛的1002题,做得很伤感。昨天处理的方法上有些错误,一直没有过。今天学习了下set,STL真强大。将Alice的card标记为id=0,Bob的card标记为1。将所有的纸片按照h,w的升序排序,按照id的降序排序,也就是在相同情况下将Bob的纸片放前面。然后将Bob的纸片的w插入set,贪心选取Alice比Bob的纸片w大一点的来覆盖,然后删掉被覆盖的纸片。#include <stdio.h>#include <string.h>#include <algorithm>#include <set>using namespace s
阅读全文
posted @
2012-09-09 10:37
找回失去的
阅读(754)
推荐(0)
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
找回失去的
阅读(165)
推荐(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
找回失去的
阅读(680)
推荐(1)
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)
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)
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)