上一页 1 ··· 28 29 30 31 32 33 34 35 36 ··· 85 下一页
  2012年4月11日
摘要: UVA_11983 这个题目可以转化成求被覆盖K次的矩形面积的并,只要将x2和y2都+1即可,相当于我们把每个单位正方形看成一个点。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXK 11#define MAXD 60010int N, K, M, len[4 * MAXD][MAXK], cnt[4 * MAXD], ty[MAXD];struct Seg{ int x, y1, y2, col;}seg[MAXD];int cmpint(const void *_p, con 阅读全文
posted @ 2012-04-11 16:29 Staginner 阅读(489) 评论(0) 推荐(0) 编辑
  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 阅读(345) 评论(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 阅读(440) 评论(0) 推荐(0) 编辑
摘要: POJ_2482 这个题目类似黑书上的一个例题,在看了黑书的那个例题之后,以及做过前面关于扫面线的相关练习之后,这个题目的思路就不难理解了。 首先我们要控制矩形横向的位置,完成这一点可以用一个队列,当队尾的x和队首的x之差大于或等于W就让队首的点出队即可。接下来,就是考虑如果矩形从下往上滑动时,在哪个位置所圈的星星的总亮度最高呢?黑书上介绍了算法,我们可以把每个星星按纵坐标的拆成两个点,一个是y,一个是y+H,如果y点亮度为z的话,那么y+H点的亮度就是-z,这样求y方向上的最大前缀和就得到了最高的总亮度,所以我们需要用一棵线段树维护各个前缀和,并能够查询所有前缀和的最大值。 更多和线段树、扫 阅读全文
posted @ 2012-04-10 14:45 Staginner 阅读(657) 评论(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 阅读(276) 评论(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 阅读(314) 评论(0) 推荐(0) 编辑
  2012年4月9日
摘要: HDU_2656 由于K比较小,Y也在int的范围内,所以可以不断生成比X大一点的排列,直到生成到第K个为止。#include<stdio.h>#include<string.h>int X, K;struct Integer{ int a[32]; void init(int x) { int i; for(i = 0; i < 32; i ++) { a[i] = x % 2; x /= 2; } } void getnext() { int... 阅读全文
posted @ 2012-04-09 23:35 Staginner 阅读(278) 评论(0) 推荐(0) 编辑
摘要: HDU_3265 如果我们把一个掏了洞的矩形切成4个完整的矩形的话,那么这就跟普通的求矩形面积的并的问题是一样的了。 此外要注意一下中间结果可能会超过int的范围。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 50010int N, D, len[4 * MAXD], cnt[4 * MAXD], E;struct Seg{ int x, y1, y2, col;}seg[8 * MAXD];int cmps(const void *_p, const void *_q){ 阅读全文
posted @ 2012-04-09 10:51 Staginner 阅读(487) 评论(0) 推荐(0) 编辑
摘要: HDU_1828 以前只用离散化的思想写过这个题,现在又结合上线段树重新写了一遍。如果希望只沿一个方向扫描一遍就求出周长的话,那么相当于需要用两种方式分别求水平和竖直部分的周长。比如我们沿x方向扫描,那么竖直方向上的边长就需要通过矩形覆盖扫描线的总长度的变化值来计算,而水平方向上的边长就需要用点数乘以区间跨度去计算。 其实感觉也可以在两个方法中任选一个,分别沿x、y方向各扫描一遍,也可以求出最后的周长。 此外,如果我们沿x方向扫描,并按矩形覆盖的扫描线的总长度的变化值去计算竖直部分的边长的话,那么最初在对线段排序时,同一x值的线段一定要是矩形右边的边在前,是矩形左边的边在后。也就是说同一x.. 阅读全文
posted @ 2012-04-09 00:22 Staginner 阅读(422) 评论(0) 推荐(0) 编辑
  2012年4月7日
摘要: HDU_1542 如果我们将矩形左右两条边拓展成直线的话,这样平面就被分成了若干个区域,而每个区域内矩形覆盖的面积就等于这个区域的宽度乘以该区域内y轴方向上矩形覆盖的线段的长度和。 于是我们可以把y坐标离散化并建立线段树,然后沿x轴的方向进行扫描,每当遇到一条矩形左边的竖直边,就将其并到线段树中,每当遇到一条矩形右边的竖直边,就将线段树中以前并上的对应的左边的竖直边从线段树中删除。同时,每次在操作之前都可以将当前新扫描到的面积累加起来。为了能够表述“并”与“删除”,我们可以在线段树中用一个数组cnt表示这个节点表示的区间被覆盖了多少次,而不能简单的当成染色问题来对待,因为如果一个区间被覆盖了多 阅读全文
posted @ 2012-04-07 23:00 Staginner 阅读(580) 评论(2) 推荐(0) 编辑
上一页 1 ··· 28 29 30 31 32 33 34 35 36 ··· 85 下一页