求矩形并的周长 poj 1177 picture
来源:互联网 发布:知らないうちに 编辑:程序博客网 时间:2024/05/19 00:42
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct node
{
int st, ed, m, lbd, rbd;
int sequence_line, count;
} ST[40005];
void build(int st, int ed, int v)
{
ST[v].st = st;
ST[v].ed = ed;
ST[v].lbd = ST[v].rbd = ST[v].m = 0;
ST[v].sequence_line = ST[v].count = 0;
if(ed - st > 1)
{
int mid = (st+ed)/2;
build(st, mid, 2*v+1);
build(mid, ed, 2*v+2);
}
}
inline void UpData(int v)
{
if(ST[v].count>0)
{
ST[v].m = ST[v].ed - ST[v].st;
ST[v].lbd = ST[v].rbd = 1;
ST[v].sequence_line = 1;
return ;
}
if(ST[v].ed - ST[v].st == 1)
{
ST[v].m = 0;
ST[v].lbd = ST[v].rbd = 0;
ST[v].sequence_line = 0;
}
else
{
int left = 2*v+1, right = 2*v+2;
ST[v].m = ST[left].m + ST[right].m;
ST[v].sequence_line = ST[left].sequence_line + ST[right].sequence_line - (ST[left].rbd&ST[right].lbd);
ST[v].lbd = ST[left].lbd;
ST[v].rbd = ST[right].rbd;
}
}
void insert(int st, int ed, int v)
{
if(st <= ST[v].st && ed >= ST[v].ed)
{
ST[v].count++;
UpData(v);
return ;
}
int mid = (ST[v].st + ST[v].ed)/2;
if(st < mid)insert(st, ed, 2*v+1);
if(ed > mid)insert(st, ed, 2*v+2);
UpData(v);
}
void Delete(int st, int ed, int v)
{
if(st <= ST[v].st && ed >= ST[v].ed)
{
ST[v].count--;
UpData(v);
return ;
}
int mid = (ST[v].st + ST[v].ed)/2;
if(st < mid) Delete(st, ed, 2*v+1);
if(ed > mid)Delete(st, ed, 2*v+2);
UpData(v);
}
struct line
{
int x, y1, y2;//y1 < y2
bool d;//d = true 表示线段为 矩形的左边, 反之为 右边.
}a[10003];
bool cmp(line t1, line t2)
{
return t1.x<t2.x;
}
void cal_C(int n);
int main()
{
freopen("input.txt", "r", stdin);
int n, x1, x2, y1, y2, suby, upy, i, j;
while(scanf("%d", &n) != EOF)
{
j = 0;
suby = 10000;
upy = -10000;
j = 0;
for(i = 0; i < n; i++)
{
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
a[j].x = x1; a[j].y1 = y1; a[j].y2 = y2;
a[j].d = 1;
j++;
a[j].x = x2; a[j].y1 = y1; a[j].y2 = y2;
a[j].d = 0;
j++;
if(suby > y1) suby = y1;
if(upy < y2) upy = y2;
}
sort(a, a+j, cmp);
build(suby, upy, 0);
cal_C(j);
}
return 0;
}
void cal_C(int n)
{
int i, t2, sum = 0;
t2 = 0;
a[n] = a[n-1];
for(i = 0; i < n; i++)
{
if(a[i].d)
insert(a[i].y1, a[i].y2, 0);
else
Delete(a[i].y1, a[i].y2, 0);
sum += ST[0].sequence_line * (a[i+1].x - a[i].x) * 2;
sum += abs(ST[0].m - t2);
t2 = ST[0].m;
}
printf("%d/n", sum);
}
- 求矩形并的周长 poj 1177 picture
- poj 1177 Picture(线段树求矩形周长并)
- POJ 1177 Picture 矩形周长并
- POJ 1177 Picture(矩形并的周长)
- HDU 1828 / POJ 1177 Picture --线段树求矩形周长并
- POJ-1177 Picture (线段树 求矩形周长)
- poj 1177 / hdu 1828 Picture 矩形周长并
- 矩形周长并 poj 1177Picture/hdu 1828
- poj 1177 Picture(线段树+矩形周长并)
- poj 1177 Picture(扫描线+矩形周长并)
- hdu 1828 poj 1177 picture 求周长并
- POJ 1177 Picture 求多个矩形周长 -
- poj 1177 矩形并的周长
- poj 1177 || HDU 1828 Picture (线段树扫描线求 图形并的周长)
- POJ1177 HDU1828 Picture,线段树求矩形并周长
- poj1177 Picture 扫描线求矩形周长并
- poj 1177 区间树求矩形周长并
- hdu 1828 / poj/pku 1177(Picture)(线段树求矩形覆盖面周长)
- VS2008升级
- 网站测试流程、要求及测试报告
- web.xml中无法识别taglib标签
- 用C#创建ActiveX控件供Web调用
- 分页存储过程
- 求矩形并的周长 poj 1177 picture
- window.open 打开的子窗口 闪一下即自动关闭问题
- 用AT指令 通过RS232发送和接收短信
- 在SQL Server 2005中查询表结构及索引
- excel的操作(生成Excel)
- Java程序员必须知道的
- 怎样学编程
- qt-embedded-linux-opensource-src-4.5.3移植到s3c6410
- 给C++初学者的50个忠告