Hướng dẫn giải của Cây nhị phân tìm kiếm


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

var re:boolean;
    min,max,a,b:int64;

begin
     re:=true;
     min:=-maxlongint-2;
     max:=-min;
     read(b);
     while not seekeoln do
     begin
          read(a);
          if (a>=max) or (a<=min) then
          begin
               re:=false;
               break;
          end;
          if a<b then
          begin
               if b<max then max:=b;
          end
          else
          begin
               if b>min then min:=b;
          end;
          b:=a;
     end;
     if re then writeln('YES')
     else writeln('NO');
end.

Code mẫu của happyboy99x

var min, max, pre, now: longint;

BEGIN
    read(pre); min := low(longint); max := high(longint);
    while not seekEOF do
    begin
        read(now);
        if(now = pre) or (now < min) or (now > max) then
        begin
            writeln('NO');
            halt;
        end;
        if(now < pre) then max := pre - 1
        else min := pre + 1;
        pre := now;
    end;
    writeln('YES');
END.

Code mẫu của ladpro98

#include <bits/stdc++.h>

const long long INF = (long long)1e15;

using namespace std;

int main() {
  ios::sync_with_stdio(0); cin.tie(0);
  long long low = -INF, high = INF;
  long long x, lastX; bool first = 1;
  while (cin >> x) {
    if (x <= low || high <= x) {
      cout << "NO\n";
      return 0;
    }
    if (!first) {
      if (x == lastX) {
        cout << "NO\n";
        return 0;
      }
      if (x < lastX)
        high = min(high, lastX);
      else
        low = max(low, lastX);
    }
    lastX = x;
    if (first) first = 0;
  }
  cout << "YES\n";
  return 0;
}

Code mẫu của RR

{$R-,Q-}
uses math;
const
  FINP='';
  FOUT='';
  MAXN=50001;
var
  nn,ln,a:array[1..MAXN] of longint;
  n:longint;
  check:boolean;
  f1,f2:text;
procedure openF; inline;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF; inline;
begin
  close(f1); close(f2);
end;
procedure inp; inline;
begin
  n:=0;
  while not seekeoln(f1) do
    begin
      n:=n+1;
      read(f1,a[n]);
    end;
end;
procedure solve; inline;
var
  i:longint;
begin
  ln[n]:=a[n];
  nn[n]:=a[n];
  for i:=n-1 downto 1 do
    begin
      nn[i]:=min(nn[i+1],a[i]);
      ln[i]:=max(ln[i+1],a[i]);
    end;
  check:=true;
  for i:=1 to n-1 do
    if (a[i]<a[i+1]) and (nn[i+1]<a[i]) then check:=false
    else if (a[i]>a[i+1]) and (ln[i+1]>a[i]) then check:=false;
end;
procedure ans; inline;
begin
  if check then writeln(f2,'YES')
  else writeln(f2,'NO');
end;
begin
  openF;
  inp;
  solve;
  ans;
  closeF;
end.

Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>
main()
{
long n,a[50001];
n=0;
while(scanf("%ld",&a[++n])>0);
--n;
int t=1;
long min=a[n];
long max=a[n];
for(long i=n-1;i>=1;i--)
  {
  if(a[i]<a[i+1]&&a[i]>min)
    {
    t=0;
    break;
    }
  else if(a[i]>a[i+1]&&a[i]<max)
    {
    t=0;
    break;
    }
  else
    {
    if(a[i]<min)
      min=a[i];
    else if(a[i]>max)
      max=a[i];
    }
  }
if(t==1)
  printf("YES");
else 
  printf("NO");
//getch();
}

Code mẫu của ll931110

{$MODE DELPHI}
program NKTREE;
const
  input  = '';
  maxn = 50000;
  maxv = (1 shl 31) - 1;
var
  a: array[1..maxn] of integer;
  inf,sup: integer;
  n: integer;

procedure init;
var
  f: text;
  i,x: integer;
begin
  assign(f, input);
    reset(f);

  n := 0;
  while not seekeoln(f) do
    begin
      inc(n);
      read(f, x);
      a[n] := x;
    end;

  close(f);

  inf := -maxv;
  sup := maxv;
end;

function check: boolean;
var
  i: integer;
begin
  if n = 1 then exit(true);
  if a[2] > a[1] then inf := a[1] else sup := a[1];

  for i := 3 to n do
    begin
      if (a[i] < inf) or (a[i] > sup) then exit(false);
      if a[i] < a[i - 1] then sup := a[i - 1] else inf := a[i -  1];
    end;

  check := true;
end;

begin
  init;
  if check then writeln('YES') else writeln('NO');
end.

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.