上一页 1 ··· 13 14 15 16 17 18 19 20 21 ··· 34 下一页
摘要: hdu1255 覆盖面积题意:求N个矩形中,求被覆盖至少俩次的面积和分析:一开始以为用总面积减去面积并就可以了,可是想了想,当面积被覆盖了俩次以上,就漏减 了,所以只能老老实实算了。具体方法跟求面积并十分类似,求面积并时,排完序之后,每次插入一条线段之后,求出整个区间当前被覆盖的总长度再乘以 前后俩条线段的水平距离;而这道题目,每次插入一条线段之后,求整个区间当前被覆盖至少俩次的总长度再乘以水平距离,;要求整个区间被覆盖至少俩次的总长度,只需在原有代码上添加几个更新而已,具体代码附了解释#include<iostream>#include<algorithm>#defi 阅读全文
posted @ 2011-10-02 21:00 枕边梦 阅读(623) 评论(0) 推荐(0) 编辑
摘要: 求N个矩形的面积并,这个比周长并要简单的多,不过涉及到了离散化,根据相对大小,给对应的double型数据编号,插入是再二分查找编号即可也可以用矩形切割去做,代码简单很多矩形切割#include<iostream>#include<algorithm>#include<string>#include<math.h>using namespace std;const int N = 100+10;struct rec{ double p1[2],p2[2];}r[N];rec rr[N*N];int total;inline double get_a 阅读全文
posted @ 2011-10-02 19:10 枕边梦 阅读(276) 评论(0) 推荐(0) 编辑
摘要: 这困扰我N久的题目,终于过了。求N个矩形的周长并,一开始觉得太遥不可及了,感觉好复杂 ,总想先搞懂计算的方法,再看大牛的方法,可是N久之后,对那个方法还是一知半解;今天结合了代码还有下面俩副图之后,突然觉得豁然开朗啦,自己敲了一遍代码……重点:我觉得,最重要的就是理解下面三个式子了,理解了之后,就知道该怎么建立线段树了;ans+=num[1]*(ss[i+1].x-ss[i].x);(横边)ans+=abs(len[1]-last);(竖边)last=len[1];对所有的竖边按照x值从小到排序,之后按顺序插入线段树;ans累加的是最终结果,num[1]是整个区间内连续的线段数(将竖边投影到y 阅读全文
posted @ 2011-10-02 16:31 枕边梦 阅读(1238) 评论(1) 推荐(0) 编辑
摘要: hdu 2522 A simple problem除法的本质,模拟除法的过程即可;中间用一个数组保存出现过的余数,若同一个余数出现俩次,则出现了循环节;考虑可能出现负数;#include<stdio.h>#include<string.h>int f[100000];int hash[100000];int main(){ int t,m,y,cnt,n,i; scanf("%d",&t); while(t--) { scanf("%d",&n); if(n<0) { printf("-" 阅读全文
posted @ 2011-09-24 00:42 枕边梦 阅读(254) 评论(0) 推荐(1) 编辑
摘要: hdu 1556 Color the ball中文的题目,题意就不说了用线段树做了,不过有不用线段树的方法,不过我解释不来贴代码吧#include<iostream>#define MAXN 100010using namespace std;int p[MAXN<<2];void insert(int k,int s,int t,int l,int r){ if(l<=s && t<=r) { p[k]++; return ; } int kl=k<<1,kr=kl+1,mid=(s+t)>>1; if(l<= 阅读全文
posted @ 2011-09-24 00:31 枕边梦 阅读(215) 评论(0) 推荐(0) 编辑
摘要: pku 3667 Hotel题意:去掉题目背景,就是给你一个[1,n]的区间,初始时,整个区间为空,在区间进行俩个操作:1) 输入 1 D :在区间上从左到右找出第一个连续的长度为D 的空间,并将该区间填满,输出区间的端点,若不存在,输出02) 输入 2a b: 将区间[a,a+b-1] 填满分析:很明显是用线段树进行维护,关键是每一个节点需要保存该区间的些什么值?这里我们可以想到,因为要找出的是一个连续的空区间的左端点,这个区间可能分布在左儿子上,右儿子上,或者可能在俩边都有,这样给查询带来了极大的不方便。不过,我们可以充分利用线段树的结构特点,通过保存与区间左右端点有关的信息,就可以遍历整 阅读全文
posted @ 2011-09-23 09:56 枕边梦 阅读(352) 评论(0) 推荐(0) 编辑
摘要: hdu 2795 Billboard题意:h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子思路:总共有h个叶节点,表示有h个区间,线段树的一个域表示该区间还能容纳的最大物品,每次找到最大值的位子(先找左边),然后减去L线段树功能:query:区间求最大值的位子(直接把update的操作在query里做了)#include<iostream>#include<algorithm>#define MAXN 222222using namespace std;int p[MAXN*4];int query(int k,int x,int s,int t){ 阅读全文
posted @ 2011-09-22 17:59 枕边梦 阅读(126) 评论(0) 推荐(0) 编辑
摘要: pku 1436 Horizontally Visible Segments题意:在水平坐标系内,有n条垂直线段,问任意三条线段组成一组,问有多少组线段满足,其中任意俩条线段水平可见。水平可见满足:存在一条水平线段将俩条线段连接起来,并且中间不与其他任意线段有交点分析:这是一个染色的问题。首先将线段按横坐标进行排序,接着,从左往右判断当前线段与左边的线段是否水平可见。问题转换:将线段的编号理解为该线段的颜色,那么判断该线段与前面已经插入的线段是否水平可见,只需在查询过程中判断与该区间相交的区间是否存在整个被染成某一种颜色,如果是,则该区间的颜色标号代表的线段与当前线段水平可见。这里要注意查询与 阅读全文
posted @ 2011-09-22 11:46 枕边梦 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4012下面分析转自大牛:http://www.cnblogs.com/ambition/archive/2011/09/08/Paint_on_a_Wall.html题目大意:给出一个2×n的矩阵(n<=8),每次给一个矩形染色,之后的染色覆盖以前的颜色,问到达目标状态需要多少次看到题目数据量想到了要用搜索去做,想了很久才想出搜索方法,搜索题中的极品啊~~因为每一次涂色肯定会有至少一块颜色是最终显示的颜色,所以用状态记录每一块是否是最终显示的颜色,因为只有2×8块,用二进制 阅读全文
posted @ 2011-09-20 19:56 枕边梦 阅读(487) 评论(0) 推荐(0) 编辑
摘要: 为什么这样就过了,比赛的时候怎么改都WA了,我只不过把条件改得更严格一点,把多余的判断去掉而已;hdu 4046 Panda题意:给你一个字符串,由'w'和 'b' 组成,对该字符串有俩个操作,当输入为0时,询问该区间[a,b] 内有多少个串 为 "wbw";当输入为0时,将下标为k的字符改为输入的字符;注意:这里的a,b,k表示的都是字符串的下标,也就是取值范围为[0,n-1];分析:对这种区间修改或询问的题目,首先想到的就是线段树或者树状数组了,不过还是线段树熟悉一点,我用线段树做的 ,关键还是构造模型,区间内每一个点的值表示的是什么?我 阅读全文
posted @ 2011-09-19 15:13 枕边梦 阅读(360) 评论(0) 推荐(0) 编辑
上一页 1 ··· 13 14 15 16 17 18 19 20 21 ··· 34 下一页