这是我的FP程序:
program R231;
const
maxn=1001000;
type
rec=record
num,place:longint;
end;
var
a:array[0..maxn] of rec;
sum,stage:array[1..maxn] of longint;
n,k,rest,kind,ans,ansl,ansr:longint;
procedure gf_init;
var i:longint;
begin
readln(n,k);
for i:=1 to n do
begin
read(a[i].num);
a[i].place:=i;
end;
end;
procedure qsort(l,r:longint);
var i,j,mid:longint;
t:rec;
begin
i:=l;j:=r;mid:=a[(l+r) shr 1].num;
repeat
while a[i].num<mid do inc(i);
while a[j].num>mid do dec(j);
if i<=j then
begin
t:=a[i];a[i]:=a[j];a[j]:=t;
inc(i);dec(j);
end;
until i>j;
if i<r then qsort(i,r);
if j>l then qsort(l,j);
end;
procedure gf_work;
var i,j:longint;
begin
qsort(1,n);
a[0].num:=-1;
for i:=1 to n do
begin
if a[i].num<>a[i-1].num then inc(kind);
stage[ a[i].place ]:=kind;
end;
j:=1;ans:=maxlongint;
sum[ stage[1] ]:=1;if k=1 then inc(rest);
for i:=2 to n do
begin
if sum[ stage[i] ]=k-1 then inc(rest);
inc(sum[ stage[i] ]);
while sum[ stage[j] ]>k do
begin
dec(sum[ stage[j] ]);
inc(j);
end;
if (rest=kind) and (i-j+1<ans) then
begin
ans:=i-j+1;
ansl:=j;ansr:=i;
end;
end;
end;
procedure gf_print;
begin
if rest<>kind then writeln(-1)
else writeln(ansl,' ',ansr);
end;
begin
gf_init;
gf_work;
gf_print;
end.
不是第8个点,就是第7个点,甚至连WA的情况都出现过。。。
改成C++:
#include<stdio.h>
#include<iostream>
#define Max_Num 100000000
#define MaxN 1000100
int num[MaxN],place[MaxN],sum[MaxN],stage[MaxN];
int n,k,ans,ansl,ansr,rest,kind;
void gf_init()
{
scanf( "%d%d" , & n , & k );
for (int i=1; i<=n ; i++ )
{
scanf( "%d" , &num[i] );
place[i]=i;
}
}
void gf_qsort(int l,int r)
{
int i=l;
int j=r;
int mid=num[ (l+r) >> 1 ];
while (i<=j)
{
while (num[i]<mid) ++i;
while (num[j]>mid) --j;
if (i<=j)
{
int t=num[i];num[i]=num[j];num[j]=t;
t=place[i];place[i]=place[j];place[j]=t;
++i;--j;
}
}
if (i<r) gf_qsort(i,r);
if (j>l) gf_qsort(l,j);
}
void gf_work()
{
gf_qsort( 1, n);
num[0]=-1;
for (int i=1 ; i<=n ; ++ i )
{
if (num[i] != num[i-1]) ++kind;
stage[ place[i] ]=kind;
}
int j=1;ans=Max_Num;
sum[ stage[1] ]=1;
if ( k==1 ) rest++;
for (int i=2 ; i<=n ; i++ )
{
++sum[ stage[i] ];
if (sum[ stage[i] ]==k) ++rest;
while (sum[ stage[j] ]>k)
{
--sum[ stage[j] ];
++j;
}
if (rest==kind && i-j+1<ans)
{
ans=i-j+1;
ansl=j;
ansr=i;
}
}
}
void gf_print()
{
if (rest != kind ) printf( "-1\n" );
else printf( "%d %d\n" , ansl , ansr );
}
int main()
{
gf_init();
gf_work();
gf_print();
}
一模一样是吧?AC。。。
作为一名FP选手,我感到鸭梨很大。。。