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.
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