08 2012 档案

摘要:链接:http://poj.org/problem?id=2373很明显的DP问题,但是如果利用n^2的算法,肯定会超时,dp[i]表示覆盖到i时的最优值,显然i是偶数,而根据题目描述可以知道,对于一个点i因为每一个覆盖的范围可以调节,而且有最大值和最小值,那么这个解的最优子结构肯定在一个区间里面,这样就可以考虑利用单调队列进行优化,单调队列记录的是在从一个点i开始的往前2*b-2*a的单调递增序列。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include 阅读全文
posted @ 2012-08-29 14:38 zhenhai 阅读(385) 评论(0) 推荐(0)
摘要:链接:http://acm.hdu.edu.cn/showproblem.php?pid=4001亚洲区预选赛大连赛区的网络赛题目,简单的DP,首先按照长度宽度和id值进行一遍排序,这一遍排序虽然保证不了在第i个前面的都是可以被第i个放到其上面的,但是保证了在第i个后面的都是不可以的。排序之后的dp[i]表示第i个放上之后的最优值。View Code 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cstdlib> 5 #define N 1005 6 阅读全文
posted @ 2012-08-28 16:13 zhenhai 阅读(157) 评论(0) 推荐(0)
摘要:链接:http://poj.org/problem?id=2823利用单调队列的出队入队,维护区间的最值,保证队列单调递增或单调递减,要维护单调递增队列,当一个数字插入的时候,从队尾往前找到第一个比它小的值把后面的值都删掉,然后把这个值放在找到的位置的后面,单调递减队列也是类似的情况,因为是单调序列,查找过程可以用二分查找。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define N 1000005 5 using namespace std; 6 int 阅读全文
posted @ 2012-08-28 13:00 zhenhai 阅读(187) 评论(0) 推荐(0)
摘要:链接:http://acm.hdu.edu.cn/showproblem.php?pid=4263杭电热身赛的题,属于简单题,两次Kruskal算法,先把所有的红边加完,红边可以保证一部分的图是联通的,然后加蓝边构成生成树,那么这些蓝边就是整个生成树当中必须要有的边(其实不是因为这些边必须要有,因为这些边连的点必须要加到生成树里,所以必须要有一定数量的蓝边,可能这些蓝边的选择方案有很多,但是数量是一定的),然后把图还原,把原来必须的蓝边先加上,再一直加没有用过的蓝边,最后看加的蓝边的数量是不是>=k如果满足则能有方案做到,否则不能。View Code 1 #include<iost 阅读全文
posted @ 2012-08-26 10:18 zhenhai 阅读(226) 评论(0) 推荐(0)
摘要:链接:http://poj.org/problem?id=1112题意是把一些人分成两组,要求每一组的人必须互相认识,并且两组的人数尽量的接近,如果我们用认识的关系进行建图,那么这道题将会相当麻烦,如果用不认识的关系建图,那么不认识人的两个人之间连一条边,可以把这些点分为一个二部图,然后对二部图进行染色标记,如果有不认识的两个人分在了同一组,那么就是无解的情况,否则,利用DP求解一个离n/2最近的值,并且记录路径View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #d 阅读全文
posted @ 2012-08-25 11:24 zhenhai 阅读(219) 评论(0) 推荐(0)
摘要:链接:http://poj.org/problem?id=2135这道题数据范围给的很坑爹啊,题面给的1000,我开到1500都过不了,RE了一个小时,最后实在没办法,开到2000,一下子A了,真想说一句:fuck!!要求不能有重复的路径,路径的长度为费用,每条路径的流值为1,并且建立超级源点和超级汇点,从超级源点连接到0一个流值为2,费用为0的边,n和超级汇点也连这么一条边,因为是无向图,所以要加四条边,而且只能用邻接表的实现。剩下的是最小费用流的模板,spfa()找最短路径View Code 1 #include<iostream> 2 #include<cstdio&g 阅读全文
posted @ 2012-08-23 21:27 zhenhai 阅读(232) 评论(0) 推荐(0)
摘要:链接:http://acm.hdu.edu.cn/showproblem.php?pid=3715用a[i]表示a[i]对应的x[a[i]]是0,a[i]+n表示是1,则当c[i]=0时,不能同时为0,则a[i]->b[i]+n,b[i]->a[i]+n当c[i]=1时,a[i]->b[i],b[i]->a[i],a[i]+n->b[i]+n,b[i]+n->a[i]+n;当c[i]=2时,a[i]+n->b[i],b[i]+n->a[i];最后如果二分枚举深度值,要用到二分枚举View Code #include<iostream> 阅读全文
posted @ 2012-08-15 19:21 zhenhai 阅读(160) 评论(0) 推荐(0)
摘要:周长并和面积并的代码基本上差不多,只不过多了两个rb,lb判定端点是否被覆盖的判断,维护的过程也增加了一点难度,但是整体上是差不多的。View Code #include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include <algorithm>#define N 5005#define L(x) x<<1#define R(x) x<<1|1using namespace std;struct node{ int l,r,nu 阅读全文
posted @ 2012-08-13 20:10 zhenhai 阅读(247) 评论(0) 推荐(0)
摘要:线段树题目,给出一个序列,查询一段a,b之间的最大的连续相同的数字的和最大是多少,定义为MS,因为对于一个区间的MS,可能来自于左子节点或者右子节点,或者当左节点最右面的数字和右节点的左面的数字相同时可能会来自两个节点合并的部分,所以,树中的节点要维护五个基本的值,lval(最左侧的值),lnum(最左侧值连续的个数),rval(最右侧的值),rnum(最右侧值连续的个数)以及MS,为了提高效率,还要增加一个标记值,不需要更新每一个节点。View Code #include<iostream>#include<cstdio>#include<cstring> 阅读全文
posted @ 2012-08-13 16:44 zhenhai 阅读(1951) 评论(0) 推荐(0)