2012年4月10日
摘要: HDU_3225 这个题目和求被覆盖K次的矩形面积的并比较相似,只要把dp的过程稍加修改,用len[i][j]表示第i个节点控制的区域中第j种蔬菜覆盖的长度,然后根据当前节点的状态和子节点的状态完成状态转移。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 60010int N, K, M, ty[MAXD], cnt[4 * MAXD][3], len[4 * MAXD][3], price[5], hash[110];struct Seg{ int x, y1, y2, c 阅读全文
posted @ 2012-04-10 19:46 Staginner 阅读(351) 评论(0) 推荐(0)
摘要: POJ_2464 这个题目就是把POJ_2352数星星从一个象限拓展到了四个象限,把以每个点为中心四个象限内的点数都计算出来之后,只要枚举Stan所划的那条竖线的位置,并根据实际情况更新结果即可。#include<stdio.h>#include<string.h>#include<stdlib.h>#define INF 0x3f3f3f3f#define MAXD 200010int N, sum[4 * MAXD], tx[MAXD], ty[MAXD], X, Y, tr[MAXD], tl[MAXD], dl[MAXD], dr[MAXD], xn 阅读全文
posted @ 2012-04-10 17:25 Staginner 阅读(451) 评论(0) 推荐(0)
摘要: POJ_2482 这个题目类似黑书上的一个例题,在看了黑书的那个例题之后,以及做过前面关于扫面线的相关练习之后,这个题目的思路就不难理解了。 首先我们要控制矩形横向的位置,完成这一点可以用一个队列,当队尾的x和队首的x之差大于或等于W就让队首的点出队即可。接下来,就是考虑如果矩形从下往上滑动时,在哪个位置所圈的星星的总亮度最高呢?黑书上介绍了算法,我们可以把每个星星按纵坐标的拆成两个点,一个是y,一个是y+H,如果y点亮度为z的话,那么y+H点的亮度就是-z,这样求y方向上的最大前缀和就得到了最高的总亮度,所以我们需要用一棵线段树维护各个前缀和,并能够查询所有前缀和的最大值。 更多和线段树、扫 阅读全文
posted @ 2012-04-10 14:45 Staginner 阅读(668) 评论(0) 推荐(0)
摘要: HDU_3624 这个题目要求去求覆盖三次及以上的部分的体积。 如果我们把z坐标离散化的话,每一层z中如果某个部分被覆盖了三次及以上的话,那么等价于这一层z在xy平面上的对应的投影被覆盖了三次及以上,因此对于每一层z我们可以先求出投影中被覆盖了三次及以上的面积,然后乘以这一层z的高度就是这一层z中被覆盖了三次及以上的体积了。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 2010#define K 3int N, M, Z, S, ty[MAXD], tz[MAXD], co 阅读全文
posted @ 2012-04-10 12:48 Staginner 阅读(282) 评论(0) 推荐(0)
摘要: HDU_1225 拓展一下求K次覆盖的矩形的并的话就是UVA_11983那个题了。感觉上用线段树处理矩形的并,首先就是要标记出哪些区间被覆盖了,其次就是要用类似dp的思想,用cover[i][j]表示在线段树上的节点i表示的范围内,覆盖了j次的线段总长度,同时cover[i][K]表示的是覆盖了K次及大于K次的线段的总长度,然后依据左右儿子的状态来更新cover[i][j]的状态。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#define MAXD 20 阅读全文
posted @ 2012-04-10 01:45 Staginner 阅读(322) 评论(0) 推荐(0)