Editorial for VM 08 Bài 16 - Xếp hình
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 ladpro98
program VBLOCKS; uses math; const maxn=100005; fi=''; var a,f,s1,s2:array[-2*maxn..maxn] of longint; x,y,n,l,d,i,k,p,q:longint; inp:text; begin assign(inp,fi);reset(inp); readln(inp,n,l,d);readln(inp,k); for i:=1 to k do begin readln(inp,x,y);a[x]:=y; end; for i:=-2*n to 0 do a[i]:=2; for i:=1 to n do if a[i]=1 then s1[i]:=s1[i-1]+1 else s1[i]:=s1[i-1]; for i:=-2*n to n do if a[i]=2 then s2[i]:=s2[i-1]+1 else s2[i]:=s2[i-1]; for i:=1 to n do begin f[i]:=low(longint); if a[i]<>1 then f[i]:=max(f[i],f[i-1]); p:=s2[i]-s2[i-l];q:=s1[i-l]-s1[i-l-d]; if (p=0) and (q=0) then f[i]:=max(f[i],f[i-l-d]+1); end; if f[n]>0 then write(f[n]) else write(-1); end.
Code mẫu của RR
{$R+,Q+} PROGRAM VBLOCKS; CONST FINP=''; FOUT=''; maxn=100001; VAR n,s,d:longint; max,f:array[0..maxn] of longint; sl:array[1..2,0..maxn] of longint; c:array[1..maxn] of longint; a:array[1..maxn] of byte; procedure readInput; var f:text; i,m,u:longint; begin assign(f,FINP); reset(f); readln(f,n,s,d); readln(f,m); for i:=1 to m do begin readln(f,u,a[u]); end; close(f); end; procedure prepare; var i:longint; begin for i:=1 to n do if a[i]=1 then begin sl[1,i]:=sl[1,i-1]+1; sl[2,i]:=sl[2,i-1]; end else if a[i]=2 then begin sl[1,i]:=sl[1,i-1]; sl[2,i]:=sl[2,i-1]+1; end else begin sl[1,i]:=sl[1,i-1]; sl[2,i]:=sl[2,i-1]; end; for i:=1 to n do begin f[i]:=-1; max[i]:=-1; end; end; function get(u,k:longint):longint; begin if u<=0 then get:=0 else get:=sl[k,u]; end; procedure updateBIT(u:longint); var v:longint; begin inc(c[u]); v:=u+u and (u xor (u-1)); if v<=n then updateBIT(v); end; function getBIT(u:longint):longint; var v,kq:longint; begin if u<=0 then kq:=0 else kq:=c[u]; v:=u-u and (u xor (u-1)); if (v>0) and (u>0) then kq:=kq+getBIT(v); getBIT:=kq; end; procedure solve; var i:longint; begin max[0]:=-1; f[0]:=-1; for i:=1 to n do begin if (get(i-1,1)-get(i-d-1,1)>0) or (get(i+s-1,2)-get(i-1,2)>0) or (get(i+s+d-1,1)-get(i+s-1,1)>0) or (i+s-1>n) then f[i]:=-1 else if i-d-s>0 then begin if max[i-d-s]>=0 then f[i]:=max[i-d-s]+1 else f[i]:=1; end else if sl[1,i-1]>0 then f[i]:=-1 else f[i]:=1; if f[i]>max[i-1] then max[i]:=f[i] else max[i]:=max[i-1]; if f[i]>0 then updateBIT(i); end; end; procedure writeOutput; var f:text; begin assign(f,FOUT); rewrite(f); writeln(f,max[n]); close(f); end; procedure refine; var i,u,count:longint; begin for i:=1 to n do if (a[i]=1) and (getBIT(i)-getBIT(i-s)=0) then begin max[n]:=-1; exit; end; count:=0; for i:=1 to n do if a[i]=1 then inc(count); for i:=1 to n do if a[i]=1 then begin u:=i; break; end; i:=u; while i<n do begin inc(i); if a[i]=1 then begin if i-u+1<=s then dec(count); u:=i; end; end; if count>max[n] then max[n]:=-1; end; BEGIN readInput; prepare; solve; refine; writeOutput; END.
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> #include <cassert> using namespace std; typedef long long ll; typedef 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, 0, -1}; const int dc[] = {+1, 0, -1, 0}; const int inf = (int)1e9 + 5; const ll linf = (ll)1e16 + 5; const ll mod = (ll)1e9 + 7; #define maxn 100005 int n, s, t; int a[maxn], d[maxn], e[maxn], f[maxn]; int main() { // freopen("in.txt", "r", stdin); cin >> n >> s >> t; int k; cin >> k; int x, id; ms(a, 0); ms(d, 0); ms(e, 0); Rep(run, k){ scanf("%d %d", &x, &id); a[x] = id; } For(i, 1, n) { d[i] = d[i - 1]; e[i] = e[i - 1]; if(a[i] == 2) d[i]++; if(a[i] == 1) e[i]++; } ms(f, -0x3f); f[0] = 0; For(i, 1, n){ if(a[i] != 1) f[i] = f[i - 1]; if(i >= s && d[i] == d[i - s] && e[i - s] == e[max(0, i - s - t)]){ f[i] = max(f[i], f[max(0, i - s - t)] + 1); } } cout << max(-1, f[n]) << endl; return 0; }
Code mẫu của ll931110
{$MODE DELPHI} Program VBLOCKS2; Const input = ''; output = ''; maxn = 100000; Var F: array[-maxn..maxn] of integer; a: array[-maxn..maxn,1..2] of integer; l,s,d,k: integer; Procedure init; Var fi: text; i,u,v: integer; Begin Assign(fi, input); Reset(fi); Read(fi, l, s, d, k); Fillchar(a, sizeof(a), 0); For i:= 1 to k do Begin Readln(fi, u, v); inc(a[u,v]); End; For u:= 1 to l do Begin a[u,1]:= a[u,1] + a[u - 1,1]; a[u,2]:= a[u,2] + a[u - 1,2]; End; Close(fi); Fillchar(F, sizeof(F), 0); End; Procedure solve; Var i,x,y: integer; Begin For i:= s to l do Begin F[i]:= 0; If a[i,1] - a[i - 1,1] = 0 then F[i]:= F[i - 1]; x:= i - s - d; y:= i - s; If (a[i,2] - a[y,2] = 0) and (a[y,1] - a[x,1] = 0) and (F[i] < F[x] + 1) then F[i]:= F[x] + 1; End; End; Procedure printresult; Var fo: text; Begin Assign(fo, output); Rewrite(fo); If F[l] = 0 then writeln(fo, -1) else writeln(fo, F[l]); Close(fo); End; Begin init; solve; printresult; End.
Code mẫu của khuc_tuan
#include <iostream> using namespace std; int L, S, D; int K; int q[100010]; int prev[100010][2]; int F[100010], G[100010]; int main() { scanf("%d%d%d", &L, &S, &D); scanf("%d", &K); for(int i=0;i<K;++i) { int u, v; scanf("%d%d", &u, &v); if(q[u]>0 && q[u]!=v) { cout << -1 << endl; return 0; } else q[u] = v; } for(int i=1;i<=L;++i) { prev[i][0] = prev[i-1][0]; prev[i][1] = prev[i-1][1]; if(q[i]>0) prev[i][q[i]-1] = i; } memset( F, -1, sizeof(F)); memset( G, -1, sizeof(G)); for(int i=1;i<=L;++i) { if(i>=S) { int st = i - S + 1; int tr = st - D; if(prev[i][1]<st && (prev[st-1][0]<tr || prev[st-1][0]==0)) { if(tr<=1) F[i] = 1; else { if(prev[tr-1][0]==0) F[i] = 1; if(G[tr-1]!=-1) F[i] = 1 + G[tr-1]; } } } if(q[i]==1) G[i] = F[i]; else G[i] = max( F[i], G[i-1]); } cout << G[L] << endl; //system("pause"); return 0; }
Comments