zoukankan      html  css  js  c++  java
  • 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.
    

      

  • 相关阅读:
    贪心算法(2)-Kruskal最小生成树
    qsort函数、sort函数 (精心整理篇)
    并查集(2)-按秩合并和路径压缩
    C语言二维数组作为函数的参数
    结构体定义 typedef struct 用法详解和用法小结
    并查集(1)-判断无向图是否存在环
    蚂蚁庄园攻略
    java 获取class文件所在路径
    background-color
    appendChild append insertBefore prepend
  • 原文地址:https://www.cnblogs.com/x1273011572/p/6710445.html
Copyright © 2011-2022 走看看