Editorial for Hang động
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
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
#include <iostream> #include <cstdio> using namespace std; int n,h,a[500500]; int main() { int x; cin >> n >> h; for (int i=1;i<=n;i++) { scanf("%d",&x); if (i%2) a[1]++, a[x+1]--; else a[h-x+1]++; } int ans=n+1,cnt; for (int i=1;i<=h;i++) { a[i]+=a[i-1]; if (a[i]<ans) ans=a[i], cnt=1; else cnt+=(a[i]==ans); } cout << ans << ' ' << cnt << endl; }
Code mẫu của happyboy99x
#include<cstdio> #include<algorithm> using namespace std; int c[2][100000], cnt[100001], n, h; int main() { scanf("%d%d",&n,&h); for(int i = 0; i < n; ++i) scanf("%d", &c[i%2][i/2]); n /= 2; sort(c[0], c[0]+n); sort(c[1], c[1]+n); int mn = (int) 1e9; for(int i = 1; i <= h; ++i) { int t = n - (upper_bound(c[0], c[0]+n, i-1) - c[0]); t += n - (upper_bound(c[1], c[1]+n, h-i) - c[1]); ++cnt[t]; mn = min(mn, t); } printf("%d %d\n", mn, cnt[mn]); return 0; }
Code mẫu của ladpro98
program c11cave; uses math; const fi=''; up=0;down=1; maxN=500005; var a:array[up..down,0..maxN] of longint; f1,f2:array[1..maxN] of longint; n,h,res,c:longint; procedure input; var f:text; i:longint; begin assign(f,fi); reset(f); readln(f,n,h); for i:=1 to n do begin if odd(i) then readln(f,a[down,i div 2 +1]) else readln(f,a[up,i div 2]); end; close(f); end; procedure swap(k,i,j:longint); var t:longint; begin t:=a[k,i]; a[k,i]:=a[k,j]; a[k,j]:=t; end; procedure sort(k,l,r:longint); var p,i,j:longint; begin if l>=r then exit; p:=a[k,random(r-l+1)+l]; i:=l;j:=r; repeat while a[k,i]<p do inc(i); while a[k,j]>p do dec(j); if i<=j then begin if i<j then swap(k,i,j); inc(i);dec(j); end; until i>j; sort(k,l,j);sort(k,i,r); end; procedure process; var i,j:longint; begin j:=1; for i:=1 to H do begin while (j<=N div 2) and (a[down,j]<i) do inc(j); f1[i]:=n div 2-j+1; end; j:=1; for i:=H downto 1 do begin while (j<=N div 2) and (a[up,j]<(H-i+1)) do inc(j); f2[i]:=n div 2-j+1; end; res:=maxN; for i:=1 to H do res:=min(res,f1[i]+f2[i]); for i:=1 to H do if (f1[i]+f2[i]=res) then inc(c); end; begin input; sort(up,1,n div 2); sort(down,1,n div 2); process; write(res,' ',c); end.
Code mẫu của RR
#include <sstream> #include <iomanip> #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <vector> #include <set> #include <map> #include <stack> #include <queue> #include <string> #include <deque> #include <complex> #define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; i++) #define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; i--) #define REP(i,a) for(int i=0,_a=(a); i<_a; i++) #define FORN(i,a,b) for(int i=(a),_b=(b);i<_b;i++) #define DOWN(i,a,b) for(int i=a,_b=(b);i>=_b;i--) #define SET(a,v) memset(a,v,sizeof(a)) #define sqr(x) ((x)*(x)) #define ll long long #define F first #define S second #define PB push_back #define MP make_pair #define DEBUG(x) cout << #x << " = "; cout << x << endl; #define PR(a,n) cout << #a << " = "; FOR(_,1,n) cout << a[_] << ' '; cout << endl; #define PR0(a,n) cout << #a << " = "; REP(_,n) cout << a[_] << ' '; cout << endl; using namespace std; //Buffer reading int INP,AM,REACHEOF; #define BUFSIZE (1<<12) char BUF[BUFSIZE+1], *inp=BUF; #define GETCHAR(INP) { \ if(!*inp) { \ if (REACHEOF) return 0;\ memset(BUF,0,sizeof BUF);\ int inpzzz = fread(BUF,1,BUFSIZE,stdin);\ if (inpzzz != BUFSIZE) REACHEOF = true;\ inp=BUF; \ } \ INP=*inp++; \ } #define DIG(a) (((a)>='0')&&((a)<='9')) #define GN(j) { \ AM=0;\ GETCHAR(INP); while(!DIG(INP) && INP!='-') GETCHAR(INP);\ if (INP=='-') {AM=1;GETCHAR(INP);} \ j=INP-'0'; GETCHAR(INP); \ while(DIG(INP)){j=10*j+(INP-'0');GETCHAR(INP);} \ if (AM) j=-j;\ } //End of buffer reading const long double PI = acos((long double) -1.0); const int MN = 200111; int na, nb, a[MN], b[MN]; int main() { int n, h; while (scanf("%d%d", & n, &h) == 2) { int x; na = nb = 0; FOR(i,1,n) { scanf("%d", &x); if (i % 2 == 1) a[++na] = x; else b[++nb] = h+1 - x; } sort(a+1, a+na+1); sort(b+1, b+nb+1); a[na+1] = b[nb+1] = 1000111000; int res = n+1, cnt = 0; FOR(i,1,h) { int cur = na - (lower_bound(a+1, a+na+2, i) - a) + 1; cur += lower_bound(b+1, b+nb+2, i+1) - b - 1; if (cur < res) { res = cur; cnt = 1; } else if (cur == res) ++cnt; } printf("%d %d\n", res, cnt); } return 0; }
Code mẫu của hieult
#include <set> #include <map> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <string> #include <vector> #include <cstdlib> #include <cstring> #include <sstream> #include <iomanip> #include <iostream> #include <algorithm> #include <ctime> #include <deque> #include <bitset> #include <cctype> #include <utility> using namespace std; typedef long long ll; typedef long double ld; typedef unsigned int ui; typedef unsigned long long ull; #define Rep(i,n) for(int i = 0; i < (n); ++i) #define Repd(i,n) for(int i = (n)-1; i >= 0; --i) #define For(i,a,b) for(int i = (a); i <= (b); ++i) #define Ford(i,a,b) for(int i = (a); i >= (b); --i) #define Fit(i,v) for(__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++i) #define Fitd(i,v) for(__typeof((v).rbegin()) i = (v).rbegin(); i != (v).rend(); ++i) #define mp make_pair #define pb push_back #define fi first #define se second #define sz(a) ((int)(a).size()) #define all(a) (a).begin(), (a).end() #define ms(a,x) memset(a, x, sizeof(a)) template<class F, class T> T convert(F a, int p = -1) { stringstream ss; if (p >= 0) ss << fixed << setprecision(p); ss << a; T r; ss >> r; return r; } template<class T> T gcd(T a, T b) { T r; while (b != 0) { r = a % b; a = b; b = r; } return a; } template<class T> T lcm(T a, T b) { return a / gcd(a, b) * b; } template<class T> T sqr(T x) { return x * x; } template<class T> T cube(T x) { return x * x * x; } template<class T> int getbit(T s, int i) { return (s >> i) & 1; } template<class T> T onbit(T s, int i) { return s | (T(1) << i); } template<class T> T offbit(T s, int i) { return s & (~(T(1) << i)); } template<class T> int cntbit(T s) { return s == 0 ? 0 : cntbit(s >> 1) + (s & 1); } const int bfsz = 1 << 16; char bf[bfsz + 5]; int rsz = 0; int ptr = 0; char gc() { if (rsz <= 0) { ptr = 0; rsz = (int) fread(bf, 1, bfsz, stdin); if (rsz <= 0) return EOF; } --rsz; return bf[ptr++]; } void ga(char &c) { c = EOF; while (!isalpha(c)) c = gc(); } int gs(char s[]) { int l = 0; char c = gc(); while (isspace(c)) c = gc(); while (c != EOF && !isspace(c)) { s[l++] = c; c = gc(); } s[l] = '\0'; return l; } template<class T> bool gi(T &v) { v = 0; char c = gc(); while (c != EOF && c != '-' && !isdigit(c)) c = gc(); if (c == EOF) return false; bool neg = c == '-'; if (neg) c = gc(); while (isdigit(c)) { v = v * 10 + c - '0'; c = gc(); } if (neg) v = -v; return true; } typedef pair<int, int> II; const ld PI = acos(-1.0); const ld eps = 1e-9; const int dr[] = { 0, -1, -1, -1 }; const int dc[] = { -1, -1, 0, +1 }; const int inf = (int) 1e9 + 5; const ll linf = (ll) 1e16 + 5; const ll mod = (ll) 1e9 + 7; const int maxn = 100 + 5; #define ok puts("ok") #define maxn 1000005 int n, h, x; int ra[maxn], vao[maxn]; int main() { // freopen("in.txt", "r", stdin); cin >> n >> h; ms(ra, 0); ms(vao, 0); For(i, 1, n){ scanf("%d", &x); if(i & 1){ ra[x + 1]++; } else { vao[h - x + 1]++; } } int num = (n + 1) >> 1, so = 1; int MIN = num; For(i, 2, h){ num -= ra[i]; num += vao[i]; if(MIN > num){ MIN = num; so = 1; } else if(MIN == num){ so++; } } cout << MIN << " " << so; return 0; }
Code mẫu của skyvn97
#include<stdio.h> #include<algorithm> #define MAX 500500 using namespace std; int u[MAX]; int d[MAX]; int hu[MAX]; int hd[MAX]; int mu,md; int n,h,ru,rd; int i; int b,c; int main(void) { scanf("%d",&n); scanf("%d",&h); md=-1; mu=-1; for (i=1;i<=n/2;i=i+1) { scanf("%d",&d[i]); scanf("%d",&u[i]); if (d[i]>md) md=d[i]; if (u[i]>mu) mu=u[i]; } sort(&d[1],&d[n/2+1]); sort(&u[1],&u[n/2+1]); for (i=n/2;i>=1;i=i-1) { hu[u[i]]=i; hd[d[i]]=i; } for (i=mu;i>=1;i=i-1) if (hu[i]==0) hu[i]=hu[i+1]; for (i=md;i>=1;i=i-1) if (hd[i]==0) hd[i]=hd[i+1]; b=n+1;c=0; for (i=1;i<=h;i=i+1) { if (i>md) rd=0; else rd=n/2-hd[i]+1; if (h-i+1>mu) ru=0; else ru=n/2-hu[h-i+1]+1; if (ru+rd==b) { c++; continue; } if (ru+rd<b) { b=ru+rd; c=1; continue; } } printf("%d %d",b,c); }
Comments