您的位置:首页 > 其它

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: