zoukankan
html css js c++ java
PKU1151线段树解法
模仿别人的代码写的
这题不用线段树也可以过
#include
<
stdio.h
>
#include
<
string
.h
>
#include
<
stdlib.h
>
struct
line
{
double
x, y1, y2;
int
in
;
}
;
struct
node
{
node
*
pl,
*
pr;
int
iL, iR;
double
left, right;
double
y_len;
int
in
;
}
mem[
404
];
line l[
202
];
double
y[
202
];
int
n;
double
sum;
int
nodeCnt;
node
*
newNode()
{
node
*
pt
=&
mem[nodeCnt
++
];
memset(pt,
0
,
sizeof
(pt));
return
pt;
}
node
*
buildTree(
int
il,
int
ir)
{
node
*
root
=
newNode();
root
->
iL
=
il;
root
->
iR
=
ir;
root
->
left
=
y[il];
root
->
right
=
y[ir];
if
(ir
-
il
>
1
)
{
int
mid
=
(il
+
ir)
/
2
;
root
->
pl
=
buildTree(il,mid);
root
->
pr
=
buildTree(mid,ir);
}
return
root;
}
void
length(node
*
root)
{
root
->
y_len
=
0
;
if
(root
->
in
)
{
root
->
y_len
=
root
->
right
-
root
->
left;
}
else
{
if
(root
->
pl)
root
->
y_len
+=
root
->
pl
->
y_len;
if
(root
->
pr)
root
->
y_len
+=
root
->
pr
->
y_len;
}
}
void
update(node
*
root, line ll)
{
if
(root
->
left
==
ll.y1
&&
root
->
right
==
ll.y2)
{
root
->
in
+=
ll.
in
;
length(root);
return
;
}
if
(root
->
iR
-
root
->
iL
<=
1
)
return
;
if
(root
->
pl
->
right
>
ll.y1)
{
if
(root
->
pl
->
right
>=
ll.y2)
update(root
->
pl, ll);
else
{
line temp
=
ll;
temp.y2
=
root
->
pl
->
right;
update(root
->
pl, temp);
temp
=
ll;
temp.y1
=
root
->
pr
->
left;
update(root
->
pr,temp);
}
}
else
{
update(root
->
pr, ll);
}
length(root);
}
int
cmp1(
const
void
*
a ,
const
void
*
b)
{
return
(
*
(line
*
)a).x
>
(
*
(line
*
)b).x
?
1
:
-
1
;
}
int
cmp2(
const
void
*
a,
const
void
*
b)
{
return
(
*
(
double
*
)a)
>
(
*
(
double
*
)b)
?
1
:
-
1
;
}
int
main()
{
int
T
=
1
;
while
(scanf(
"
%d
"
,
&
n)
==
1
&&
n)
{
nodeCnt
=
0
;
memset(l,
0
,
sizeof
(l));
memset(y,
0
,
sizeof
(y));
memset(mem,
0
,
sizeof
(mem));
int
i;
for
(i
=
0
; i
<
n; i
++
)
{
scanf(
"
%lf%lf%lf%lf
"
,
&
l[
2
*
i].x,
&
l[
2
*
i].y1,
&
l[
2
*
i
+
1
].x,
&
l[
2
*
i
+
1
].y2);
l[
2
*
i].y2
=
l[
2
*
i
+
1
].y2, l[
2
*
i
+
1
].y1
=
l[
2
*
i].y1;
l[
2
*
i].
in
=
1
, l[
2
*
i
+
1
].
in
=-
1
;
y[
2
*
i]
=
l[
2
*
i].y1, y[
2
*
i
+
1
]
=
l[
2
*
i].y2;
}
qsort(l,
2
*
n,
sizeof
(l[
0
]), cmp1);
qsort(y,
2
*
n,
sizeof
(y[
0
]), cmp2);
node
*
root
=
buildTree(
0
,
2
*
n
-
1
);
sum
=
0
;
for
(i
=
0
; i
<
2
*
n
-
1
; i
++
)
{
update(root, l[i]);
sum
+=
(root
->
y_len)
*
(l[i
+
1
].x
-
l[i].x);
}
printf(
"
Test case #%d\nTotal explored area: %.2f\n\n
"
,T
++
,sum);
}
return
0
;
}
查看全文
相关阅读:
Sublime 设置移动光标快捷键
Reverse Linked List II
Reverse Nodes in K-Group
Sort Colors
Swap Nodes in Pairs
Intersection of Two Linked Lists
Word Break
Unique Binary Search Tree
Maximal Square
Happy Number
原文地址:https://www.cnblogs.com/SQL/p/934721.html
最新文章
finally语句
Java各版本的含义
虚拟机三种网络模式
SIFT提取特征
addpath(),genpath()
数学小知识
机器学习之条件随机场
联合CRF和字典学习的自顶向下的视觉显著性-全文解读
重要的链接
Python OpenCV 显示图片,图片分类
热门文章
numpy 数组增加列,增加行的函数:column_stack,row_stack,删除行或列的函数,delete
机器学习-周志华-西瓜书-学习笔记
机器学习实战之决策树(二)
js五种设计模式说明与示例
讲课笔记3——浮动、margin失效的问题、默认样式重置
讲课笔记3——块、行内、优先级
讲课笔记3——CSS
讲课笔记2——表单标签
讲课笔记1——meta标签、表格标签
sublime 常用快捷键
Copyright © 2011-2022 走看看