# Разбор задач 2011 года Если Вы не знали как решать какую-то задачу и вам было лень разбираться в коде на Pascal, то это пост специально для Вас. :::warning Убедительная просьба не копировать коды и не пересылать их. Помните -- Вы решаете задачи для себя! ::: ## [1. Пересечения](https://codeforces.com/group/skz9fIV5Hq/contest/261187/problem/2011_1) :::spoiler Разбор :::info Для того, чтобы получить 10 баллов, достаточно было заифать претесты. __Основная идея__: Давайте хранить количество линий, которые проходят над $x$-й координатой. На $30$ баллов можно было обновлять количество линий за $N * (R_i - L_i - 1)$ На $100$ баллов я написал дерево отрезков (асимптотика: $O(N*log(N))$), в авторском решении используется Sqrt-декомпозиция (асимптотика: $O(N * \sqrt{N})$). *P.S*: Не забудьте, что _пересечения нескольких фигур в одной точке считается как одно пересечение_. ::: :::spoiler Авторское решение (Pascal) ```pascal var N, L,R,i,x,sum:longint; A:array[1..100000] of longint; B:array[0..1000] of longint; fo,fi:text; begin readln(N); sum:=0; for i:=1 to N do begin readln(L,R); sum:=sum+A[L]+B[L div 256]+A[R]+B[R div 256]; A[L]:=-B[L div 256]; A[R]:=-B[R div 256]; x:=L+1; while (x < R) and (x mod 256 <> 0) do begin A[x]:=A[x]+1; x:=x+1; end; while x+256 <= R do begin B[x div 256]:=B[x div 256]+1; x:=x+256; end; while (x < R) do begin A[x]:=A[x]+1; x:=x+1; end; end; writeln(sum); end. ``` ::: :::spoiler Код (C++, автор: [Adamenko](https://codeforces.com/profile/Adamenko)) ```cpp #include <bits/stdc++.h> using namespace std; vector<int> t; vector<int> lazy; int md(int l, int r) { return l + (r - l) / 2; } void push(int v, int vl, int vr) { if (lazy[v] != 0) { int mid = md(vl, vr); t[2 * v + 1] += lazy[v] * (mid - vl + 1); t[2 * v + 2] += lazy[v] * (vr - mid); lazy[2 * v + 1] += lazy[v]; lazy[2 * v + 2] += lazy[v]; lazy[v] = 0; } } void upd(int v, int vl, int vr, int l, int r, int val) { if (vl > r || vr < l) return; if (vl >= l && vr <= r){ t[v] += (vr - vl + 1) * val; lazy[v] += val; return; } push(v, vl, vr); int mid = md(vl, vr); upd(2 * v + 1, vl, mid, l, r, val); upd(2 * v + 2, mid + 1, vr, l, r, val); t[v] = t[2 * v + 1] + t[2 * v + 2]; } int get_(int v, int vl, int vr, int l, int r) { if (vl > r || vr < l) return 0; if (vl >= l && vr <= r) return t[v]; push(v, vl, vr); int mid = md(vl, vr); int q1 = get_(2 * v + 1, vl, mid, l, r); int q2 = get_(2 * v + 2, mid + 1, vr, l, r); return q1 + q2; } int main() { int n; cin >> n; t.resize(4 * N); lazy.resize(4 * N); ll ans = 0; for (int i = 0; i < n; ++i) { int l, r; cin >> l >> r; ans += get_(0, 1, N, l, l); ans += get_(0, 1, N, r, r); upd(0, 1, N, l, l, -get_(0, 1, N, l, l)); upd(0, 1, N, r, r, -get_(0, 1, N, r, r)); upd(0, 1, N, l + 1, r - 1, 1); } cout << ans << endl; return 0; } ``` ::: ## [2. Опять Коля и история](https://codeforces.com/group/skz9fIV5Hq/contest/261187/problem/2011_2) :::spoiler Разбор :::info В этой задаче от Вас требовалось чуть-чуть порисовать и вывести 2 формулы: 1. Случай, когда $N > M$ 2. Случай, когда $N <= M$ Асимптотика: $O(1)$. ::: :::spoiler Авторское решение (Pascal) ```pascal var m, n, r : longint; begin readln(m, n); if m<=n then r:=(m-1)*2 else r:=1+(n-1)*2; writeln(r); end. ``` ::: :::spoiler Код (C++, автор: [Adamenko](https://codeforces.com/profile/Adamenko)) ```cpp #include <bits/stdc++.h> using namespace std; int main() { long long n, m; cin >> n >> m; ll ans = 0; if (n == 1 || m == 1) { cout << 0 << endl; return 0; } if (n == 2) { cout << 2 << endl; return 0; } if (m == 2) { cout << 3 << endl; return 0; } if (n - 1 == m && n % 2 == 0) { cout << 2 * m << endl; return 0; } if (n + 1 == m && n % 2) { cout << n * 2 + 1 << endl; return 0; } if (n > m) { ans = 3 + (m - 2) * 2; cout << ans << endl; } else cout << (n - 1) * 2 << endl; } ``` ::: ## [3. Подборка передач](https://codeforces.com/group/skz9fIV5Hq/contest/261187/problem/2011_3) :::spoiler Разбор :::info *Скоро здесь появится разбор задачи* :::