Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

留ac代码帮助后人……丫的这题坑人地方数不胜数

Posted by xuhaoran510 at 2011-06-21 13:42:16 on Problem 2830
In Reply To:珍惜生命,远离此题 Posted by:xuhaoran510 at 2011-06-21 13:39:48
const eps=0;
type
	pack=record
			sign:longint;
			data:extended;
		end;
var
f,sum:array[0..100010] of pack;
bg,ed:array[0..100010] of longint;

function sgn(const x:extended):longint;
begin if abs(x)<=eps then exit(0);
	if x>eps then exit(1);
	exit(-1);
end;

function cmp(const x,y:pack):longint;
begin if (x.sign=-1)and(y.sign=1) then exit(-1);
	if (x.sign=1)and(y.sign=-1) then exit(1);
	if x.sign=1 then
	begin if abs(x.data-y.data)<=eps then exit(0);
		if x.data>y.data then exit(1);
		exit(-1);
	 end
	else begin
		if abs(x.data-y.data)<=eps then exit(0);
		if x.data>y.data then exit(-1);
		exit(1);
	end;
end;

function mult(const x,y:pack):pack;
begin with mult do
	begin sign:=x.sign*y.sign;
		data:=x.data+y.data;
	end;
end;


function divd(const x,y:pack):pack;
begin with divd do
	begin sign:=x.sign*y.sign;
		data:=x.data-y.data;
	end;
end;

function query(bg,ed:longint):pack;
var ans,x,min,max:pack;
    i:longint;
begin sum[bg]:=f[bg];
	if sum[bg].sign=1 then
	begin with min do
		begin sign:=1;
			data:=0;
		end;
		if cmp(sum[bg],min)=-1 then min:=sum[bg];
		with max do
		begin sign:=-1;
			data:=1e50;
		end;
	 end
	else begin
		with min do
		begin sign:=1;
			data:=0;
		end;
		with max do
		begin sign:=-1;
			data:=1e50;
		end;
		if cmp(sum[bg],max)=1 then max:=sum[bg];
	end;

	ans:=sum[bg];
	for i:=bg+1 to ed do
	begin sum[i]:=mult(sum[i-1],f[i]);
		if sum[i].sign=1 then
		begin if abs(min.data-1e50)>eps then
			begin x:=divd(sum[i],min);
				if cmp(x,ans)=1 then ans:=x;
			end;
			if cmp(sum[i],min)=-1 then min:=sum[i];
		 end
		else begin
			if abs(max.data-1e50)>eps then
			begin x:=divd(sum[i],max);
				if cmp(x,ans)=1 then ans:=x;
			end;
			if cmp(sum[i],max)=1 then max:=sum[i];
		end;
		if cmp(sum[i],ans)=1 then ans:=sum[i];
	end;
	exit(ans);
end;

procedure print(ans:pack);
var temp,final,w:extended;
    wc,tt:longint;
begin temp:=exp(5000);
	if ans.sign=-1 then write('-');
	w:=ans.data/ln(10);
	if (ln(0.9995)<=ans.data+1e-9)and(ans.data<ln(9.9995)) then
	begin writeln(exp(ans.data):0:3);
		exit;
	end;
	if w<0 then
		wc:=-trunc(abs(w)-1e-8)-1
	else  wc:=trunc(w+eps);

      wc:=0;
	if ans.data>0 then
	begin final:=1;
		while ans.data>5000 do
		begin final:=final*temp;
			while final>=9.9995 do begin final:=final/10; inc(wc); end;
			ans.data:=ans.data-5000;
		end;
		final:=final*exp(ans.data);
		while final>=9.9995 do begin final:=final/10; inc(wc); end;
	 end
	else begin
		final:=1; ans.data:=abs(ans.data);
		while ans.data>5000 do
		begin final:=final/temp;
			while final<0.9995 do begin final:=final*10; dec(wc); end;
			ans.data:=ans.data-5000;
		end;
		final:=final/exp(ans.data);
		while final<0.9995 do begin final:=final*10; dec(wc); end;
	end;
	tt:=trunc(final*1000+0.5);
	if (tt<1000)or(tt>9999) then while true do ;
	writeln(final:0:3,'E',wc);
end;

procedure lemon();
var n,i,all,curt:longint;
    x:extended;
    zero:boolean;
    ans,xx:pack;
begin readln(n);
	for i:=1 to n do
	begin read(x);
		with f[i] do
		begin sign:=sgn(x);
                  if sign<>0 then data:=ln(abs(x));
		end;
	end;
	all:=0; curt:=0;
	for i:=1 to n do
		if f[i].sign=0 then
		begin if curt+1<=i-1 then
			begin inc(all);
				bg[all]:=curt+1;
				ed[all]:=i-1;
			end;
			curt:=i;
		end;
	if curt<>n then
	begin inc(all);
		bg[all]:=curt+1;
		ed[all]:=n;
	end;

	zero:=false;
	for i:=1 to n do
		if f[i].sign=0 then
			zero:=true;

	with ans do
	begin sign:=-1;
		data:=1e50;
	end;

	for i:=1 to all do
	begin xx:=query(bg[i],ed[i]);
		if cmp(xx,ans)=1 then ans:=xx;
	end;

	for i:=1 to n do
		if (f[i].sign<>0)and(cmp(f[i],ans)=1) then
			ans:=f[i];

	if zero then
		if ans.sign=-1 then
		begin writeln('0.000');
			exit;
		end;

	print(ans);
end;

begin
{$IFNDEF ONLINE_JUDGE}
	assign(input,'2830.in');
	reset(input);
	assign(output,'2830.out');
	rewrite(output);
{$ENDIF}
while not seekeof(input) do lemon();
end.

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator