Un gard este format din mai multe plăci dreptunghiulare. Fiecare placă este, la rândul ei, construită din NxM
cărămizi. Una dintre plăci ridică o problemă, deoarece este deteriorată. Placa este reprezentată pe hârtie cu ajutorul unei matrice cu N
linii și M
coloane, numerotate de la 1
la N
, respectiv de la 1
la M
. Matricea conține doar valori 0
și 1
, și respectă următoarele reguli:
- un element egal cu
1
indică prezența în aceea poziție a unei cărămizi, iar un element egal cu0
indică absența ei; - linia
1
și liniaN
conțin numai valori egale cu1
, pentru că marginea de sus și cea de jos a plăcii este intactă; - din orice element egal cu
1
, situat în interiorul matricei, se poate ajunge pe linia1
sau pe liniaN
sau pe amândouă, mergând doar în sus sau doar în jos, parcurgând numai valorile egale cu1
; - există cel puțin o coloană stabilă (formată numai din elemente egale cu
1
).
Se dorește modificarea plăcii și pentru aceasta se pot șterge din matrice maximum K
coloane alăturate. După ștergere se alipesc coloanele rămase și se deplasează pe verticală partea de sus a plăcii spre cea de jos, până când se va forma o coloană stabilă.
Cerința
Să se determine înălțimea minimă Hmin
pe care o poate avea placa ștergând cel mult K
coloane alăturate. Identificați numărul minim de coloane alăturate care trebuie șterse pentru a obține înălțimea Hmin
.
Date de intrare
Din fișierul placa.in
se citesc de pe prima linie 3
numere naturale N
, M
, K
separate prin câte un spațiu, având semnificația din enunț. Pe fiecare dintre următoarele M
linii ale fișierului se găsesc perechi de numere naturale N1
, N2
, separate printr-un spațiu. Astfel pe linia i+1
a fișierului de intrare numărul N1
reprezintă numărul de elemente de 1
situate pe coloana i
, începând cu linia 1, deplasându-ne în „jos” până la întâlnirea unei valori egale cu 0
, sau până se ajunge pe linia N
; numărul N2
reprezintă numărul de elemente de 1
situate pe coloana i
, începând cu linia N, deplasându-ne în „sus” până la întâlnirea unei valori egale cu 0
, sau până se ajunge pe linia 1
.
Date de ieșire
În fișierul placa.out
se va scrie pe prima linie înălțimea minimă cerută Hmin
, iar pe a doua linie numărul minim de coloane ce trebuie eliminate pentru a obține înălțimea Hmin
.
Restricții și precizări
1 ≤ N ≤ 100.000
;1 ≤ M ≤ 100.000
;1 ≤ K < M
;- se garantează că pe liniile ce conțin informații referitoare la cele
M
coloane ale matricei există cel puțin o linie pe care se află valoareaN
de2
ori, în rest suma celor două valori este strict mai mică decâtN
; - toate valorile din fișier sunt strict pozitive;
Exemplu
placa.in
5 6 3 1 1 2 1 1 2 5 5 1 3 1 1
placa.out
3 2
Explicație
Matricea inițială:
1 1 1 1 1 1 0 1 0 1 0 0 0 0 0 1 1 0 0 0 1 1 1 0 1 1 1 1 1 1
Înălțimea minimă este 3
și se poate obține eliminând, de exemplu, coloanele 3
, 4
, 5
rezultând matricea:
1 1 1 0 1 0 1 1 1
O altă modalitate de a obține aceeași înălțime dar prin ștergerea unui număr minim de coloane (4
și 5
) conduce la:
1 1 1 1 0 1 1 0 1 1 1 1
#include <bits/stdc++.h> #define DIM 1000002 using namespace std; ifstream fin("placa.in"); ofstream fout("placa.out"); int v[DIM], a[DIM], b[DIM]; int n, m, k, x, y, i, j, sol, solc, p, u, mid; int main() { fin>>n>>m>>k; for (i=1;i<=m;i++) { fin>>x>>y; if (x!=n) v[i] = x+y; else v[i] = n; } a[1] = v[1]; for (i=2;i<=m;i++) if (a[i-1] > v[i]) a[i] = a[i-1]; else a[i] = v[i]; b[m] = v[m]; for (i=m-1;i>=1;i--) if (v[i] > b[i+1]) b[i] = v[i]; else b[i] = b[i+1]; sol = m+2; for (i=1,j=k;j<=m;i++,j++) { if (a[i-1] > b[j+1]) x = a[i-1]; else x = b[j+1]; if (x < sol) sol = x; } fout<<sol<<"\n"; if (sol == n) { fout<<"0\n"; return 0; } p = 1; u = k; while (p<=u) { mid = (p+u)/2; solc = m+2; for (i=1,j=mid;j<=m;i++,j++) { if (a[i-1] > b[j+1]) x = a[i-1]; else x = b[j+1]; if (x < solc) solc = x; } if (solc == sol) u = mid-1; else p = mid+1; } fout<<p<<"\n"; return 0; }