摘要:
HDU_3340 这个题目要查询一个区间内的面积和,很容易联想到用线段树去做,但关键的问题在于由于有添加一个多边形的操作,那么我们如何下传标记去修改一个区间的面积和? 由于涉及到下传标记就涉及到标记叠加,因此我们要设法把面积的增量转化成用可以叠加的标记进行计算的形式。 在计算几何求面积的时候有一种方法是转换成梯形的有向面积累加计算,而梯形的面积主要取决于两个底和高的长度。对于这个题来讲,梯形高的长度就是x轴上区间的长度,这个很容易求得,而两个底的长度恰好就是我们想要的可以叠加的标记,因为(a+b)*h/2+(c+d)*h/2=((a+c)+(b+d))*h/2,而且根据两个底的长度就可以算.. 阅读全文
posted @ 2012-04-13 23:34
Staginner
阅读(493)
评论(0)
推荐(0)
摘要:
HDU_3016 为了处理起来方便,我们可以先将plank对h排个序,最后补一个(0,100000)的value为0的plank。我们可以用f[i]表示跳到第i个plank时value和的最大值进行dp,每次在寻找可以由哪些plank落到第i个plank上时可以借助线段树。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 100010int N, M, f[MAXD], num[4 * MAXD], col[MAXD];struct Plank{ int h, x1, x2, 阅读全文
posted @ 2012-04-13 15:16
Staginner
阅读(306)
评论(0)
推荐(0)
摘要:
HDU_3874 这个题目和HDU_3333几乎一模一样,具体的思路可以参考我的HDU_3333的题解:http://www.cnblogs.com/staginner/archive/2012/04/13/2445104.html。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 50010#define MAXQ 200010long long int sum[4 * MAXD];int N, Q, a[MAXD], tx[MAXD], X, r[MAXQ], where[ 阅读全文
posted @ 2012-04-13 12:16
Staginner
阅读(272)
评论(0)
推荐(0)
摘要:
FZU_1656 这个题目和HDU_3333几乎一模一样,具体的思路可以参考我的HDU_3333的题解:http://www.cnblogs.com/staginner/archive/2012/04/13/2445104.html。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 100010#define MAXQ 1010int sum[4 * MAXD], N, Q, a[MAXD], tx[MAXD], X, where[MAXD], r[MAXQ];struct Q 阅读全文
posted @ 2012-04-13 01:20
Staginner
阅读(272)
评论(0)
推荐(0)
摘要:
HDU_3333 一开始死活想不出来怎么做,后来看了别人的题解发现原来这个题目要离线去做。 暂且不说为啥要离线去做,先说说大概统计的思路是怎样的。 为了能够使区间和表示的就是最终的结果,那么同一个数必然只能在线段树中出现一次,于是我们建立线段树的时候可以改成将每个a[i]逐一插入进去,如果当前要插入的a[i]已经在线段树中存在,那么就先将其从线段树中删掉,再将其插入到线段树中i这个位置,这样我们就避免了线段树中整数的重复的问题。 假如我们现在刚插入完a[y],那么我们就只要计算出[x,y]这个区间的和就可以作为对于[x,y]这个询问的结果了。因此我们可以按y的顺序依次回答每个问题。这也就是.. 阅读全文
posted @ 2012-04-13 01:11
Staginner
阅读(955)
评论(1)
推荐(0)
浙公网安备 33010602011771号