【样例输入输出】
hotel.in | hotel.out |
5 2 3 0 5 1 3 0 2 1 4 1 5 | 3 |
这一题朴素枚举能得60分,加上链表以及前缀和优化可以得100分!
由于只选两个客栈,所以很容易想到用枚举搜索的方法来实现,不过数据又太大,这就可以用前缀和(大家应该都懂吧,后面二分专题还会用到)的方式来进行优化,还需加上链表优化
话不多说,下面是Pascal代码,Pascal代码有点长,但是很详细
后面会给出C++ Code
Pascal Code
program hotel;
var
n,kk,pp:longint;
ans:longint;
k,p:array[0..200000+10] of longint;
num,sum,next:array[0..200000+10] of longint;
procedure init;
begin
assign(input,'hotel.in');
assign(output,'hotel.out');
reset(input);
rewrite(output);
end;
procedure outit;
begin
close(input);
close(output);
halt;
end;
procedure readdata;
var
i,j:longint;
begin
read(n,kk,pp);
for i:=1 to n do
begin
read(k[i],p[i]);
sum[i]:=sum[i-1];
if p[i]<=pp then inc(sum[i]);
end;
for i:=2 to n do
for j:=i-1 downto 1 do
begin
if k[j]=k[i] then
begin
next[i]:=j;
break;
end;
end;
num[1]:=1;
for i:=2 to n do
num[i]:=num[next[i]]+1;
end;
procedure main;
var
i,j,x:longint;
begin
ans:=0;
//朴素枚举+前缀和优化
{for i:=1 to n do
begin
for j:=i+1 to n do//从i+1开始 避免重复计数
begin
if k[i]<>k[j] then continue;//色调不同 跳过
if sum[j]-sum[i-1]>0 then inc(ans);
end;
end;}
//链表枚举+前缀和优化
for j:=2 to n do
begin
i:=next[j];
while i<>0 do
begin
if sum[j]-sum[i-1]>0 then
begin
inc(ans,num[i]);
break;
end;
i:=next[i];
end;
end;
writeln(ans);
end;
begin
init;
readdata;
main;
outit;
end.