poj
文章平均质量分 62
primo_001
这个作者很懒,什么都没留下…
展开
-
POJ2259-Team Queue
以前在uva上做过这个题,一模一样的,但是这次还是弄了个RE,而且这次的错误与上次完全不同;以前的错误是逻辑错误,这次的而代码错误,只是少个else。用了一晚上的时间,用神一样的测试数据终于揪出了这个错误。错误见代码《测试数据见UVA540.#include #include #include #include using namespace std;struct n原创 2012-11-11 21:14:34 · 676 阅读 · 0 评论 -
poj 1182 - 食物链(并查集)
自己找的并查集专题:http://hi.baidu.com/vfxupdpaipbcpuq/item/13cbd3258c29e20d72863edf 思路:(from:上面的专项题解)首先,集合里的每个点我们都记录它与它这个集合(或者称为子树)的根结点的相对关系flag[]。0表示它与根结点为同类,1表示它吃根结点,2表示它被根结点吃。那么判断两个点a, b的关系,我们令p = Fi原创 2013-10-17 17:39:53 · 451 阅读 · 0 评论 -
poj 2912 - Rochambeau(并查集)
题意、思路: 跟poj1182食物链题意题意几乎是一样的,那个题目的意思是a吃b,b吃c,c吃a,而这个是剪子包袱锤,所以说是一样的。集合合并和路径压缩的公式是一样的。只需要把这个题的"a>b"和"a 不同的是这道题目需要用多次并查集。对于这个题我们的做法是,枚举每个小孩为judge,并记录他为judge时在第几句话出错(即到第几句话能判断该小孩不是judge)。原创 2013-10-24 22:48:49 · 618 阅读 · 0 评论 -
poj 1308 - Is It A Tree?(并查集)
个人认为这个题目描述的不好,没给出节点的范围,只说了是正整数,太笼统的题意了,我看网上贴的代码,有人开了10000,也有人开了1000,像我这种人,不知道开多大的数组,还以为自己的思路不行呢,于是又反复琢磨题意,真是浪费时间。思路: 很直白的并查集的题目代码如下:const int M = 1005;int flag[M], p[M];int find(int x)原创 2013-10-19 12:13:41 · 517 阅读 · 0 评论 -
poj 1611 - The Suspects(并查集)
传说中的大水题,我却纠结了好久。原因是我的思路逻辑上有点有bug。思路:很明显的并查集题目,把每组的成员都放到一个集合里面,然而我为了保证符合条件的答案都在0这个集合中,所以我对每个分组都是合并到改组中编号最小的那个节点上了,恰恰是这个想法成了我代码的bug,出错的原因是每组的节点都合并到了最小的点上,但并不能保证合并后的那个集合的节点是编号最小的,因为这还牵扯到父节点的问题。例如原创 2013-10-20 11:22:09 · 608 阅读 · 0 评论 -
poj 1984 - Navigation Nightmare(并查集)
思路:(from:http://hi.baidu.com/strongoier/item/8665de0cd915571e3a53eea8)题目比较长,大意是说给N个点和M条边,每条边有方向(东南西北)和长度,再给Q个询问,第i个询问查询两个点之间在Ti时刻的曼哈顿距离(即如果前Ti条边能使这两个点连通则输出答案,否则输出-1)。由于要维护图的连通性,我们考虑使用并查集。很原创 2013-10-20 17:38:38 · 735 阅读 · 0 评论 -
poj 2524 - Ubiquitous Religions(并查集)
题意:统计1-n的宗教信仰的种类,假设没有关系的两个人的信仰肯定是不同的。思路:并查集来合并所有有相同信仰的人,最后统计集合的个数即可。代码如下:const int M = 50005;int p[M], flag[M];int find(int x) { return p[x]==x?x:p[x]=find(p[x]); }int main(){ int原创 2013-10-22 16:10:14 · 593 阅读 · 0 评论 -
poj 2492 - A Bug's Life(并查集)
题意:针对实验结果来验证教授的假设是否成立。每行给出一个a和b表示a和b是异性的, 让我们来验证这种假设对于所有的实验结果是否会出现矛盾。思路:并查集,用一个数组来维护集合中每个元素与头结点是否同姓,同姓标为0,异性标为1。代码如下:const int M = 2005;int p[M], flag[M];void init(int n){ memset(fl原创 2013-10-22 13:36:17 · 557 阅读 · 0 评论 -
poj 1988 - Cube Stacking(并查集)
题意很简单,思路: 首先我们肯定得必须维护以为记录节点信息的数组cnt[]来记录该cube下面的所有cube的个数。 由于对move操作,要更新放到上面的集合【节点a所在的集合】的所有节点的cnt信息,然而由于并查集特点,我们知道需要把这个集合放到并查集的子树上才方便更新信息。所有我们在做并查集合并的时候要把集合a并到集合b上。 但是原创 2013-10-21 22:55:52 · 593 阅读 · 0 评论 -
poj 2236 - Wireless Network(并查集)
思路: 并查集,假如两两都可以联通的所有的节点就加入到一个集合当中。最后查询只需查询他们是否在一个集合中即可。代码如下:const int M = 1005;vector g[M];struct Point{ int x, y; int readPoint() { return scanf("%d%d", &x, &y);原创 2013-10-22 00:05:04 · 524 阅读 · 0 评论 -
poj 1733 - Parity game(离散化+并查集)
有点难度的并查集题目。。。题意: 每次询问都能返回该区间内的1个数的奇偶性,问这些询问从第几个开始就不正确了。思路:(from:http://www.cnblogs.com/ltang/archive/2010/12/07/1898919.html) hash离散化+并查集 首先我们不考虑离散化:s[x]表示(root[x],x]区间1的个数的奇偶性,0-偶数原创 2013-10-23 10:49:15 · 699 阅读 · 0 评论 -
poj 1456 - Supermarket(贪心+并查集)
题意:(from:http://www.cnblogs.com/rainydays/archive/2011/06/20/2085269.html)有一些货物,每个货物有价值和卖出的截至日期,每天可以卖一个货物,问能卖出的最大价值是多少。思路:(from:http://hi.baidu.com/vfxupdpaipbcpuq/item/13cbd3258c29e20d72863edf)原创 2013-10-22 17:16:04 · 733 阅读 · 0 评论 -
poj 1038 - Bugs Integrated, Inc.(状态压缩dp)
题意: 从n*m的矩阵中裁剪2*3的小矩形,其中有些方块不能用【题目以坐标方式给出】,问最多可以得到多少小矩形。思路: 要知道能否以当前行作为小矩形的最后一行,需要知道以上三行的状态信息,因为我们切割的时候可以横着也可以竖着。 同时由于一旦 方格 (x-1, y)被黑色记号或其他芯片占据,则方格(x-2,y)即便空闲对第 x行芯片的放置也毫无意义,原创 2013-10-29 23:36:10 · 1409 阅读 · 0 评论 -
poj 1703 - Find them, Catch them(并查集)
思路: 只要两者的关系确定了,就将他们加入一个集合中,另外增加一个表示关系的数组flag,来表示该节点与其父节点的关系,0表示是同一类,1表示是不同团伙。 初始时,集合只有自己一个元素。flag设置为0.代码如下:const int M = 100005;int flag[M], p[M];int find(int x){ int tmp = p原创 2013-10-14 17:17:42 · 506 阅读 · 0 评论 -
poj 2051 - Argus(堆)
以前做过的题目,,,,优先队列的多路合并见刘汝佳厚书P188最近正在学习堆,所以手工的用堆来实现了一把优先队列。小顶堆代码如下:struct Node{ int id; int period; int time; bool operator < (const Node &tmp) const { return time<原创 2013-10-14 15:55:49 · 568 阅读 · 0 评论 -
poj 3067 - Japan(树状数组)
先按第一个数从大到小排序,相等的情况下,第二个数按照从大到小排序。。。。。预处理后,照着树状数组写就行了。。。注意:k的最大值应取1000*1000代码如下:include #include #include #include #include #include #include #include #include #include #include #de原创 2013-09-02 22:07:08 · 538 阅读 · 0 评论 -
poj3232 - Accelerator(加速器)
这个题是我在比赛的时候看到的。开始的时候,身为菜鸟的我根本没想到用什么二分。。。。后来从别人那里知道了以后就火速的敲代码,上交,结果WA。接着我继续搞代码,越搞越乱。弄了好久也没弄出来其实是我少了个特判。那就是k=1的时候。因为k-1做了分母,所以k是不能等于1 的。由于没找到弊病,所以我和以为同伴在源代码的基础上改了又改,连续交了12遍都没过。最后。好吧。我们都放原创 2013-04-25 17:04:36 · 1054 阅读 · 0 评论 -
poj1061 - 青蛙的约会
认真读题,画坐标图,得出方程:(n-m)t + k*L = (x-y)运用扩展欧几里德,解出一个基本解,然后由这个基本解,计算出最小的x值因为得到的基本解中x不一定是尽量小的正整数。所以我们要换算由于x的变化通式是x+k*bb;k 为任意整数,bb = b/gcd;所以最小的x是(x%bb+bb)%bb;代码如下:#include void gcd(long lo原创 2013-04-28 20:27:39 · 724 阅读 · 0 评论 -
poj1456 - Supermarket
贪心算法先按照profit从大到小排序然后从大到小取值尽量使得较大的值放到数组中,如果位置n已经放上了货物则把当前的货物往前放,最终放到空的位置上。代码如下:#include #include #include typedef struct { int p, d;}node;node a[10010];bool vis[10010];int comp(cons原创 2013-04-20 22:15:11 · 709 阅读 · 0 评论 -
poj2533 - Longest Ordered Subsequence(简单动规)
状态:d[i]表示a[1.....i]的最长上升子序列状态转移:d[i] = max{d[j]+1|a[i]>a[j]}代码如下:#include #include #define N 1005int n, a[N], d[N];int main (){ int max; while(~scanf("%d",&n)) { for(int原创 2013-06-11 21:44:26 · 593 阅读 · 0 评论 -
poj1887 - Testing the CATCHER(动归)
最长不上升子序列。把最长上升子序列的代码稍微改动一下即可详解请见:http://wenku.baidu.com/view/fe0deecea1c7aa00b52acb71.html#include #include #define N 10005int n, a[N], c[N], dp[N];int search(int l, int r, int x){ int原创 2013-06-13 09:48:12 · 750 阅读 · 0 评论 -
poj1609 - Tiling Up Blocks(动归)
转自大神的话:刚开始想到的是用节点来进行dp。。。但是一看数量肯定是要超时的了。。。后来看到了 数据的范围比较小。。就想到了用数据来进行dp有的时候同样的方法在这个角度来看可能不行。。。但是换一个角度就海阔天空了。。。。状态:dp[i][j]表示用到长宽为i,j的砖所能达到的最大高度。状态转移:dp[i][j] = max(dp[i-1][j],dp[i][j-1])+w[i]原创 2013-06-13 17:09:50 · 909 阅读 · 0 评论 -
poj3254 - Corn Fields(状态压缩dp)
所谓的状态压缩就是把庞大的状态家族精简化。大多数都是用二进制表示状态的。状态:dp[i][j]表示第i行第j个状态所能达到的最大方案数目。状态转移:dp[i][j] += dp[i-1][k]代码如下:#include #include #define M 1000#define N 15#define MOD 100000000bool a[N][N];int m,原创 2013-06-18 20:12:57 · 767 阅读 · 0 评论 -
poj2739 - Sum of Consecutive Prime Numbers(求素数)
一道非常水的题目,不需要思路的题目。。。可我却可了好几遍啊,最后重写的代码才过的。。。代码挫在了求素数的地方,嗨,代码确实越写越遭了。。。求素数,然后将相邻素数序列的和记录下来。。。代码如下:#include #include #include using namespace std;#define N 10005#define M 1500bool v原创 2013-07-23 19:51:33 · 736 阅读 · 0 评论 -
poj2299 - Ultra-QuickSort (求逆序数)
题意:给出长度为n的序列,每次只能交换相邻的两个元素,问至少要交换几次才使得该序列为递增序列。我们需要知道:逆序数 = 在只允许相邻两个元素交换的条件下,得到有序序列的交换次数所以我们需要求数列的逆序数,O(N*N)的算法肯定会超时的,所有我们寻求较为高效的排序方法,归并排序就是充分利用分治法的而提高效率的排序方法。归并排序:#include #define M 50000原创 2013-07-28 15:14:11 · 756 阅读 · 1 评论 -
poj2352 - Stars(树状数组)
题意:给定每个星星(x,y)的坐标求该满足条件(x'思路:题目的输入数据很有特色就是按行输入,例如:50 15 17 13 35 5就是第一行的3个坐标优先,然后是第二行的,然后是。。。。。所以我们求满足条件的星星数目便无须关心纵坐标了。可以直接用线段树写出来,也可以离散化后在写出来,总之要注意x=0的情况,离散化的时候由于排序失误还wa了一次。原创 2013-07-28 17:03:19 · 683 阅读 · 0 评论 -
poj 2481 - Cows(树状数组)
看的人家的思路,没有理解清楚,,,结果一直改一直交,,wa了4次才交上,,,注意: 为了使用树状数组,我们要按照e从大到小排序。但s要从小到大。(我开始的时候错在这里了)代码如下:#include #include #include #include #include #include #include #include #include #include原创 2013-09-02 17:45:21 · 564 阅读 · 0 评论 -
poj 1195 - Mobile phones(树状数组)
二维的树状数组,,,记得矩阵的求和运算要想好在写。。。。代码如下:#include #include #include #include #include #include #include #include #include #include #include #define M 1100#define INF 0x7fffffff#define原创 2013-09-02 12:56:22 · 534 阅读 · 0 评论 -
poj 1417 - True Liars(并查集+背包)
题意: 题目中告诉两种人,一种只说真话,一种只说假话。然后告诉n个描述,每个描述是说a说b是说真话的人(yes)或者是说假话的人(no),最后问是否能判断哪些人是只说真话的那类人。思路: 根据题意可知:其中好人说真话,坏人说假话这点很重要。 那么如果一个人说另一个人是好人,那么如果这个人是好人,说明 对方确实是好人,如果这个是坏人,说明这句话是假的原创 2013-10-23 18:11:12 · 849 阅读 · 0 评论