HDU 1828 Picture 扫描线 求周长
2016-10-10 20:02
393 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1828
代码:
代码:
#include <bits/stdc++.h> #define sf scanf #define pf printf using namespace std; const int maxn = 5000 + 5; const int max_seg = maxn * 2; /** SEG */ struct Seg{ int l,r,h; int d; void set(int l,int r,int h,int d){ this -> l = l; this -> r = r; this -> d = d; this -> h = h; } }Segs[max_seg]; bool cmp(const Seg& a,const Seg& b){ return a.h < b.h; } /** SEG_TREE */ int HASH[max_seg],_FLAG[max_seg]; int _SUM[max_seg << 2],_EMPTY_CNT[max_seg << 2]; #define lson rt << 1,l,mid #define rson rt << 1 | 1,mid + 1 ,r #define init_rt int rt ,int l , int r void PushUp(int rt,int l,int r){ int mid = l + r >> 1; _SUM[rt] = _SUM[rt << 1] + _SUM[rt << 1 | 1]; _EMPTY_CNT[rt] = _EMPTY_CNT[rt << 1] + _EMPTY_CNT[rt << 1 | 1]; if(_FLAG[mid] == 0 && _FLAG[mid + 1] == 0) _EMPTY_CNT[rt]--; } void Build(init_rt){ if(l == r){ _SUM[rt] = _FLAG[rt] = 0; _EMPTY_CNT[rt] = 1; return; } int mid = l + r >> 1; Build(lson),Build(rson); PushUp(rt,l,r); } void Update(init_rt,int L,int R,int d){ if(l == r){ _FLAG[l] += d; if(_FLAG[l]){ _SUM[rt] = HASH[l]; _EMPTY_CNT[rt] = 0; } else _SUM[rt] = 0,_EMPTY_CNT[rt] = 1; return; } int mid = l + r >> 1; if(L <= mid) Update(lson,L,R,d); if(R > mid) Update(rson,L,R,d); PushUp(rt,l,r); } map<int,int> POS; int main(){ int n; while( sf("%d",&n) != EOF ){ int tmp = 1; for(int i = 0;i < n;++i){ int x1,x2,y1,y2;sf("%d %d %d %d",&x1,&y1,&x2,&y2); Segs[tmp].set(x1,x2,y1,1); HASH[tmp++] = x1; Segs[tmp].set(x1,x2,y2,-1); HASH[tmp++] = x2; } sort(Segs + 1,Segs + tmp,cmp); sort(HASH + 1,HASH + tmp); int HASH_TMP = 2;POS.clear(); for(int i = 2;i < tmp;++i) if(HASH[i] != HASH[i - 1]) HASH[HASH_TMP] = HASH[i],POS[HASH[i]] = HASH_TMP++; for(int i = 1;i < tmp;++i) HASH[i] = HASH[i + 1] - HASH[i]; Build(1,1,HASH_TMP - 2); int ret = 0; for(int i = 1;i < tmp;++i){ int L = POS[Segs[i].l],R = POS[Segs[i].r] - 1,ret_tmp = _SUM[1],TMP_EMPTY; Update(1,1,HASH_TMP - 2,L,R,Segs[i].d); TMP_EMPTY = _EMPTY_CNT[1]; TMP_EMPTY = TMP_EMPTY + (_FLAG[1] != 0) + (_FLAG[HASH_TMP - 2] != 0); ret_tmp = ret_tmp - _SUM[1]; ret_tmp = ret_tmp < 0 ? -ret_tmp : ret_tmp; ret = ret + ret_tmp + 2 * (TMP_EMPTY - 1) * (Segs[i + 1].h - Segs[i].h); } pf("%d\n",ret); } }
相关文章推荐
- HDU1828 Picture(线段树+扫描线求周长并)
- hdu 1828 Picture【扫描线求周长模板题】
- HDU 1828 Picture(线段树+扫描线求周长并)
- poj 1177 & hdu 1828 Picture 线段树 扫描线求矩形周长并
- POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算
- hdu 1828 Picture(线段树,扫描线之周长并)
- POJ 1177 & HDU 1828 Picture(扫描线 + 求周长)
- 【HDU 1828】 Picture (矩阵周长并,线段树,扫描法)
- 矩形周长并 hdu 1828 Picture
- POJ 1177 Picture & hdu 1828 Picture(扫描线)
- hdu1828[扫描线矩形周长并]
- HDU 1828 Picture(线段树 + 扫描线)
- 线段树:周长并:hdu1828 Picture
- 算法总结:【线段树+扫描线】&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828)
- HDU 1828 线段树之扫描线之周长并
- HDU 1828 Picture(线段树扫描线·周长并)
- hdu 1828 Picture 线段树 矩形周长并
- HDU 1828 / POJ 1177 Picture --线段树求矩形周长并
- HDU 1828 Picture(矩形周长并)
- HDU 1828 Picture(长方形的周长和)