您的位置:首页 > 其它

POJ 1177 Picture(求周长并)

2013-08-10 19:26 302 查看
题目链接

看的HH的题解。。周长有两部分组成,横着和竖着的,横着通过,sum[1] - last来计算,竖着的通过标记,记录有多少段。

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
#define maxn 10000
#define lson l , m, rt<<1
#define rson m+1, r,rt<<1|1
int que[maxn*4];
int sum[maxn*4];
int cnt[maxn*4];
bool lbd[maxn*4] , rbd[maxn*4];
int numseg[maxn*4];
struct node
{
int lx,rx,y;
int s;
node() {}
node(int a,int b,int c,int d):lx(a),rx(b),y(c),s(d) {}
bool operator < (const node &S) const
{
if(y == S.y) return s > S.s;
return y < S.y;
}
} mat[maxn];
int bin(int x,int n)
{
int str,end,mid;
str = 0,end = n;
while(str <= end)
{
mid = (str+end)/2;
if(que[mid] == x)
return mid;
else if(que[mid] > x)
end = mid - 1;
else
str = mid + 1;
}
return mid;
}
void pushup(int rt,int l,int r)
{
if(cnt[rt])
{
lbd[rt] = rbd[rt] = 1;
sum[rt] = que[r+1] - que[l];
numseg[rt] = 2;
}
else if (l == r)
{
sum[rt] = numseg[rt] = lbd[rt] = rbd[rt] = 0;
}
else
{
lbd[rt] = lbd[rt<<1];
rbd[rt] = rbd[rt<<1|1];
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
numseg[rt] = numseg[rt<<1] + numseg[rt<<1|1];
if (lbd[rt<<1|1] && rbd[rt<<1]) numseg[rt] -= 2;
}
}
void update(int L,int R,int c,int l,int r,int rt)
{
if(L <= l&&r <= R)
{
cnt[rt] += c;
pushup(rt,l,r);
return ;
}
int m = (l+r)>>1;
if(L <= m)
update(L,R,c,lson);
if(R > m)
update(L,R,c,rson);
pushup(rt,l,r);
}
int main()
{
int n,num,i,l,r;
int a,b,c,d;
while(scanf("%d",&n)!=EOF)
{
if(!n) break;
num = 0;
for(i = 0; i < n; i ++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
que[num] = a;
mat[num ++] = node(a,c,b,1);
que[num] = c;
mat[num ++] = node(a,c,d,-1);
}
sort(que,que+num);
sort(mat,mat+num);
int k = 1;
for(i = 1; i < num; i ++)
{
if(que[i] != que[i-1])
que[k++] = que[i];
}
int ans = 0,last = 0;
memset(cnt,0,sizeof(cnt));
memset(sum,0,sizeof(sum));
memset(lbd,0,sizeof(lbd));
memset(rbd,0,sizeof(rbd));
for(i = 0; i < num; i ++)
{
l = bin(mat[i].lx,k-1);
r = bin(mat[i].rx,k-1)-1;
if(l <= r)
update(l,r,mat[i].s,0,k-1,1);
ans += numseg[1] * (mat[i+1].y - mat[i].y);
ans += abs(sum[1] - last);
last = sum[1];
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: