POJ 1177: Picture
2013-04-16 14:17
190 查看
矩形周长并。
扫描线的基本应用。
线段树果然是越写越熟越写越开心的哈~
注意一下每个节点代表的是一个区间而非一个点。
题目链接:http://poj.org/problem?id=1177
代码如下:
扫描线的基本应用。
线段树果然是越写越熟越写越开心的哈~
注意一下每个节点代表的是一个区间而非一个点。
题目链接:http://poj.org/problem?id=1177
代码如下:
#include<cstdio> #include<iostream> #include<sstream> #include<cstdlib> #include<cstring> #include<string> #include<climits> #include<cmath> #include<algorithm> #include<queue> #include<vector> #include<stack> #include<set> #include<map> #define INF 0x3f3f3f3f #define eps 1e-8 using namespace std; const int MAXN=30000; const int U=11000; int cot[MAXN<<2],tr1[MAXN<<2],tr2[MAXN<<2]; bool lbd[MAXN<<2],rbd[MAXN<<2]; vector<pair<pair<int,int>,pair<int,int> > > seg; void pushup(int rt, int l, int r) { if(cot[rt]) { lbd[rt]=rbd[rt]=true; tr1[rt]=r-l+1; tr2[rt]=2; } else if(l==r) { lbd[rt]=rbd[rt]=false; tr1[rt]=tr2[rt]=0; } else { lbd[rt]=lbd[rt<<1]; rbd[rt]=rbd[rt<<1|1]; tr1[rt]=tr1[rt<<1]+tr1[rt<<1|1]; tr2[rt]=tr2[rt<<1]+tr2[rt<<1|1]; if(rbd[rt<<1]&&lbd[rt<<1|1]) { tr2[rt]-=2; } } } void update(int L, int R, int c, int l, int r, int rt) { if(L<=l&&r<=R) { cot[rt]+=c; pushup(rt,l,r); return; } int mid=(l+r)>>1; if(L<=mid) { update(L,R,c,l,mid,rt<<1); } if(R>mid) { update(L,R,c,mid+1,r,rt<<1|1); } pushup(rt,l,r); } int main() { int n; while(scanf("%d",&n)==1) { memset(cot,0,sizeof(cot)); memset(tr1,0,sizeof(tr1)); memset(tr2,0,sizeof(tr2)); memset(lbd,0,sizeof(lbd)); memset(rbd,0,sizeof(rbd)); seg.clear(); int maxi=0; for(int i=0; i<n; i++) { int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); seg.push_back(make_pair(make_pair(y1,1),make_pair(x1+U,x2+U))); seg.push_back(make_pair(make_pair(y2,-1),make_pair(x1+U,x2+U))); maxi=max(maxi,x2+U); } sort(seg.begin(),seg.end()); int ans=0,pre=0; for(int i=0; i<2*n; i++) { if(seg[i].second.first<seg[i].second.second) { update(seg[i].second.first,seg[i].second.second-1,seg[i].first.second,0,maxi-1,1); } ans+=abs(tr1[1]-pre); pre=tr1[1]; if(i<2*n-1) { ans+=tr2[1]*(seg[i+1].first.first-seg[i].first.first); } } printf("%d\n",ans); } return 0; }
相关文章推荐
- 【转】POJ 1177 Picture(1)
- hdu 1828(poj 1177)Picture(线段树+扫描线)(轮廓线)
- POJ 1177 & HDU 1828 Picture(扫描线 + 求周长)
- POJ 1177 Picture & hdu 1828 Picture(扫描线)
- poj 1177 Picture
- POJ - 1177 Picture
- POJ 1177 Picture
- POJ 1177 Picture
- 【线段树+扫描线】 HDOJ 1828 && POJ 1177 Picture
- hdu 1828(poj 1177)Picture(线段树+扫描线)(轮廓线)
- poj 1177 picture 线段树
- HDU 1828 && POJ 1177 Picture(线段树+扫描线+离散化)
- POJ 1177 Picture【矩形周长并】
- hdu 1828 / poj/pku 1177(Picture)(线段树求矩形覆盖面周长)
- poj&nbsp;1177&nbsp;Picture(线段树+离散化+…
- poj 1177 & hdu 1828 Picture(线段树+离散化)
- POJ - 1177/HDU - 1828 Picture(线段树-矩形并周长)
- POJ 1177 Picture (线段树+离散化+扫描线) 详解
- hdu 1828(poj 1177)Picture(线段树+扫描线)(轮廓线)
- POJ 1177 Picture