讨论 / 太蛋疼了
巫剑仙 2010-11-02 17:17:00
点我顶贴 收藏 删除
FP最大的点4s都过不去,C++0.9s。。。

这是我的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选手,我感到鸭梨很大。。。

查看更多回复
提交回复