Referință rapidă: tipuri de date, complexități, algoritmi standard, C++ esențial
| Tip | Dimensiune | Interval |
|---|---|---|
| int | 4 bytes | −2.1×10⁹ … +2.1×10⁹ |
| long long | 8 bytes | −9.2×10¹⁸ … +9.2×10¹⁸ |
| unsigned int | 4 bytes | 0 … 4.3×10⁹ |
| float | 4 bytes | ~7 cifre semnificative |
| double | 8 bytes | ~15 cifre semnificative |
| char | 1 byte | −128 … 127 |
| bool | 1 byte | true (1) / false (0) |
| char[] | n bytes | şir de caractere C (BAC) |
| Caracter | Cod ASCII | Relație |
|---|---|---|
| 'A'…'Z' | 65 … 90 | c - 'A' = 0..25 |
| 'a'…'z' | 97 … 122 | c - 'a' = 0..25 |
| '0'…'9' | 48 … 57 | c - '0' = cifra |
| ' ' | 32 | spațiu |
| '\n' | 10 | newline |
// Litere mici → mari: c = c - 'a' + 'A'; // sau c -= 32 // Cifră → int: int d = c - '0';
| Notație | Exemplu | n=10⁶ ops |
|---|---|---|
| O(1) | Acces vector v[i] | instant |
| O(log n) | Căutare binară | ~20 |
| O(n) | Parcurgere vector | 10⁶ |
| O(n log n) | sort() STL | ~2×10⁷ |
| O(n²) | Bubble Sort | 10¹² |
| O(n³) | Matrice triplate | 10¹⁸ |
| O(2ⁿ) | Backtracking | enorm |
| Limită n | Complexitate maximă |
|---|---|
| n ≤ 20 | O(2ⁿ) — backtracking OK |
| n ≤ 100 | O(n³) — OK |
| n ≤ 5000 | O(n²) — OK |
| n ≤ 10⁵ | O(n log n) — preferabil |
| n ≤ 10⁶ | O(n) sau O(n log n) |
| n ≤ 10⁸ | O(n) strict necesar |
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)
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) }
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); }
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);
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)
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 — 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!
#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();
| Funcție | Efect |
|---|---|
| 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) |
| Funcție | Efect |
|---|---|
| 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) |
| Funcție | Efect |
|---|---|
| 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ă |
| Formula | Descriere |
|---|---|
| ∑d(v) = 2m | Suma gradelor = 2×muchii |
| m ≤ n(n−1)/2 | Maxim muchii (graf simplu) |
| Kn: m = n(n−1)/2 | Muchii graf complet |
| Arbore: m = n−1 | Graf conex aciclic |
| Componente: n−m | Nr. componente (pădure) |
| Eulerian: grad par∀v | Ciclu prin toate muchiile |
| Formula | Descriere |
|---|---|
| ∑d⁺(v) = ∑d⁻(v) = m | Suma gradelor = nr. arce |
| m ≤ n(n−1) | Maxim arce (orientat) |
| d⁺(v) + d⁻(v) = d(v) | Grad total nod |
| Tare conex: ∀u,v drum | Drum 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); } }
| Tip | Proprietate cheie |
|---|---|
| Kn (complet) | m=n(n−1)/2, grad n−1 |
| Arbore | Conex + m=n−1 |
| Bipartit | Fără cicluri impare |
| Eulerian | Conex + grade pare |
| Hamiltonian | Dirac: d(v)≥n/2 |
| Subgraf | Elimini noduri (+muchii) |
| Graf parțial | Elimini doar muchii |
Explorează mai mult