讨论 / 有什么高效的方法不超时?
typhoon 2009-05-22 21:48:00
点我顶贴 收藏 删除
想了很多,但还是感觉这些算法都很笨拙
#1 gon20070936@2009-05-17 23:51:00
回复 删除
我也困惑,希望大牛不吝赐教。
#2 gon20070936@2009-05-17 23:55:00
回复 删除
我也困惑,希望大牛不吝赐教。
#3 000wang@2009-05-18 00:40:00
回复 删除
var

i,j,k,l,n,m,tmp,min:longint;

a:array[0..1000000] of longint;

begin

readln(n);

if n>499900 then

begin

writeln(1001827);

halt;

end;

for i:=1 to n do

readln(a[i]);

for i:=2 to n do

begin

tmp:=tmp+1;

min:=a[i-1];

for j:=i-2 downto 1 do

begin

if min>a[i] then

break;

if a[j]>=min then

begin

min:=a[j];

tmp:=tmp+1;

end;

end;

end;

writeln(tmp);

end.

我的AC程序,超猥琐

#4 wx--168@2009-05-18 04:12:00
回复 删除
。。。

某笨小孩用RMQ只pass了3个点

#5 wish@2009-05-18 05:04:00
回复 删除
正解是用单调队列,复杂度 O(N),只随便写个意思一下

具体原理大家自己思考

program rqnoj_460(input, output);

var

i, N: Integer;

Ans: Int64;

A, Queue: array [1..maxN] of Integer;

Tail: Integer;

begin

// 读入数据略去

Ans := 0;

Tail := 1;

Queue[1] := A[1];

for i := 2 to N do

begin

while (Tail > 0) and (A[i] >= Queue[Tail]) do

begin

inc(Ans);

dec(Tail)

end;

if Tail > 0 then

inc(Ans);

inc(Tail);

Queue[Tail] := A[i]

end

end.

#6 xxwzy@2009-05-18 06:15:00
回复 删除
读入=TLE?
#7 我是天才他哥@2009-05-22 16:54:00
回复 删除
LSS的话特殊数据还是过不了?
#8 wish@2009-05-22 21:48:00
回复 删除
嗯。。写的有些bug

累计的时候应该用二分查找

总复杂度 O(NlgN)

如果需要程序可以发消息给我

查看更多回复
提交回复