眨眼间,那额外的一百年时光也过完了,NiroBC走到了人生的尽头。
NiroBC又一次在死亡面前老泪纵横。
NiroBC渴望着那个戴着黑色方框眼镜,方脸,穿着高腰裤的长者能够再一次出现,然而并没有。NiroBC不禁叹息。
我不能就这样死去!人生中还有那么多冲突没有解决!
NiroBC的人生可抽象成一个数列a[1..N],她需要总结自己的人生,便需要给自己的人生划分阶段。现在定义一段人生a[l..r]的冲突值是
其中最外面的[]表示,若里面的布尔表达式为真,则值为1,否则值为0。冲突值实际上就是相等的数的对数。
现在NiroBC老眼昏花,她显然不能把人生划分成太多的片段,否则大脑会转不过来。当然每一段的冲突值不能太大,因为NiroBC有精神洁癖。
NiroBC躺在病床上写不了程序,所以她让你写程序把a[1..N]划分成尽量少的片段,且每一段的冲突值都<=K。
第一眼看到这道题就觉得是贪心,但是发现这道题放在了第三题,而且时限开到了2s,让我有点虚,不过对拍过后还是对的。很明显的一个思想,若是同一个分段内能容纳更多的数,显然分段的长度更小的概率大,所以用O(n)的扫描判断就可以了。
var
t,a:array[0..500001] of longint;
n,i,j,ans,x,last:longint;
k,sum,tot:int64;
begin
readln(n,k);
ans:=1;last:=1;
for i:=1 to n do
begin
read(x);
sum:=sum+t[x];
a[i]:=x;
if sum>k then
begin
sum:=0;inc(ans);
for j:=i-1 downto last do dec(t[a[j]]);
last:=i;
end;
inc(t[x]);
end;
writeln(ans);
end.