📄 Printabil A4

Cheat Sheet — Informatică BAC

Referință rapidă: tipuri de date, complexități, algoritmi standard, C++ esențial

← Înapoi la platformă
📊 Tipuri de date și limite
📋

Tipuri de date C++

TipDimensiuneInterval
int4 bytes−2.1×10⁹ … +2.1×10⁹
long long8 bytes−9.2×10¹⁸ … +9.2×10¹⁸
unsigned int4 bytes0 … 4.3×10⁹
float4 bytes~7 cifre semnificative
double8 bytes~15 cifre semnificative
char1 byte−128 … 127
bool1 bytetrue (1) / false (0)
char[]n bytesşir de caractere C (BAC)
🔤

Coduri ASCII frecvente

CaracterCod ASCIIRelație
'A'…'Z'65 … 90c - 'A' = 0..25
'a'…'z'97 … 122c - 'a' = 0..25
'0'…'9'48 … 57c - '0' = cifra
' '32spațiu
'\n'10newline
// Litere mici → mari:
c = c - 'a' + 'A';  // sau c -= 32
// Cifră → int:
int d = c - '0';
⚡ Complexități și reguli de performanță
📈

Clase de complexitate

NotațieExemplun=10⁶ ops
O(1)Acces vector v[i]instant
O(log n)Căutare binară~20
O(n)Parcurgere vector10⁶
O(n log n)sort() STL~2×10⁷
O(n²)Bubble Sort10¹²
O(n³)Matrice triplate10¹⁸
O(2ⁿ)Backtrackingenorm
🎯

Reguli practice — BAC

Limită nComplexitate maximă
n ≤ 20O(2ⁿ) — backtracking OK
n ≤ 100O(n³) — OK
n ≤ 5000O(n²) — OK
n ≤ 10⁵O(n log n) — preferabil
n ≤ 10⁶O(n) sau O(n log n)
n ≤ 10⁸O(n) strict necesar
⏱️ Un calculator execută ~10⁸–10⁹ operații simple pe secundă
🔧 Algoritmi esențiali C++
🔀

Sortare — Bubble Sort (BAC)

void bSort(int v[], int n) {
  for (int i=1; i<n; i++)
    for (int j=1; j<=n-i; j++)
      if(v[j]>v[j+1]) swap(v[j],v[j+1]);
}  // O(n²) — cel mai cerut la BAC

// STL: sort(v+1, v+n+1);  → O(n log n)
🔍

Căutare binară

int bSearch(int v[],int n,int x) {
  int st=1,dr=n;
  while(st<=dr) {
    int m=(st+dr)/2;
    if(v[m]==x) return m;
    else if(v[m]<x) st=m+1;
    else dr=m-1;
  }
  return -1;  // O(log n)
}
🌀

Recursivitate — template

int f(int n) {
  // 1. Caz de bază (stop)
  if (n == 0) return 1;
  // 2. Apel recursiv
  return n * f(n - 1);
}

// Fibonacci cu memo:
int memo[101] = {0};
int fib(int n) {
  if(n<=1) return n;
  if(memo[n]) return memo[n];
  return memo[n]=fib(n-1)+fib(n-2);
}
🌳

Backtracking — template

int sol[101];  // soluția curentă

void back(int k) {
  if(k > n) { afiseaza(); return; }
  for(int v=1; v<=n; v++) {
    sol[k] = v;
    if(valid(k))  // verificare constrângeri
      back(k+1);   // adâncime mai mare
  }
}
// Apel: back(1);
🔗

Interclasare doi vectori sortați

void merge(int a[],int m,int b[],int n,int c[]) {
  int i=1,j=1,k=0;
  while(i<=m&&j<=n)
    c[++k]= a[i]<=b[j] ? a[i++] : b[j++];
  while(i<=m) c[++k]=a[i++];
  while(j<=n) c[++k]=b[j++];
}  // O(m+n)
🔢

Ciurul lui Eratostene

