标签:des style blog http color os io strong
与求面积并的差不多,但是这个与扫描的方向相同的情况不太好处理,如果扫描线离散化两次扫两遍其实也可以解决这个问题,但是这样无论在时间还是空间上稍微就有点浪费了啊。这里因为我是离散x坐标的所以对于平行于y轴的方向上的统计比较难统计。处理的方法是:标记区间左边的断点,和右边的断点,求出这个区间一共有多少个断点。就可以统计出平行于y轴的长度了。这里合并的时候需要判断右边的左区间和左边的右区间是否相同,如果相同的话,说明他们连接到了一起,要减去多加的。
| Time Limit: 2000MS | Memory Limit: 10000K | |
| Total Submissions: 10300 | Accepted: 5462 |
Description


Input
Output
Sample Input
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
Sample Output
228
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <ctime>
#include <map>
#include <set>
#define eps 1e-12
///#define M 1000100
#define LL __int64
///#define LL long long
///#define INF 0x7ffffff
#define INF 0x3f3f3f3f
#define PI 3.1415926535898
#define zero(x) ((fabs(x)<eps)?0:x)
using namespace std;
const int maxn = 50100;
struct node
{
int l, r;
int h;
int x;
} f[maxn];
int dc[maxn];
int cnt[maxn<<2];
int sum[maxn<<2];
int ans[maxn<<2];
int Left[maxn<<2];
int Right[maxn<<2];
bool cmp(node a, node b)
{
return a.h < b.h;
}
int Find(int x, int a[], int n)
{
int l = 0;
int r = n-1;
while(l <= r)
{
int mid = (l+r)>>1;
if(a[mid] == x) return mid;
else if(a[mid] < x) l = mid+1;
else r = mid-1;
}
return -1;
}
void Up(int l, int r, int site)
{
if(cnt[site])
{
sum[site] = dc[r+1]-dc[l];
Left[site] = Right[site] = 1;
ans[site] = 2;
}
else if(l == r)
{
sum[site] = 0;
ans[site] = 0;
Left[site] = Right[site] = 0;
}
else
{
sum[site] = sum[site<<1]+sum[site<<1|1];
ans[site] = ans[site<<1]+ans[site<<1|1];
Left[site] = Left[site<<1];
Right[site] = Right[site<<1|1];
if(Left[site<<1|1] && Right[site<<1]) ans[site] -= 2;
}
}
void Update(int l, int r, int L, int R, int d, int site)
{
if(L <= l && r <= R)
{
cnt[site] += d;
Up(l, r, site);
return;
}
int mid = (l+r)>>1;
if(L <= mid) Update(l, mid, L, R, d, site<<1);
if(R > mid) Update(mid+1, r, L, R, d, site<<1|1);
Up(l, r, site);
}
int main()
{
int n;
while(cin >>n)
{
if(!n) break;
int x1, y1, x2, y2;
int m = 0;
for(int i = 0; i < n; i++)
{
scanf("%d %d %d %d",&x1, &y1, &x2, &y2);
dc[m] = x1;
f[m].l = x1;
f[m].r = x2;
f[m].h = y1;
f[m++].x = 1;
dc[m] = x2;
f[m].l = x1;
f[m].r = x2;
f[m].h = y2;
f[m++].x = -1;
}
sort(dc, dc+m);
sort(f, f+m, cmp);
int k = unique(dc, dc+m)-dc;
memset(cnt, 0, sizeof(cnt));
memset(sum, 0, sizeof(sum));
memset(ans, 0, sizeof(ans));
memset(Left, 0, sizeof(Left));
memset(Right, 0, sizeof(Right));
int res = 0;
int x = 0;
for(int i = 0; i < m; i++)
{
int l = Find(f[i].l, dc, k);
int r = Find(f[i].r, dc, k)-1;
if(l <= r) Update(0, k-1, l, r, f[i].x, 1);
if(i+1 < m) res += ans[1]*(f[i+1].h-f[i].h);
res += abs(sum[1]-x);
x = sum[1];
}
cout<<res<<endl;
}
return 0;
}
POJ 1177 Picture(扫描线求周长),布布扣,bubuko.com
标签:des style blog http color os io strong
原文地址:http://blog.csdn.net/xu12110501127/article/details/38444833