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
;
}
查看全文
相关阅读:
helloc
传Intel镁光合资公司重启新加坡闪存芯片厂投产计划 月产能可达10万片
关于c++ cout输出顺序问题。
记录一次迁移Apollo Server V3的过程
从springfox迁移到springdoc
angular和spring boot的standalone部署
随便总结几条委托和事件的知识点
TCP连接的建立与断开
开博第一天
使用HTTP协议时判断客户端是否“在线”?
原文地址:https://www.cnblogs.com/SQL/p/934721.html
最新文章
Android开发教程汇总
对于Force.com平台的一些批评 持续更新中
ReSharper+7.1.1000.900+官方原版+注册机
Java设计模式之代理模式的动态代理下篇
Java设计模式之代理模式☞再谈JDK的动态代理
Java设计模式之外观模式
Java设计模式之观察者模式
Java设计模式之迭代器模式
Java设计模式之适配器模式
Java设计模式之装饰模式
热门文章
Java设计模式之代理模式的动态代理上篇
Java设计模式之原型模式
Java设计模式之代理模式的静态代理
So easy,JQuery调用WebServices
有时候我感觉自已像一只小小鸟
【代码片段】jQuery简写
【公式转换】px to em
【代码优化】避免CSS表达式而选择一次性表达式
自己写的路径文件对比的程序
人人网日志导出
Copyright © 2011-2022 走看看