bool ciur[1000001];  // global!
void sieve(int n) {
  ciur[0]=ciur[1]=true;
  for(int i=2;(long long)i*i<=n;i++)
    if(!ciur[i])
      for(int j=i*i;j<=n;j+=i)
        ciur[j]=true;
}
// estePrim(x) = !ciur[x]  (x>=2)
// O(N log log N)

CMMDC și CMMMC

// CMMDC — Algoritmul lui Euclid
int cmmdc(int a, int b) {
  while(b) { int r=a%b; a=b; b=r; }
  return a;
}  // O(log min(a,b))

// CMMMC
long long cmmmc(int a, int b) {
  return (long long)a / cmmdc(a,b) * b;
}  // împărțim înainte de înmulțire!
📁

Fișiere — I/O

#include <fstream>
ifstream fin("date.in");
ofstream fout("date.out");

// Citire:
fin >> n;
for(int i=1;i<=n;i++) fin >> v[i];

// Scriere:
fout << rez << endl;

fin.close(); fout.close();
📚 <algorithm> — funcții STL esențiale
🛠️

Funcții STL frecvente

FuncțieEfect
sort(v+1, v+n+1)Sortare crescătoare O(n log n)
reverse(v+1, v+n+1)Inversează vectorul
*max_element(v+1,v+n+1)Maximul din [1..n]
*min_element(v+1,v+n+1)Minimul din [1..n]
max(a, b)Maximul a doi scalari
min(a, b)Minimul a doi scalari
swap(a, b)Interschimbă a și b
abs(x)Valoarea absolută
sqrt(x)Rădăcina pătrată (double)
pow(b, e)b la puterea e (double)
📎

<cstring> — funcții pentru char[]

FuncțieEfect
strlen(s)Lungimea șirului (fără '\0')
strcpy(dest, src)Copiază src în dest
strcat(dest, src)Concatenează src la dest
strcmp(a, b)Compară: <0, 0, >0
strchr(s, c)Pointer la prima apariție a lui c
strstr(s, sub)Pointer la prima apariție a sub
strtok(s, delim)Tokenizare (spargere pe delimitatori)
atoi(s)char[] → int
atof(s)char[] → double
itoa(n, s, base)int → char[] (non-standard, dar cerut)
🔡

<cctype> — funcții pe caractere

FuncțieEfect
isalpha(c)Literă? (A-Z, a-z)
isdigit(c)Cifră? (0-9)
isalnum(c)Literă sau cifră?
isupper(c)Literă mare?
islower(c)Literă mică?
isspace(c)Spațiu/tab/newline?
toupper(c)Convertește la literă mare
tolower(c)Convertește la literă mică
🕸️ Teoria Grafurilor — Formule
📐

Formule grafuri neorientate

FormulaDescriere
∑d(v) = 2mSuma gradelor = 2×muchii
m ≤ n(n−1)/2Maxim muchii (graf simplu)
Kn: m = n(n−1)/2Muchii graf complet
Arbore: m = n−1Graf conex aciclic
Componente: n−mNr. componente (pădure)
Eulerian: grad par∀vCiclu prin toate muchiile
🔀

Formule grafuri orientate

FormulaDescriere
∑d⁺(v) = ∑d⁻(v) = mSuma gradelor = nr. arce
m ≤ n(n−1)Maxim arce (orientat)
d⁺(v) + d⁻(v) = d(v)Grad total nod
Tare conex: ∀u,v drumDrum u→v ȘI v→u
// BFS — distanță minimă:
queue<int> Q;
Q.push(start);
viz[start]=1;
while(!Q.empty()) {
  int x=Q.front(); Q.pop();
  for(int v:adj[x])
    if(!viz[v]) {
      viz[v]=1; d[v]=d[x]+1;
      Q.push(v); }
}
🌳

Grafuri speciale

TipProprietate cheie
Kn (complet)m=n(n−1)/2, grad n−1
ArboreConex + m=n−1
BipartitFără cicluri impare
EulerianConex + grade pare
HamiltonianDirac: d(v)≥n/2
SubgrafElimini noduri (+muchii)
Graf parțialElimini doar muchii