标签:des style http color io os java ar strong
7 -15 0 5 10 -5 8 20 25 15 -4 24 14 0 -6 16 4 2 15 10 22 30 10 36 20 34 0 40 16
228
—————————————————————分割线————————————————————
题目大意:
给你n个矩形,保证这些矩形都是水平或者垂直的,求这些矩形所围成图形的周长
思路:
结构体保存矩形的左右端点,高度,下底边为1,上底边为-1
对矩形的高度从小到大排序,用一根扫描线从下往上扫
1、求底边:
周长并是长加宽,对于面积并中,已经知道每次覆盖区间线段长度,那么只要保存上一次的长度,那么这次和上一次的差值就是每次增加的线段长。即是底边
2、求高:
已知底边的长度,那么只要记录底边是由多少条连续区间线段构成的,假如为m,那么宽的数量就是m*2了。画画图
那么怎么求得连续子区间的数量?
一个节点的连续子区间的数量=左二子的连续区间数量+右儿子连续区间数量-(中间区间是否相连)
怎么判断中间区间是否相连? 记录一个区间的左右端点是否存在,如果左二子的右端点和右儿子的左端点都存在,则表明中间是连续的
仍然点表示线段,更新线段树的时候右端点-1,计算的时候把线段变为点 所以len[rt]=r-l+1
代码中保存节点信息的数组并没有初始化,因为根本没必要,是为什么呢?想想就知道了
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn=20001; using namespace std; int cnt[maxn<<2],len[maxn<<2],numseg[maxn<<2]; bool lbd[maxn<<2],rbd[maxn<<2]; struct Seg { int l,r,h; int s; Seg(){}; Seg(int a,int b,int c,int d):l(a),r(b),h(c),s(d){}; bool operator<(const Seg&cmp)const{ return h<cmp.h; } }ss[maxn]; void push_up(int rt,int l,int r) { if(cnt[rt]){ len[rt]=r-l+1; numseg[rt]=lbd[rt]=rbd[rt]=1; } else if(l==r){ len[rt]=numseg[rt]=lbd[rt]=rbd[rt]=0; } else { lbd[rt]=lbd[rt<<1]; rbd[rt]=rbd[rt<<1|1]; len[rt]=len[rt<<1]+len[rt<<1|1]; numseg[rt]=numseg[rt<<1]+numseg[rt<<1|1]-lbd[rt<<1|1]*rbd[rt<<1]; } } void update(int L,int R,int c,int l,int r,int rt) { if(L<=l&&r<=R){ cnt[rt]+=c; push_up(rt,l,r); return ; } int m=(l+r)>>1; if(L<=m) update(L,R,c,lson); if(m<R) update(L,R,c,rson); push_up(rt,l,r); } int main() { int n; while(scanf("%d",&n)!=EOF){ int a,b,c,d,m=0; int l_bd=1<<30,r_bd=-1<<30; while(n--){ scanf("%d %d %d %d",&a,&b,&c,&d); l_bd=min(l_bd,a),r_bd=max(r_bd,c); ss[m++]=Seg(a,c,b,1); ss[m++]=Seg(a,c,d,-1); } sort(ss,ss+m); int ret=0,last=0; for(int i=0;i<m;++i){ update(ss[i].l,ss[i].r-1,ss[i].s,l_bd,r_bd,1); ret+=numseg[1]*(ss[i+1].h-ss[i].h)*2; ret+=abs(len[1]-last); last=len[1]; } printf("%d\n",ret); } return 0; }
因为一个样例结束后,是计算到上底边的,下个样例开始时是从下底边开始计算的,那么 -1+1=0,就清空了,节点信息是实时更新的。
HDU 1828——Picture(线段树+周长并+扫描线)
标签:des style http color io os java ar strong
原文地址:http://blog.csdn.net/u014141559/article/details/39524295