level 0
题目 三国争霸系列之火烧赤壁
类型 数值/数论
难度 2
来源 Vijos
关键字 离散化
题目大意 给出N段线段求出覆盖长度
var
i,n,max,z:longint;
a,b:array[0..100000] of longint;
procedure init;
var
i:longint;
begin
readln(n);
for i := 1 to n do
begin
readln(a[i],b[i]);
end;
end;
//:::::::::::::::::::::::::::::::
procedure qsort(l,r:longint);
var
i,j,m,t:longint;
begin
i := l;
j := r;
m := a[(i+j) div 2];
repeat
while a[i]<m do inc(i);
while a[j]>m do dec(j);
if i<=j then
begin
t := a[i];
a[i] := a[j];
a[j] := t;
t := b[i];
b[i] := b[j];
b[j] := t;
inc(i);
dec(j);
end;
until i>=j;
if i<r then qsort(i,r);
if l<j then qsort(l,j);
end;
//:::::::::::::::::::::::::::::::
procedure main;
var
i:longint;
begin
z := b[1]-a[1];
max := b[1];
for i := 2 to n do
begin
if (a[i]<max) and (b[i]>max) then
begin
z := z+b[i]-max;
max := b[i];
end
else
begin
if (a[i]>max) then
begin
z := z+b[i]-a[i];
max := b[i];
end;
end;
end;
writeln(z);
end;
begin
init;
qsort(1,n);
main;
end.
分析 题目是给出起始点和结尾点,不是顺序给出的,所以要先排好起始点(注意:起始点的位置改变,结束点的位置也要跟着变,不要忘了结束点),查找每段线段的起始点是不是小于其他线段的结束点,是的话使两条线段的最小的起始点与两条线段的最大结束点连接计算出距离
时间复杂度 O(nlogn)
小结 无形之中使用了离散化,做完题后才知道这叫离散化
我不是牛
2009年11月19日 11点11分
2
level 6
哎,看来才知道,就是个翻版的usaco的Milking Cows
2009年11月28日 09点11分
5
level 4
2L,为什么你的空格没有被百(狗)度吃了??
我每次都被吃掉了……
2009年11月29日 02点11分
6
因为百(狗)度不饿
2015年11月29日 06点11分