vijos 火烧赤壁
pascal吧
全部回复
仅看楼主
level 5
大牛帮做一下
2009年11月18日 14点11分 1
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 5
3Q
2009年11月21日 08点11分 3
level 1
题目是什么?
2009年11月28日 05点11分 4
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分
1