Curs 4

https://www.pbinfo.ro/probleme/705/2d

Putem sa rezolvam problema doar pentru axa x, axa y o vom neglija deoarece prob. este echivalenta daca toate punctele sunt doar pe axa X

Segmentele vor fi paralele cu axa X, deoarece daca sunt oblige acopera mai putin

Problema arata asa. Dandu-se un sir de numere reale, sa se determine lugimea minima a unui segement astfel, sa acoperim cu cel mult k segemente toate punctele

Cautare binara a unui element 
Cautare binara a raspunsului = cautam lungimea minima

Toate probleme de cautare binara a raspunsului au urmatoarea formulare: Sa se determine X minim/maxim astfel, o verificare sa aiba loc
5 3
-5.000 1.000
-2.000 3.000
3.000 2.000
3.000 -2.000
1.000 2.000
     ---    ---- 
    -5   -2      1  3,3
    -|----|-------|----|----
  p[1] p[2]        
  k = 3 
                           1
bool check(int lungmax) {
//TRUE/FALSE Pot acoperi toate punctele cu maxim k segemente de lungime lungmax
 -      -        -  ----- 
 -5   -2      1  3 , 3
start = Points[1];
int nrsegm = 1;
for(int i = 2; i <= n; ++i) {
  int end = Points[i];
  if(end-start > lungmax) {
    ++nrsegm;
    start = Points[i];
  }
}
if(nrsegm <= k)
  return true;
else
  return false;
}

int Points[NMAX];
int main() {
  cin >> n >>k;
  for(int i= 1; i <= n; ++i) {
   double x,y;
   cin >> x >> y;
   Points[i] = (int)(X *10000.0);
  }
  sort(Points+1, Points+n+1);

  int st=1 , dr =10^6;
  int sol = -1;
  while(st<=dr) {
    int lung_mij = (st+dr) / 2;
    if(check(lung_mij)) { 
      dr = mij-1;
      sol = mij;
    }
    else  st = mij+1;
  } 
cout << sol;
}

  CHECK(lung)     1 2 3  4...............100000000
                             0 1 1  1  1  1 1 1 1 1 1 1 1
                             
                             
    CHECK(lung)     1 2 3  4.....50..........100000000
                               1 1 1 1      0 0 0 0 0  00 0 0 0 0 

https://www.pbinfo.ro/probleme/680/ksplit
https://www.pbinfo.ro/probleme/1233/paint
https://www.pbinfo.ro/probleme/721/cd
https://www.pbinfo.ro/probleme/734/miere

La secția de împachetare a produselor dintr-o fabrică lucrează n muncitori. Fiecare muncitor împachetează același tip de produs, și pentru fiecare se cunoaște timpul necesar pentru împachetarea unui obiect. Să se determine durata minimă de timp astfel incat cei n muncitori vor impacheta cel puțin M obiecte.


bool check(int timpul) {
  for(int  i = 1; i <= n; ++i) {
    nrobiecte += timpul/a[i];
    
  }
  if(nrobiecte <= M)
    return true;
  else
    return false;
}

int st = 0, dr = 1e9;

while(st<=dr) {
  int mij = ( st+dr)/2;
  if(check(mij) {
    sol = mij;
    dr = mij-1;
  }
  else
    st = mij+1;
}

cout << sol;
3 12
1 : 3 2
2 : 2 3
3 : 1 1

c1 + c2 + c3 = 12
c1-3
c2+3
c2-2
c3+2
c3-1
c1+1

c1 : -3 + 1 = -2
c2 : 3 -2 = 1
c3: 2-1 = 1
c1-2 = c2 + 1 = c3 + 1 = S/3 = 4

=> c1 = 6 => socatem: 1,2,3..5 = 5 variante => 
   c2 = 3 => scoatem: 1,2 = 2 variante
   c3 = 3 => scoatem : 1,2 = 2 variante
------------------------------------------
(1,1,1); (1,1,2); (1,2,1); (1,2,2),(2,1,1)...
5*2*2 =20
 
  Fiind date n evenimente cu n[i] variante fiecare, numarul de posiblitati este egal cu
  a) Evenimentele sunt indepente: Daca scot din prima cutie 2 cd uri, nu ma afecteza cate scot din celelalte
   ci => ci-1
     Solutia = (n[1] * n[2] * ... n[n])% 9901
  b) Evenimentele sunt dependente:
     n[1] + n[2] + ... n[n];
 const int mod = 9901;
(a*b)%mod = a%mod * b%mod
  int prod = 1;
  for(int i = 1; i <= n;++i)
      prod = (prod*n[i])%mod;


========
const int mod = 9901, NMAX = 100005;
int c[NMAX],n,S, coef[NMAX];
int main() {

cin >> n >> S;
for(int i = 1; i <= n; ++i) {
  cin >> x >>y;
  //din cutia i se muta x cd uri in cutia y
  coef[i]-=x;
  coef[y]+=x;
}
for(int i = 1; i <= n; ++i)
  c[i]  = S/n - coef[i];
  long long prod = 1;
  for(int i = 1; i <= n;++i)
      prod = ( prod*(c[i]-1))%mod;
cout << prod;
}

https://www.pbinfo.ro/probleme/734/miere

int n;
long long stupi[NMAX] 
int m;
long long sp[NMAX];
bool check(int pozitie,int capacitate,int zi) {
  
  if(sp[pozitie] + pozitie*zi<= capcitate)
    return true;
  else
    return false;
}

for(int i = 1;i <= n; ++i) {
  cin >> stupi[i];
}
for(int i = 1; i <= n; ++i) {
  sp[i] = sp[i-1] + stupi[i];
}
cin >> m; 
for(int i = 1; i <= m ;++i) { O(m*n*log2N*)
 cin >> capacitate;
  int st = 1,dr=n;
  while(st<=dr) {
    int mij = (st+dr)/2;
    if(check(mij,capcitate,i-1)) {
      ans = mij;
      st = mij+1;
    }
    else
    dr=mij-1;
}
}
}

SIMULARE
Cap 1.

Sume partiale 1D, 2D
Mars 1D, 2D, fara memorie
Cautare binara a raspunsului
Combinatorica: Numar de solutii, indepdente , lucru cu modulo
3 probleme pe CODEFORCES: Accepted/Respins, dar calculam pana la ce test ajungi
TWO POINTTERS
ELMENT MAJORITAR
SSM