uoj6
这道题看起来仿佛有点水
从小到大贪心,舍去左下角和右上角
空间卡得有点紧,用integer/short int
1、30分做法
记录数字的顺序及每个数字的位置,然后对于每个数字的位置与前面已取数字的位置进行判断,时间复杂度(n3)
const maxnm=5000*5000+10;maxn=5000+10;
var pre,now,a,b,c,d,i1:int64;
n,m,qu,nm,i,j,num,u,v,k:longint;
t:array[0..maxnm] of longint;
x:array[0..maxnm,1..2] of integer;
bool:array[0..maxnm] of boolean;
q:array[0..maxn*2] of longint;
procedure swap64(var x,y:int64);
var t:int64;
begin
t:=x;x:=y;y:=t;
end;
procedure swaplong(var x,y:longint);
var t:longint;
begin
t:=x;x:=y;y:=t;
end;
function check(x1,y1,x2,y2:longint):boolean;
begin
if (x1<x2)and(y1>y2)or(x1>x2)and(y1<y2) then exit(false);
exit(true);
end;
begin
read(pre,a,b,c,d);
read(n,m,qu);
nm:=n*m;
for i:=1 to nm do
t[i]:=i;
for i:=1 to nm do
begin
now:=(a*pre*pre+b*pre+c) mod d;
i1:=i;
swaplong(t[i],t[now mod i1+1]);
swap64(now,pre);
end;
for i:=1 to qu do
begin
read(u,v);
swaplong(t[u],t[v]);
end;
num:=0;
for i:=1 to n do
for j:=1 to m do
begin
inc(num);
x[t[num],1]:=i;
x[t[num],2]:=j;
end;
num:=0;
for i:=1 to nm do bool[i]:=false;
for i:=1 to nm do
for j:=1 to num+1 do
if j=num+1 then
begin
bool[i]:=true;
write(i,' ');
inc(num);
q[num]:=i;
end
else if check(x[i,1],x[i,2],x[q[j],1],x[q[j],2])=false then break;
end.
2、100分做法
对于行,记录比自身大的行的最小列,比自身小的行的最大列,对每个数字进行判断,时间复杂度(n2)
bzoj过,被UOJ卡到60。。。。。。
const maxnm=5000*5000+10;maxn=5000+10;oo=1000000000;
var pre,now,a,b,c,d,i1:int64;
n,m,qu,nm,i,j,num,u,v:longint;
t:array[0..maxnm] of longint;
x:array[0..maxnm,1..2] of integer;
line:array[0..maxn,0..1] of longint;
function min(x,y:longint):longint;
begin
if x<y then min:=x else min:=y;
end;
function max(x,y:longint):longint;
begin
if x>y then max:=x else max:=y;
end;
procedure swap64(var x,y:int64);
var t:int64;
begin
t:=x;x:=y;y:=t;
end;
procedure swaplong(var x,y:longint);
var t:longint;
begin
t:=x;x:=y;y:=t;
end;
function check(x1,y1,x2,y2:longint):boolean;
begin
if (x1<x2)and(y1>y2)or(x1>x2)and(y1<y2) then exit(false);
exit(true);
end;
begin
read(pre,a,b,c,d);
read(n,m,qu);
nm:=n*m;
for i:=1 to nm do
t[i]:=i;
for i:=1 to nm do
begin
now:=(a*pre*pre+b*pre+c) mod d;
i1:=i;
swaplong(t[i],t[now mod i1+1]);
swap64(now,pre);
end;
for i:=1 to qu do
begin
read(u,v);
swaplong(t[u],t[v]);
end;
num:=0;
for i:=1 to n do
for j:=1 to m do
begin
inc(num);
x[t[num],1]:=i;
x[t[num],2]:=j;
end;
for i:=1 to n do
begin
line[i,0]:=0;
line[i,1]:=oo;
end;
for i:=1 to nm do
if not((line[x[i,1],0]>x[i,2])or(line[x[i,1],1]<x[i,2])) then
begin
write(i,' ');
for j:=1 to x[i,1]-1 do line[j,1]:=min(line[j,1],x[i,2]);
for j:=x[i,1]+1 to n do line[j,0]:=max(line[j,0],x[i,2]);
end;
end.

浙公网安备 33010602011771号