├── README.md
├── sem-1
├── README.md
├── problems.pdf
└── solutions
│ ├── 1A.java
│ ├── 1B.java
│ ├── 1C.java
│ ├── 1D.java
│ ├── 1E.java
│ ├── 1F.java
│ ├── 1G.java
│ ├── 1H.java
│ ├── 2A.java
│ ├── 2B.java
│ ├── 3A.java
│ ├── 3B.java
│ ├── 3C.java
│ ├── 3D.java
│ ├── 3F.java
│ ├── 3G.java
│ ├── 3H.java
│ ├── 4A.java
│ ├── 4B.java
│ ├── 4C.py
│ ├── 4D.java
│ ├── 4E.java
│ ├── 4G.java
│ ├── 4H.cpp
│ ├── 4I.cpp
│ ├── 5A.java
│ ├── 5B.java
│ ├── 5C.java
│ ├── 5D.java
│ ├── 5E.java
│ ├── 5F.java
│ ├── 5G.java
│ ├── 5H.java
│ ├── 7A.java
│ ├── 7B.java
│ ├── 7C.java
│ ├── 8A.java
│ ├── 8B.java
│ ├── 8C.java
│ ├── 8D.java
│ └── 8E.java
├── sem-2
├── README.md
├── problems.pdf
└── solutions
│ ├── 1A.java
│ ├── 1B.java
│ ├── 1C.java
│ ├── 1D.java
│ ├── 1E.java
│ ├── 1F.java
│ ├── 1G.java
│ ├── 1H.cpp
│ ├── 1I.java
│ ├── 2A.java
│ ├── 2B.java
│ ├── 2C.cpp
│ ├── 2D.cpp
│ ├── 2E.java
│ ├── 2F.java
│ ├── 2G.java
│ ├── 2H.java
│ ├── 2I.cpp
│ ├── 3A.cpp
│ ├── 3B.cpp
│ ├── 3C.cpp
│ ├── 3D.cpp
│ ├── 4A.cpp
│ ├── 4B.cpp
│ ├── 4D.java
│ ├── 4E.cpp
│ ├── 5A.cpp
│ ├── 5B.cpp
│ ├── 5C.cpp
│ ├── 5D.cpp
│ ├── 6A.java
│ ├── 6B.cpp
│ ├── 6C.java
│ ├── 6D.cpp
│ ├── 6E.java
│ ├── 6F.java
│ ├── 7A.java
│ └── 7B.java
├── sem-3
├── README.md
├── problems.pdf
└── solutions
│ ├── 1A.cpp
│ ├── 1B.cpp
│ ├── 1C.cpp
│ ├── 1D.cpp
│ ├── 1E.cpp
│ ├── 1F.cpp
│ ├── 1G.cpp
│ ├── 1I.cpp
│ ├── 1J.cpp
│ ├── 1K.cpp
│ ├── 1L.cpp
│ ├── 2A.cpp
│ ├── 2B.cpp
│ ├── 2C.cpp
│ ├── 2D.cpp
│ ├── 2E.cpp
│ ├── 2F.cpp
│ ├── 2G.cpp
│ ├── 2H.cpp
│ ├── 3A.cpp
│ ├── 3B.cpp
│ ├── 3C.cpp
│ ├── 3D.cpp
│ ├── 3E.cpp
│ ├── 3F.cpp
│ ├── 4A.cpp
│ ├── 4B.cpp
│ ├── 4C.cpp
│ ├── 4D.cpp
│ ├── 5A.cpp
│ ├── 5B.cpp
│ ├── 5C.cpp
│ ├── 5D.cpp
│ ├── 5E.cpp
│ ├── 6A.cpp
│ ├── 6B.cpp
│ ├── 6C.cpp
│ ├── 6D.cpp
│ ├── 6E.cpp
│ ├── 6F.cpp
│ ├── 6G.cpp
│ ├── 6H.cpp
│ ├── 6I.cpp
│ ├── 7A.cpp
│ ├── 7B.cpp
│ ├── 7C.cpp
│ ├── 7D.cpp
│ ├── 7E.cpp
│ ├── 7H.cpp
│ ├── 7I.cpp
│ ├── 8A.cpp
│ ├── 8B.cpp
│ ├── 8C.cpp
│ ├── 8D.cpp
│ ├── 8E.cpp
│ ├── 8F.cpp
│ ├── 9A.cpp
│ ├── 9B.cpp
│ └── 9C.cpp
└── sem-4
├── README.md
├── problems
├── 1A.pdf
├── 5A.pdf
├── 6C.pdf
├── 6D.pdf
├── 8D.pdf
└── problems.pdf
└── solutions
├── 1A.cpp
├── 1B.cpp
├── 1C.cpp
├── 1D.cpp
├── 1E.cpp
├── 1H.cpp
├── 1I.cpp
├── 2A.cpp
├── 3A.cpp
├── 3B.cpp
├── 3C.cpp
├── 3D.cpp
├── 3E.cpp
├── 3F.cpp
├── 3H.cpp
├── 4A.cpp
├── 4B.cpp
├── 4C.cpp
├── 4D.cpp
├── 4E.cpp
├── 5A.cpp
├── 5B.cpp
├── 5C.cpp
├── 5D.cpp
├── 5E.cpp
├── 5F.cpp
├── 5G.cpp
├── 5H.cpp
├── 5I.cpp
├── 5J.cpp
├── 5K.cpp
├── 5L.cpp
├── 5M.cpp
├── 6A.cpp
├── 6F.cpp
├── 7A.cpp
├── 7B.cpp
├── 7C.cpp
├── 7D.cpp
├── 7E.cpp
├── 7F.cpp
└── 7G.cpp
/README.md:
--------------------------------------------------------------------------------
1 |
Алгоритмы и структуры данных, 2022-2024
2 |
3 |
4 | Время работы алгоритма. O-нотация. Квадратичные сортировки. Сортировка слиянием. Два указателя. Двоичная куча. Сортировка кучей. Бинарный и тернарный поиск. Стек. Очередь. Амортизационный анализ. Связные списки. Pointer Machine. Система непересекающихся множеств. Быстрая сортировка. K-я порядковая статистика. Динамическое программирование. Задача о рюкзаке. Наибольшая возрастающая/убывающая подпоследовательность.
5 |
6 |
7 | Дерево отрезков. Дерево Фенвика. Sparse Table. Многомерные структуры данных. Хеш-таблицы. Двоичное дерево поиска. AVL-дерево. Декартово дерево. Splay дерево. LCA. HLD. Центроидная декомпозиция.
8 |
9 |
10 | Обход в глубину. Компоненты сильной связности. Конденсация графа. 2-SAT. Мосты и точки сочленения. Двусвязность. Эйлеровость. Обход в ширину. Алгоритмы Дейкстры и Форда-Беллмана. Алгоритм Флойда. Минимальное остовное дерево. Строки. Префикс-функция и Z-функция. Бор. Ахо-Корасик. Цифровой бор. Суффиксный массив. Корневые оптимизации.
11 |
12 |
13 | Паросочетания в двудольных графах. Паросочетания в произвольных графах. Потоки. Задача о назначениях. Линейное программирование. Вычислительная геометрия. Теория чисел. Быстрое преобразование Фурье.
14 |
--------------------------------------------------------------------------------
/sem-1/problems.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kryag/ct-itmo-algorithms/2019c7d4928bb04fc3e0b7c6fdd4453dbeb35f9a/sem-1/problems.pdf
--------------------------------------------------------------------------------
/sem-1/solutions/1A.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class QuickSort {
4 |
5 | public static void quickSort(int[] a, int left, int right) {
6 | if (left >= right)
7 | return;
8 | int oporElement = a[(left + right) / 2];
9 | int i = left;
10 | int j = right;
11 | while (i <= j) {
12 | while (a[i] < oporElement) {
13 | i++;
14 | }
15 | while (a[j] > oporElement) {
16 | j--;
17 | }
18 | if (i <= j) {
19 | int swap = a[i];
20 | a[i] = a[j];
21 | a[j] = swap;
22 | i++;
23 | j--;
24 | }
25 | }
26 | if (left < j)
27 | quickSort(a, left, j);
28 | if (i < right)
29 | quickSort(a, i, right);
30 | }
31 |
32 | public static void main(String[] args) throws IOException {
33 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
34 | int n = Integer.parseInt(reader.readLine());
35 | int[] a = new int[n];
36 | String[] strs = reader.readLine().split(" ");
37 | for (int i = 0; i < n; i++) {
38 | a[i] = Integer.parseInt(strs[i]);
39 | }
40 | quickSort(a, 0, n - 1);
41 | for (int i = 0; i < n; i++) {
42 | System.out.print(a[i] + " ");
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/sem-1/solutions/1B.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class KStatistic {
4 |
5 | public static int split(int[] a, int l, int r) {
6 | int x = a[r];
7 | int i = l;
8 | for (int j = l; j < r; j++) {
9 | if (a[j] <= x) {
10 | int swap = a[i];
11 | a[i] = a[j];
12 | a[j] = swap;
13 | i++;
14 | }
15 | }
16 | int swap = a[i];
17 | a[i] = a[r];
18 | a[r] = swap;
19 | return i;
20 | }
21 |
22 | public static int kStat(int[] a, int l, int r, int k) {
23 | int m = split(a, l, r);
24 | if (m - l == k - 1) {
25 | return a[m];
26 | }
27 | if (m - l > k - 1) {
28 | return kStat(a, l, m - 1, k);
29 | }
30 | return kStat(a, m + 1, r, k - m + l - 1);
31 | }
32 |
33 | public static void main(String[] args) throws IOException {
34 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
35 | String[] strs = reader.readLine().split(" ");
36 | int n = Integer.parseInt(strs[0]);
37 | int[] a = new int[n];
38 | a[0] = Integer.parseInt(strs[1]);
39 | int k = Integer.parseInt(strs[2]);
40 | for (int i = 1; i < n; i++) {
41 | a[i] = (int) ((1_103_515_245 * (long)(a[i - 1]) + 12345) % 2147483648L);
42 | }
43 | System.out.println(kStat(a, 0, n - 1, k + 1));
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/sem-1/solutions/1C.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class AntiQuickSort {
4 | public static void main(String[] args) throws IOException {
5 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
6 | int n = Integer.parseInt(reader.readLine());
7 | int[] a = new int[n];
8 | for (int i = 0; i < n; i++) {
9 | a[i] = i + 1;
10 | }
11 | for (int i = 2; i < n; i++) {
12 | int swap = a[i];
13 | a[i] = a[i/2];
14 | a[i/2] = swap;
15 | }
16 | System.out.print(a[0]);
17 | for (int i = 1; i < n; i++) {
18 | System.out.print(" " + a[i]);
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/sem-1/solutions/1D.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class CountInversions {
4 | private static long countInversions;
5 |
6 | public static int[] sort(int[] a) {
7 | countInversions = 0;
8 | return sort(a, 0, a.length - 1);
9 | }
10 |
11 | static int[] sort(int[] a, int left, int right) {
12 | if (left > right - 1) {
13 | return new int[]{a[left]};
14 | }
15 | int mid = left + (right - left) / 2;
16 | return merge(sort(a, left, mid), sort(a, mid + 1, right));
17 | }
18 |
19 | static int[] merge(int[] a, int[] b) {
20 | int[] m = new int[a.length + b.length];
21 | int aPos = 0;
22 | int bPos = 0;
23 | int mPos = 0;
24 | while ((aPos < a.length) && (bPos < b.length)) {
25 | if (a[aPos] <= b[bPos]) {
26 | m[mPos++] = a[aPos++];
27 | } else {
28 | m[mPos++] = b[bPos++];
29 | countInversions += (a.length - aPos);
30 | }
31 | }
32 | while (aPos < a.length) {
33 | m[mPos++] = a[aPos++];
34 | }
35 | while (bPos < b.length) {
36 | m[mPos++] = b[bPos++];
37 | }
38 | return m;
39 | }
40 |
41 | public static void main(String[] args) throws IOException {
42 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
43 | int n = Integer.parseInt(reader.readLine());
44 | int[] a = new int[n];
45 | String[] strs = reader.readLine().split(" ");
46 | for (int i = 0; i < n; i++) {
47 | a[i] = Integer.parseInt(strs[i]);
48 | }
49 | sort(a);
50 | System.out.println(countInversions);
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/sem-1/solutions/1G.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class Med {
4 |
5 | public static void quickSort(int[] a, int left, int right) {
6 | if (left >= right) {
7 | return;
8 | }
9 | int oporElement = a[(left + right) / 2];
10 | int i = left;
11 | int j = right;
12 | while (i <= j) {
13 | while (a[i] < oporElement) {
14 | i++;
15 | }
16 | while (a[j] > oporElement) {
17 | j--;
18 | }
19 | if (i <= j) {
20 | int swap = a[i];
21 | a[i] = a[j];
22 | a[j] = swap;
23 | i++;
24 | j--;
25 | }
26 | }
27 | if (left < j){
28 | quickSort(a, left, j);
29 | }
30 | if (i < right) {
31 | quickSort(a, i, right);
32 | }
33 | }
34 |
35 | public static void main(String[] args) throws IOException {
36 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
37 | String[] first = reader.readLine().split(" ");
38 | int n = Integer.parseInt(first[0]);
39 | int m = Integer.parseInt(first[1]);
40 | int p = Integer.parseInt(first[2]);
41 | int[] a = new int[n];
42 | String[] second = reader.readLine().split(" ");
43 | long liters = 0;
44 | boolean mesto = true;
45 | int j = 0;
46 | for (int i = 0; i < n; i++) {
47 | int med = Integer.parseInt(second[i]);
48 | if (med >= p) {
49 | int r = Math.min(m, med / p);
50 | liters += p * r;
51 | m -= r;
52 | med -= p * r;
53 | if (med > 0) {
54 | a[j] = med;
55 | j++;
56 | }
57 | } else {
58 | a[j] = med;
59 | j++;
60 | }
61 | if (m == 0) {
62 | mesto = false;
63 | break;
64 | }
65 | }
66 | if (mesto) {
67 | quickSort(a, 0, j - 1);
68 | for (int q = j - 1; q >= 0; q--) {
69 | liters += a[q];
70 | m--;
71 | if (m == 0) {
72 | break;
73 | }
74 | }
75 | System.out.println(liters);
76 | } else {
77 | System.out.println(liters);
78 | }
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/sem-1/solutions/1H.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class Wsort {
4 | public static void main(String[] args) throws IOException {
5 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
6 | String[] strs = reader.readLine().split(" ");
7 | int n = Integer.parseInt(strs[0]);
8 | int m = Integer.parseInt(strs[1]);
9 | int k = Integer.parseInt(strs[2]);
10 | String[] words = new String[n];
11 | for (int i = 0; i < n; i++) {
12 | words[i] = reader.readLine();
13 | }
14 | int alphabet = 26;
15 | int stop = 0;
16 | for (int i = m - 1; i >= 0; i--) {
17 | String[] wss = new String[n];
18 | int[] chr = new int[alphabet];
19 | for (int j = 0; j < n; j++) {
20 | int curChr = words[j].charAt(i) - 97;
21 | chr[curChr]++;
22 | }
23 | int count = 0;
24 | for (int j = 0; j < alphabet; j++) {
25 | int swap = chr[j];
26 | chr[j] = count;
27 | count += swap;
28 | }
29 | for (int j = 0; j < n; j++) {
30 | int curChr = words[j].charAt(i) - 97;
31 | wss[chr[curChr]] = words[j];
32 | chr[curChr]++;
33 | }
34 | words = wss;
35 | stop++;
36 | if (stop == k) {
37 | break;
38 | }
39 | }
40 | for (String word : words) {
41 | System.out.println(word);
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/sem-1/solutions/2A.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class Sortset {
4 | public static void main(String[] args) throws IOException {
5 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
6 | String[] first = reader.readLine().split(" ");
7 | int n = Integer.parseInt(first[0]);
8 | int m = Integer.parseInt(first[1]);
9 | int k = Integer.parseInt(first[2]);
10 | String[] strs = new String[k];
11 | for (int i = 0; i < k; i++) {
12 | strs[i] = reader.readLine();
13 | }
14 | boolean flag = true;
15 | for (int i = 0; i < (1 << n); i++) {
16 | int[] a = new int[n];
17 | for (int j = 0; j < n; j++) {
18 | a[j] = (i >> j) & 1;
19 | }
20 | for (int j = 0; j < k; j++) {
21 | String[] str = strs[j].split(" ");
22 | int r = Integer.parseInt(str[0]);
23 | for (int o = 0; o < r; o++) {
24 | int max = Math.max(a[Integer.parseInt(str[1 + 2 * o]) - 1], a[Integer.parseInt(str[2 + 2 * o]) - 1]);
25 | int min = Math.min(a[Integer.parseInt(str[1 + 2 * o]) - 1], a[Integer.parseInt(str[2 + 2 * o]) - 1]);
26 | a[Math.min(Integer.parseInt(str[1 + 2 * o]) - 1, Integer.parseInt(str[2 + 2 * o]) - 1)] = min;
27 | a[Math.max(Integer.parseInt(str[1 + 2 * o]) - 1, Integer.parseInt(str[2 + 2 * o]) - 1)] = max;
28 | }
29 | }
30 | for (int j = 0; j < a.length - 1; j++) {
31 | if (a[j] > a[j+1]) {
32 | flag = false;
33 | break;
34 | }
35 | }
36 | if (!flag) {
37 | break;
38 | }
39 | }
40 | if (flag) {
41 | System.out.println("Yes");
42 | } else {
43 | System.out.println("No");
44 | }
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/sem-1/solutions/3A.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class BinarySearch {
4 | public static void main(String[] args) throws IOException {
5 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
6 | String[] line1 = reader.readLine().split(" ");
7 | String[] line2 = reader.readLine().split(" ");
8 | String[] line3 = reader.readLine().split(" ");
9 | reader.close();
10 |
11 | int n = Integer.parseInt(line1[0]);
12 | int k = Integer.parseInt(line1[1]);
13 | int[] a = new int[n];
14 | for (int i = 0; i < n; i++) {
15 | a[i] = Integer.parseInt(line2[i]);
16 | }
17 |
18 | int t = 0;
19 | while (t < k) {
20 | int l = -1;
21 | int r = n;
22 | int findElement = Integer.parseInt(line3[t]);
23 | if (findElement < a[0] || findElement > a[n - 1]) {
24 | System.out.println("NO");
25 | } else {
26 | while (r > l + 1) {
27 | int m = (r + l) / 2;
28 | if (a[m] <= findElement) {
29 | l = m;
30 | } else {
31 | r = m;
32 | }
33 | }
34 | if (a[l] == findElement) {
35 | System.out.println("YES");
36 | } else {
37 | System.out.println("NO");
38 | }
39 | }
40 | t++;
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/sem-1/solutions/3B.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class LeftAndRightBinarySearch {
4 | public static void main(String[] args) throws IOException {
5 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
6 | String[] line1 = reader.readLine().split(" ");
7 | String[] line2 = reader.readLine().split(" ");
8 | String[] line3 = reader.readLine().split(" ");
9 | reader.close();
10 |
11 | int n = Integer.parseInt(line1[0]);
12 | int m = Integer.parseInt(line1[1]);
13 | long[] a = new long[n];
14 | for (int i = 0; i < n; i++) {
15 | a[i] = Integer.parseInt(line2[i]);
16 | }
17 |
18 | int t = 0;
19 | while (t < m) {
20 | int l = -1;
21 | int r = n;
22 | long findElement = Long.parseLong(line3[t]);
23 | while (r > l + 1) {
24 | int med = (l + r) / 2;
25 | if (a[med] < findElement) {
26 | l = med;
27 | } else {
28 | r = med;
29 | }
30 | }
31 | if (r == n || findElement < a[0] || a[r] != findElement) {
32 | System.out.println("0");
33 | } else {
34 | int fOut = r + 1;
35 | l = -1;
36 | r = n;
37 | while (r > l + 1) {
38 | int med = (l + r) / 2;
39 | if (a[med] <= findElement) {
40 | l = med;
41 | } else {
42 | r = med;
43 | }
44 | }
45 | int sOut = l + 1;
46 | System.out.println(fOut + " " + sOut);
47 | }
48 | t++;
49 | }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/sem-1/solutions/3C.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class Garland {
4 | public static int n;
5 | public static double[] a;
6 |
7 | public static boolean isCorrect(double h) {
8 | a[1] = h;
9 | for (int i = 2; i < n; i++) {
10 | a[i] = 2 * a[i - 1] - a[i - 2] + 2;
11 | }
12 | for (int i = 0; i < n; i++) {
13 | if (a[i] <= 0) {
14 | return false;
15 | }
16 | }
17 | return true;
18 | }
19 |
20 | public static void main(String[] args) throws IOException {
21 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
22 | String[] line = reader.readLine().split(" ");
23 | n = Integer.parseInt(line[0]);
24 | a = new double[n];
25 | a[0] = Double.parseDouble(line[1]);
26 |
27 | double l = 0;
28 | double r = 2000;
29 | for (int i = 0; i < 1000; i++) {
30 | double mid = (l + r) / 2;
31 | if (isCorrect(mid)) {
32 | r = mid;
33 | } else {
34 | l = mid;
35 | }
36 | }
37 | isCorrect(r);
38 | System.out.printf("%.2f", a[n - 1]);
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/sem-1/solutions/3F.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class Wires {
4 | public static int k;
5 | public static int n;
6 | public static int[] a;
7 |
8 | public static boolean isCorrect(int segmentLength) {
9 | int count = 0;
10 | for (int i = 0; i < n; i++) {
11 | count += a[i] / segmentLength;
12 | if (count >= k) {
13 | return true;
14 | }
15 | }
16 | return false;
17 | }
18 |
19 | public static void main(String[] args) throws IOException {
20 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
21 | String[] line1 = reader.readLine().split(" ");
22 | n = Integer.parseInt(line1[0]);
23 | k = Integer.parseInt(line1[1]);
24 | a = new int[n];
25 | int max = 0;
26 | int min = 0;
27 | for (int i = 0; i < n; i++) {
28 | a[i] = Integer.parseInt(reader.readLine());
29 | if (a[i] > max) {
30 | max = a[i];
31 | }
32 | if (a[i] < min) {
33 | min = a[i];
34 | }
35 | }
36 | reader.close();
37 |
38 | int result = 0;
39 | int l = min;
40 | int r = max;
41 | while (r - l > 10) {
42 | int median = (l + r) / 2;
43 | if (isCorrect(median)) {
44 | l = median;
45 | result = l;
46 | } else {
47 | r = median;
48 | }
49 | }
50 | for (int i = Math.max(l, 1); i <= r; i++) {
51 | if (isCorrect(i)) {
52 | result = i;
53 | }
54 | }
55 | System.out.println(result);
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/sem-1/solutions/3G.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class AmongThem {
4 | public static long n;
5 | public static long m;
6 |
7 | public static boolean winImpostors() {
8 | return ((n * n + n) / 2) >= m;
9 | }
10 |
11 | public static boolean possibleRounds(long count) {
12 | return (n * count - ((count * (count - 1)) / 2)) >= m;
13 | }
14 |
15 | public static void main(String[] args) throws IOException {
16 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
17 | int t = Integer.parseInt(reader.readLine());
18 | for (int i = 0; i < t; i++) {
19 | String[] line = reader.readLine().split(" ");
20 | n = Long.parseLong(line[0]);
21 | m = Long.parseLong(line[1]);
22 | if (!winImpostors()) {
23 | System.out.println("Crewmates");
24 | System.out.println(n);
25 | } else {
26 | long result = 0;
27 | long l = 1;
28 | long r = n;
29 | while (r - l > 100) {
30 | long med = (l + r) / 2;
31 | if (possibleRounds(med)) {
32 | result = med;
33 | r = med;
34 | } else {
35 | l = med;
36 | }
37 | }
38 | for (long j = l; j <= r; j++) {
39 | if (possibleRounds(j)) {
40 | result = j;
41 | break;
42 | }
43 | }
44 | System.out.println("Impostors");
45 | System.out.println(result);
46 | }
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/sem-1/solutions/3H.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class CricketField {
4 | public static int n;
5 | public static int w;
6 | public static int h;
7 | public static int[] xd;
8 | public static int[] yd;
9 |
10 | public static int[] possibleSquare(int length) {
11 | int score;
12 | for (int y = 0; y < h - length + 1; y++) {
13 | int x = 0;
14 | while (x < w - length + 1) {
15 | score = 0;
16 | for (int tree = 0; tree < n; tree++) {
17 | if (xd[tree] < x + length && xd[tree] > x && yd[tree] < y + length && yd[tree] > y) {
18 | x = xd[tree];
19 | break;
20 | }
21 | score++;
22 | }
23 | if (score == n) {
24 | return new int[]{x, y};
25 | }
26 | }
27 | }
28 | return new int[]{-1, -1};
29 | }
30 |
31 | public static void main(String[] args) throws IOException {
32 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
33 | String[] line = reader.readLine().split(" ");
34 | n = Integer.parseInt(line[0]);
35 | w = Integer.parseInt(line[1]);
36 | h = Integer.parseInt(line[2]);
37 | xd = new int[n];
38 | yd = new int[n];
39 | for (int i = 0; i < n; i++) {
40 | String[] derevo = reader.readLine().split(" ");
41 | xd[i] = Integer.parseInt(derevo[0]);
42 | yd[i] = Integer.parseInt(derevo[1]);
43 | }
44 | int finallyX = 0;
45 | int finallyY = 0;
46 | int finallyLength = 0;
47 | int left = 0;
48 | int right = Math.min(w, h);
49 | while (right - left > 5) {
50 | int median = (left + right) / 2;
51 | int[] a = possibleSquare(median);
52 | if (a[0] != -1) {
53 | finallyX = a[0];
54 | finallyY = a[1];
55 | finallyLength = median;
56 | left = median;
57 | } else {
58 | right = median;
59 | }
60 | }
61 | for (int i = right; i >= left; i--) {
62 | int[] a = possibleSquare(i);
63 | if (a[0] != -1) {
64 | finallyX = a[0];
65 | finallyY = a[1];
66 | finallyLength = i;
67 | break;
68 | }
69 | }
70 | System.out.println(finallyX + " " + finallyY + " " + finallyLength);
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/sem-1/solutions/4A.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class SimpleStack {
4 | public static int[] st;
5 | public static int size;
6 |
7 | public static String push(int n) {
8 | st[size] = n;
9 | size++;
10 | return "ok";
11 | }
12 |
13 | public static int pop() {
14 | int result = st[size - 1];
15 | size--;
16 | return result;
17 | }
18 |
19 | public static int back() {
20 | return st[size - 1];
21 | }
22 |
23 | public static int size() {
24 | return size;
25 | }
26 |
27 | public static String clear() {
28 | size = 0;
29 | return "ok";
30 | }
31 |
32 | public static String exit() {
33 | return "bye";
34 | }
35 |
36 | public static void main(String[] args) throws IOException {
37 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
38 | st = new int[100];
39 | size = 0;
40 | while (true) {
41 | String line = reader.readLine();
42 | if (line == null) {
43 | return;
44 | }
45 | String[] lines = line.split(" ");
46 | if (lines[0].equals("push")) {
47 | System.out.println(push(Integer.parseInt(lines[1])));
48 | }
49 | if (lines[0].equals("pop")) {
50 | System.out.println(pop());
51 | }
52 | if (lines[0].equals("back")) {
53 | System.out.println(back());
54 | }
55 | if (lines[0].equals("size")) {
56 | System.out.println(size());
57 | }
58 | if (lines[0].equals("clear")) {
59 | System.out.println(clear());
60 | }
61 | if (lines[0].equals("exit")) {
62 | System.out.println(exit());
63 | }
64 | }
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/sem-1/solutions/4B.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 |
3 | public class SimpleQueue {
4 | public static int[] q;
5 | public static int size;
6 | public static int head;
7 | public static int tail;
8 |
9 | public static String push(int n) {
10 | q[tail % 100] = n;
11 | tail = (tail + 1) % 100;
12 | size++;
13 | return "ok";
14 | }
15 |
16 | public static int pop() {
17 | int result = q[head % 100];
18 | head = (head + 1) % 100;
19 | size--;
20 | return result;
21 | }
22 |
23 | public static int front() {
24 | return q[head % 100];
25 | }
26 |
27 | public static int size() {
28 | return size;
29 | }
30 |
31 | public static String clear() {
32 | size = 0;
33 | head = 0;
34 | tail = 0;
35 | return "ok";
36 | }
37 |
38 | public static String exit() {
39 | return "bye";
40 | }
41 |
42 | public static void main(String[] args) throws IOException {
43 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
44 | q = new int[100];
45 | size = 0;
46 | head = 0;
47 | tail = 0;
48 | while (true) {
49 | String line = reader.readLine();
50 | if (line == null) {
51 | return;
52 | }
53 | String[] lines = line.split(" ");
54 | if (lines[0].equals("push")) {
55 | System.out.println(push(Integer.parseInt(lines[1])));
56 | }
57 | if (lines[0].equals("pop")) {
58 | System.out.println(pop());
59 | }
60 | if (lines[0].equals("front")) {
61 | System.out.println(front());
62 | }
63 | if (lines[0].equals("size")) {
64 | System.out.println(size());
65 | }
66 | if (lines[0].equals("clear")) {
67 | System.out.println(clear());
68 | }
69 | if (lines[0].equals("exit")) {
70 | System.out.println(exit());
71 | }
72 | }
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/sem-1/solutions/4C.py:
--------------------------------------------------------------------------------
1 | s = input()
2 | try:
3 | result = eval(s)
4 | print(result)
5 | except SyntaxError:
6 | print("WRONG")
7 | except NameError:
8 | print("WRONG")
--------------------------------------------------------------------------------
/sem-1/solutions/4D.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 | import java.util.*;
3 |
4 | public class Histogramm {
5 | public static void main(String[] args) throws IOException {
6 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
7 | String[] line = reader.readLine().split(" ");
8 | int n = Integer.parseInt(line[0]);
9 | int[] a = new int[n];
10 | for (int i = 0; i < n; i++) {
11 | a[i] = Integer.parseInt(line[i + 1]);
12 | }
13 | int[] len = new int[n];
14 | long curProd;
15 | long maxProd = 0;
16 | Stack value = new Stack<>();
17 | Stack ind = new Stack<>();
18 | int size = 0;
19 | int temp = 0;
20 | for (int i = 0; i < n; i++) {
21 | while (size != 0 && a[i] <= value.peek()) {
22 | value.pop();
23 | ind.pop();
24 | size--;
25 | }
26 | if (size > 0) {
27 | temp = ind.peek();
28 | }
29 | value.push(a[i]);
30 | ind.push(i);
31 | size++;
32 | if (size == 1) {
33 | len[i] = i;
34 | } else {
35 | len[i] = i - temp - 1;
36 | }
37 | }
38 | value.clear();
39 | ind.clear();
40 | size = 0;
41 | for (int i = n - 1; i >= 0; i--) {
42 | while (size != 0 && a[i] <= value.peek()) {
43 | value.pop();
44 | ind.pop();
45 | size--;
46 | }
47 | if (size > 0) {
48 | temp = ind.peek();
49 | }
50 | value.push(a[i]);
51 | ind.push(i);
52 | size++;
53 | if (size == 1) {
54 | len[i] = len[i] + n - i;
55 | } else {
56 | len[i] = len[i] + temp - i;
57 | }
58 | }
59 | for (int i = 0; i < n; i++) {
60 | curProd = (long) a[i] * len[i];
61 | maxProd = Math.max(maxProd, curProd);
62 | }
63 | System.out.println(maxProd);
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/sem-1/solutions/4E.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 | import java.util.Stack;
3 |
4 | public class Colonizators2 {
5 |
6 | public static void f(int[] a, int[] first, boolean[] firstFlag, Stack stValue, Stack stIndex, int i) {
7 | while (!stValue.empty() && a[i] >= stValue.peek()) {
8 | stValue.pop();
9 | stIndex.pop();
10 | }
11 | if (stValue.empty()) {
12 | first[i] = 0;
13 | } else {
14 | if (a[i] > 0) {
15 | first[stIndex.peek()]++;
16 | firstFlag[i] = true;
17 | }
18 | }
19 | if (a[i] > 0) {
20 | stValue.push(a[i]);
21 | stIndex.push(i);
22 | }
23 | }
24 |
25 | public static void main(String[] args) throws IOException {
26 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
27 | int n = Integer.parseInt(reader.readLine());
28 | int[] a = new int[n];
29 | String[] line = reader.readLine().split(" ");
30 | for (int i = 0; i < n; i++) {
31 | a[i] = Integer.parseInt(line[i]);
32 | }
33 | int[] first = new int[n];
34 | boolean[] firstFlag = new boolean[n];
35 | Stack stValue = new Stack<>();
36 | Stack stIndex = new Stack<>();
37 | for (int i = n - 1; i >= 0; i--) {
38 | f(a, first, firstFlag, stValue, stIndex, i);
39 | }
40 | for (int i = 0; i < n; i++) {
41 | if (firstFlag[i]) {
42 | a[i]--;
43 | }
44 | a[i] += first[i];
45 | }
46 | stValue.clear();
47 | stIndex.clear();
48 | int[] second = new int[n];
49 | boolean[] secondFlag = new boolean[n];
50 | for (int i = 0; i < n; i++) {
51 | f(a, second, secondFlag, stValue, stIndex, i);
52 | }
53 | int maxCards = 0;
54 | for (int i = 0; i < n; i++) {
55 | if (secondFlag[i]) {
56 | a[i]--;
57 | }
58 | a[i] += second[i];
59 | if (a[i] > maxCards) {
60 | maxCards = a[i];
61 | }
62 | }
63 | System.out.println(maxCards);
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/sem-1/solutions/4G.java:
--------------------------------------------------------------------------------
1 | import java.io.*;
2 | import java.util.*;
3 |
4 | public class Pianiwa {
5 | public static void main(String[] args) throws IOException {
6 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
7 | ArrayDeque player1 = new ArrayDeque<>();
8 | int countCards1 = 5;
9 | ArrayDeque player2 = new ArrayDeque<>();
10 | int countCards2 = 5;
11 | String[] line1 = reader.readLine().split(" ");
12 | String[] line2 = reader.readLine().split(" ");
13 | for (int i = 0; i < line1.length; i++) {
14 | player1.addLast(Integer.parseInt(line1[i]));
15 | player2.addLast(Integer.parseInt(line2[i]));
16 | }
17 | int countRound = 0;
18 | int temp1;
19 | int temp2;
20 | while (true) {
21 | temp1 = player1.pollFirst();
22 | countCards1--;
23 | temp2 = player2.pollFirst();
24 | countCards2--;
25 | if ((temp1 == 0 && temp2 == 9) || (temp1 > temp2 && !(temp2 == 0 && temp1 == 9))) {
26 | player1.addLast(temp1);
27 | player1.addLast(temp2);
28 | countCards1 += 2;
29 | } else {
30 | player2.addLast(temp1);
31 | player2.addLast(temp2);
32 | countCards2 += 2;
33 | }
34 | countRound++;
35 | if (countCards1 == 0) {
36 | System.out.println("second" + " " + countRound);
37 | return;
38 | }
39 | if (countCards2 == 0) {
40 | System.out.println("first" + " " + countRound);
41 | return;
42 | }
43 | if (countRound == 1_000_000) {
44 | System.out.println("botva");
45 | return;
46 | }
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/sem-1/solutions/4H.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | using namespace std;
6 |
7 | int main() {
8 | int n;
9 | cin >> n;
10 | int k;
11 | cin >> k;
12 | vector a(n);
13 | for (int i = 0; i < n; i++) {
14 | int x;
15 | cin >> x;
16 | a[i] = x;
17 | }
18 | deque value;
19 | deque ind;
20 | int size = 0;
21 | for (int i = 0; i < k; i++) {
22 | while (size != 0 && a[i] < value.back()) {
23 | value.pop_back();
24 | ind.pop_back();
25 | size--;
26 | }
27 | value.push_back(a[i]);
28 | ind.push_back(i);
29 | size++;
30 | }
31 | cout << value.front() << '\n';
32 | for (int i = k; i < n; i++) {
33 | while (size != 0 && a[i] < value.back()) {
34 | value.pop_back();
35 | ind.pop_back();
36 | size--;
37 | }
38 | value.push_back(a[i]);
39 | ind.push_back(i);
40 | size++;
41 | if (ind.front() < i - k + 1) {
42 | value.pop_front();
43 | ind.pop_front();
44 | size--;
45 | }
46 | cout << value.front() << '\n';
47 | }
48 | return 0;
49 | }
50 |
--------------------------------------------------------------------------------
/sem-1/solutions/4I.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | using namespace std;
4 |
5 | vector a(300000);
6 | long long value = 0;
7 | int head = 0;
8 | int tail = 0;
9 | int mod = 300000;
10 |
11 | void add(long long x) {
12 | a[tail % mod] = x - value;
13 | tail = (tail + 1) % mod;
14 | }
15 |
16 | void blame(long long x, long long y) {
17 | a[head % mod] = a[head % mod] + x - y;
18 | value += y;
19 | }
20 |
21 | long long out() {
22 | long long result = a[head % mod] + value;
23 | head = (head + 1) % mod;
24 | return result;
25 | }
26 |
27 | int main() {
28 | int n;
29 | cin >> n;
30 | int f;
31 | long long s;
32 | long long t;
33 | for (int i = 0; i < n; i++) {
34 | cin >> f;
35 | if (f == 1) {
36 | cin >> s;
37 | add(s);
38 | }
39 | if (f == 2) {
40 | cin >> s;
41 | cin >> t;
42 | blame(s, t);
43 | }
44 | if (f == 3) {
45 | long long ans = out();
46 | cout << ans << '\n';
47 | }
48 | }
49 | return 0;
50 | }
51 |
--------------------------------------------------------------------------------
/sem-1/solutions/5A.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 |
5 | public class Zaichik {
6 | public static void main(String[] args) throws IOException {
7 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
8 | int n = Integer.parseInt(reader.readLine());
9 | String s = reader.readLine();
10 | int[] dp = new int[n];
11 | dp[0] = 0;
12 | for (int i = 1; i < n; i++) {
13 | if (s.charAt(i) == 'w') {
14 | dp[i] = -1;
15 | } else {
16 | int max = -1;
17 | if (i - 5 >= 0 && dp[i - 5] != -1) {
18 | max = Math.max(max, dp[i - 5]);
19 | }
20 | if (i - 3 >= 0 && dp[i - 3] != -1) {
21 | max = Math.max(max, dp[i - 3]);
22 | }
23 | if (dp[i - 1] != -1) {
24 | max = Math.max(max, dp[i - 1]);
25 | }
26 | if (max == -1) {
27 | dp[i] = -1;
28 | } else {
29 | if (s.charAt(i) == '"') {
30 | dp[i] = max + 1;
31 | }
32 | if (s.charAt(i) == '.') {
33 | dp[i] = max;
34 | }
35 | }
36 | }
37 | }
38 | System.out.println(dp[n - 1]);
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/sem-1/solutions/5B.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 |
5 | public class TurtleAndCoins {
6 | public static void main(String[] args) throws IOException {
7 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
8 | String[] line = reader.readLine().split(" ");
9 | int n = Integer.parseInt(line[0]);
10 | int m = Integer.parseInt(line[1]);
11 | int[][] cell = new int[n][m];
12 | for (int i = 0; i < n; i++) {
13 | line = reader.readLine().split(" ");
14 | for (int j = 0; j < m; j++) {
15 | cell[i][j] = Integer.parseInt(line[j]);
16 | }
17 | }
18 | int[][] dp = new int[n][m];
19 | dp[0][0] = cell[0][0];
20 | for (int j = 1; j < m; j++) {
21 | dp[0][j] = cell[0][j] + dp[0][j - 1];
22 | }
23 | for (int i = 1; i < n; i++) {
24 | dp[i][0] = cell[i][0] + dp[i - 1][0];
25 | }
26 | for (int i = 1; i < n; i++) {
27 | for (int j = 1; j < m; j++) {
28 | if (dp[i - 1][j] >= dp[i][j - 1]) {
29 | dp[i][j] = cell[i][j] + dp[i - 1][j];
30 | } else {
31 | dp[i][j] = cell[i][j] + dp[i][j - 1];
32 | }
33 | }
34 | }
35 | System.out.println(dp[n - 1][m - 1]);
36 | int i = n - 1;
37 | int j = m - 1;
38 | StringBuilder result = new StringBuilder();
39 | while (i != 0 || j != 0) {
40 | if (i - 1 >= 0 && dp[i][j] - cell[i][j] == dp[i - 1][j]) {
41 | i--;
42 | result.append('D');
43 | } else {
44 | j--;
45 | result.append('R');
46 | }
47 | }
48 | System.out.println(result.reverse());
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/sem-1/solutions/5C.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 |
5 | public class LIS {
6 | public static void main(String[] args) throws IOException {
7 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
8 | int n = Integer.parseInt(reader.readLine());
9 | int[] a = new int[n];
10 | String[] line = reader.readLine().split(" ");
11 | for (int i = 0; i < n; i++) {
12 | a[i] = Integer.parseInt(line[i]);
13 | }
14 | int[] dp = new int[n];
15 | int[] prev = new int[n];
16 | dp[0] = 1;
17 | prev[0] = -1;
18 | int max;
19 | int ind;
20 | for (int i = 1; i < n; i++) {
21 | max = 0;
22 | ind = -1;
23 | for (int j = 0; j < i; j++) {
24 | if (a[j] < a[i] && dp[j] > max) {
25 | max = dp[j];
26 | ind = j;
27 | }
28 | }
29 | dp[i] = max + 1;
30 | prev[i] = ind;
31 | }
32 | max = 0;
33 | ind = 0;
34 | for (int i = 0; i < n; i++) {
35 | if (dp[i] > max) {
36 | max = dp[i];
37 | ind = i;
38 | }
39 | }
40 | StringBuilder result = new StringBuilder();
41 | result.insert(0, a[ind]);
42 | result.insert(0, " ");
43 | ind = prev[ind];
44 | while (ind != -1) {
45 | result.insert(0, a[ind]);
46 | result.insert(0, " ");
47 | ind = prev[ind];
48 | }
49 | System.out.println(max);
50 | result.delete(0, 1);
51 | System.out.println(result);
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/sem-1/solutions/5D.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 |
5 | public class LCS {
6 | public static void main(String[] args) throws IOException {
7 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
8 | int n = Integer.parseInt(reader.readLine());
9 | int[] a = new int[n];
10 | String[] line = reader.readLine().split(" ");
11 | for (int i = 0; i < n; i++) {
12 | a[i] = Integer.parseInt(line[i]);
13 | }
14 | int m = Integer.parseInt(reader.readLine());
15 | int[] b = new int[m];
16 | line = reader.readLine().split(" ");
17 | for (int i = 0; i < m; i++) {
18 | b[i] = Integer.parseInt(line[i]);
19 | }
20 | int[][] dp = new int[n][m];
21 | for (int i = 0; i < n; i++) {
22 | for (int j = 0; j < m; j++) {
23 | if (a[i] == b[j]) {
24 | dp[i][j] = ((i - 1 >= 0 && j - 1 >= 0) ? dp[i - 1][j - 1] : 0) + 1;
25 | } else {
26 | if (i - 1 >= 0) {
27 | if (j - 1 >= 0) {
28 | dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
29 | } else {
30 | dp[i][j] = dp[i - 1][j];
31 | }
32 | } else {
33 | if (j - 1 >= 0) {
34 | dp[i][j] = dp[i][j - 1];
35 | } else {
36 | dp[i][j] = 0;
37 | }
38 | }
39 | }
40 | }
41 | }
42 | int i = n - 1;
43 | int j = m - 1;
44 | StringBuilder result = new StringBuilder();
45 | while (i >= 0 || j >= 0) {
46 | if (i >= 0 && j >= 0 && a[i] == b[j]) {
47 | result.insert(0, a[i]);
48 | result.insert(0, " ");
49 | i--;
50 | j--;
51 | } else {
52 | if (i - 1 >= 0) {
53 | if (j - 1 >= 0) {
54 | if (dp[i - 1][j] >= dp[i][j - 1]) {
55 | i--;
56 | } else {
57 | j--;
58 | }
59 | } else {
60 | i--;
61 | }
62 | } else {
63 | if (j - 1 >= 0) {
64 | j--;
65 | } else {
66 | break;
67 | }
68 | }
69 | }
70 | }
71 | System.out.println(dp[n - 1][m - 1]);
72 | result.delete(0, 1);
73 | System.out.println(result);
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/sem-1/solutions/5E.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 |
5 | public class Levenshtain {
6 | public static void main(String[] args) throws IOException {
7 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
8 | String a = reader.readLine();
9 | String b = reader.readLine();
10 | int n = a.length();
11 | int m = b.length();
12 | int[][] dp = new int[n + 1][m + 1];
13 | for (int i = 0; i <= n; i++) {
14 | for (int j = 0; j <= m; j++) {
15 | if (i == 0 || j == 0) {
16 | dp[i][j] = (i == 0) ? j : i;
17 | } else {
18 | if (a.charAt(i - 1) == b.charAt(j - 1)) {
19 | dp[i][j] = dp[i - 1][j - 1];
20 | } else {
21 | dp[i][j] = Math.min(dp[i - 1][j - 1] + 1, dp[i - 1][j] + 1);
22 | dp[i][j] = Math.min(dp[i][j], dp[i][j - 1] + 1);
23 | }
24 | }
25 | }
26 | }
27 | System.out.println(dp[n][m]);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/sem-1/solutions/5G.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 |
5 | public class kriper2004 {
6 | public static void main(String[] args) throws IOException {
7 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
8 | String s = reader.readLine();
9 | int n = Integer.parseInt(reader.readLine());
10 | boolean flag = true;
11 | for (int i = 0; i < s.length() - 1; i++) {
12 | if ((int) s.charAt(i) + 1 == (int) s.charAt(i + 1)) {
13 | System.out.println(0);
14 | flag = false;
15 | break;
16 | }
17 | }
18 | if (flag) {
19 | if (s.length() == n) {
20 | System.out.println(1);
21 | } else {
22 | int[][] dp = new int[n][26];
23 | dp[s.length() - 1][s.charAt(s.length() - 1) - 97] = 1;
24 | for (int i = s.length(); i < n; i++) {
25 | for (int j = 0; j < 26; j++) {
26 | for (int q = 0; q < 26; q++) {
27 | if (q + 1 != j) {
28 | dp[i][j] = (dp[i][j] + dp[i - 1][q]) % 998244353;
29 | }
30 | }
31 | }
32 | }
33 | int result = 0;
34 | for (int i = 0; i < 26; i++) {
35 | result += dp[n - 1][i];
36 | result %= 998244353;
37 | }
38 | System.out.println(result);
39 | }
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/sem-1/solutions/7A.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 | import java.util.ArrayList;
5 | import java.util.HashSet;
6 | import java.util.List;
7 | import java.util.Set;
8 |
9 | public class CollectExp {
10 | public static List> ls = new ArrayList<>();
11 | public static int[] exp;
12 | public static int[] newExp;
13 | public static int[] p;
14 | public static int n;
15 |
16 | public static int find(int x) {
17 | if (p[x] != x) {
18 | p[x] = find(p[x]);
19 | }
20 | return p[x];
21 | }
22 |
23 | public static void join(int x, int y) {
24 | x = find(x);
25 | y = find(y);
26 | for (Integer i : ls.get(x)) {
27 | exp[i] += newExp[x] - newExp[y];
28 | }
29 | p[x] = y;
30 | ls.get(y).addAll(ls.get(x));
31 | }
32 |
33 | public static void add(int x, int v) {
34 | x = find(x);
35 | newExp[x] += v;
36 | }
37 |
38 | public static void get(int x) {
39 | System.out.println(exp[x] + newExp[find(x)]);
40 | }
41 |
42 | public static void joinLess(int x, int y) {
43 | x = find(x);
44 | y = find(y);
45 | if (ls.get(x).size() <= ls.get(y).size()) {
46 | join(x, y);
47 | } else {
48 | join(y, x);
49 | }
50 | }
51 |
52 | public static void main(String[] args) throws IOException {
53 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
54 | String[] line = reader.readLine().split(" ");
55 | n = Integer.parseInt(line[0]);
56 | int m = Integer.parseInt(line[1]);
57 | exp = new int[n];
58 | newExp = new int[n];
59 | p = new int[n];
60 | for (int i = 0; i < n; i++) {
61 | Set temp = new HashSet<>();
62 | temp.add(i);
63 | ls.add(temp);
64 | p[i] = i;
65 | }
66 | for (int i = 0; i < m; i++) {
67 | line = reader.readLine().split(" ");
68 | if (line[0].equals("join")) {
69 | joinLess(Integer.parseInt(line[1]) - 1, Integer.parseInt(line[2]) - 1);
70 | } else if (line[0].equals("add")) {
71 | add(Integer.parseInt(line[1]) - 1, Integer.parseInt(line[2]));
72 | } else {
73 | get(Integer.parseInt(line[1]) - 1);
74 | }
75 | }
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/sem-1/solutions/7B.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 |
5 | public class CuttingGraph {
6 | public static int[] p;
7 |
8 | public static int find(int x) {
9 | if (p[x] != x) {
10 | p[x] = find(p[x]);
11 | }
12 | return p[x];
13 | }
14 |
15 | public static void join(int x, int y) {
16 | x = find(x);
17 | y = find(y);
18 | p[x] = y;
19 | }
20 |
21 | public static boolean ask(int x, int y) {
22 | return find(x) == find(y);
23 | }
24 |
25 | public static void main(String[] args) throws IOException {
26 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
27 | String[] line = reader.readLine().split(" ");
28 | int n = Integer.parseInt(line[0]);
29 | int m = Integer.parseInt(line[1]);
30 | int k = Integer.parseInt(line[2]);
31 | p = new int[n];
32 | for (int i = 0; i < n; i++) {
33 | p[i] = i;
34 | }
35 | String[] answers = new String[k - m];
36 | for (int i = 0; i < m; i++) {
37 | reader.readLine();
38 | }
39 | String[] action = new String[k];
40 | for (int i = 0; i < k; i++) {
41 | action[k - i - 1] = reader.readLine();
42 | }
43 | int count = 0;
44 | for (int i = 0; i < k; i++) {
45 | String[] s = action[i].split(" ");
46 | if (s[0].equals("ask")) {
47 | if (ask(Integer.parseInt(s[1]) - 1, Integer.parseInt(s[2]) - 1)) {
48 | answers[k - m - count - 1] = "YES";
49 | } else {
50 | answers[k - m - count - 1] = "NO";
51 | }
52 | count++;
53 | } else {
54 | join(Integer.parseInt(s[1]) - 1, Integer.parseInt(s[2]) - 1);
55 | }
56 | }
57 | for (String s : answers) {
58 | System.out.println(s);
59 | }
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/sem-1/solutions/7C.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 |
5 | public class Company {
6 | public static int[] p;
7 | public static int[] r;
8 |
9 | public static int find(int x) {
10 | if (p[x] != x) {
11 | p[x] = find(p[x]);
12 | }
13 | return p[x];
14 | }
15 |
16 | public static void team(int x, int y) {
17 | x = find(x);
18 | y = find(y);
19 | p[x] = y;
20 | }
21 |
22 | public static boolean ask(int x, int y) {
23 | return find(x) == find(y);
24 | }
25 |
26 | public static void main(String[] args) throws IOException {
27 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
28 | String[] line = reader.readLine().split(" ");
29 | int n = Integer.parseInt(line[0]);
30 | int q = Integer.parseInt(line[1]);
31 | p = new int[n];
32 | r = new int[n];
33 | for (int i = 0; i < n; i++) {
34 | p[i] = i;
35 | r[i] = i + 1;
36 | }
37 | r[n - 1] = Integer.MAX_VALUE;
38 | for (int i = 0; i < q; i++) {
39 | line = reader.readLine().split(" ");
40 | int type = Integer.parseInt(line[0]);
41 | if (type == 1) {
42 | team(Integer.parseInt(line[1]) - 1, Integer.parseInt(line[2]) - 1);
43 | } else {
44 | if (type == 2) {
45 | int prev = Integer.parseInt(line[1]) - 1;
46 | int cur = prev + 1;
47 | while (cur <= Integer.parseInt(line[2]) - 1) {
48 | int parentPrev = p[prev];
49 | int parentCur = p[cur];
50 | if (parentPrev == parentCur) {
51 | int tempCur = cur;
52 | cur = r[cur];
53 | r[tempCur] = r[Integer.parseInt(line[2]) - 1];
54 | continue;
55 | }
56 | int tempCur = cur;
57 | team(parentPrev, parentCur);
58 | prev = cur;
59 | cur = r[cur];
60 | r[tempCur] = r[Integer.parseInt(line[2]) - 1];
61 | }
62 | } else {
63 | if (ask(Integer.parseInt(line[1]) - 1, Integer.parseInt(line[2]) - 1)) {
64 | System.out.println("YES");
65 | } else {
66 | System.out.println("NO");
67 | }
68 | }
69 | }
70 | }
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/sem-1/solutions/8A.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 |
5 | public class Backpack01 {
6 | public static void main(String[] args) throws IOException {
7 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
8 | String[] line = reader.readLine().split(" ");
9 | int n = Integer.parseInt(line[0]);
10 | int m = Integer.parseInt(line[1]);
11 | int[] a = new int[n + 1];
12 | line = reader.readLine().split(" ");
13 | for (int i = 0; i < n; i++) {
14 | a[i + 1] = Integer.parseInt(line[i]);
15 | }
16 | int[][] dp = new int[n + 1][m + 1];
17 | dp[0][0] = 1;
18 | for (int i = 1; i < n + 1; i++) {
19 | for (int j = 0; j < m + 1; j++) {
20 | dp[i][j] = dp[i - 1][j];
21 | if (j - a[i] >= 0 && dp[i][j] == 0) {
22 | dp[i][j] = dp[i - 1][j - a[i]];
23 | }
24 | }
25 | }
26 | for (int i = m; i >= 0; i--) {
27 | if (dp[n][i] == 1) {
28 | System.out.println(i);
29 | break;
30 | }
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/sem-1/solutions/8B.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 |
5 | public class Backpack {
6 | public static void main(String[] args) throws IOException {
7 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
8 | String[] line = reader.readLine().split(" ");
9 | int n = Integer.parseInt(line[0]);
10 | int m = Integer.parseInt(line[1]);
11 | int[] w = new int[n + 1];
12 | line = reader.readLine().split(" ");
13 | for (int i = 0; i < n; i++) {
14 | w[i + 1] = Integer.parseInt(line[i]);
15 | }
16 | int[] c = new int[n + 1];
17 | line = reader.readLine().split(" ");
18 | for (int i = 0; i < n; i++) {
19 | c[i + 1] = Integer.parseInt(line[i]);
20 | }
21 | int[][] dp = new int[n + 1][m + 1];
22 | dp[0][0] = 0;
23 | for (int i = 1; i < m + 1; i++) {
24 | dp[0][i] = Integer.MIN_VALUE;
25 | }
26 | for (int i = 1; i < n + 1; i++) {
27 | for (int j = 0; j < m + 1; j++) {
28 | dp[i][j] = dp[i - 1][j];
29 | if (j - w[i] >= 0 && dp[i - 1][j - w[i]] != Integer.MIN_VALUE) {
30 | dp[i][j] = Math.max(dp[i - 1][j - w[i]] + c[i], dp[i][j]);
31 | }
32 | }
33 | }
34 | int result = Integer.MIN_VALUE;
35 | int ind = 0;
36 | for (int i = 0; i < m + 1; i++) {
37 | if (dp[n][i] > result) {
38 | result = dp[n][i];
39 | ind = i;
40 | }
41 | }
42 | int count = 0;
43 | int i = n;
44 | StringBuilder sb = new StringBuilder();
45 | do {
46 | if (ind - w[i] >= 0 && dp[i - 1][ind] <= dp[i - 1][ind - w[i]] + c[i]) {
47 | count++;
48 | sb.insert(0, i);
49 | sb.insert(0, " ");
50 | ind -= w[i];
51 | }
52 | i--;
53 | } while (i != 0);
54 | System.out.println(count);
55 | System.out.println(sb.delete(0, 1));
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/sem-1/solutions/8C.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 |
5 | public class Bankomat {
6 | public static void main(String[] args) throws IOException {
7 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
8 | int n = Integer.parseInt(reader.readLine());
9 | int[] w = new int[n + 1];
10 | String[] line = reader.readLine().split(" ");
11 | for (int i = 0; i < n; i++) {
12 | w[i] = Integer.parseInt(line[i]);
13 | }
14 | int s = Integer.parseInt(reader.readLine());
15 | int[] dp = new int[s + 1];
16 | for (int i = 0; i < s + 1; i++) {
17 | dp[i] = s + 1;
18 | }
19 | dp[0] = 0;
20 | for (int i = 1; i < s + 1; i++) {
21 | for (int j = 0; j < n; j++) {
22 | if (w[j] <= i) {
23 | dp[i] = Math.min(dp[i], dp[i - w[j]] + 1);
24 | }
25 | }
26 | }
27 | if (dp[s] > s) {
28 | System.out.println(-1);
29 | } else {
30 | System.out.println(dp[s]);
31 | StringBuilder sb = new StringBuilder();
32 | int i = s;
33 | while (i != 0) {
34 | int minValue = s + 1;
35 | int minIndex = -1;
36 | for (int j = 0; j < n; j++) {
37 | if (w[j] <= i) {
38 | if (dp[i - w[j]] < minValue && dp[i - w[j]] != s + 1) {
39 | minIndex = j;
40 | minValue = dp[i - w[j]];
41 | }
42 | }
43 | }
44 | sb.append(w[minIndex]).append(" ");
45 | i -= w[minIndex];
46 | }
47 | sb.setLength(sb.length() - 1);
48 | System.out.println(sb);
49 | }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/sem-1/solutions/8D.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 | import java.util.*;
5 |
6 | public class Giri2 {
7 | public static void main(String[] args) throws IOException {
8 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
9 | int n = Integer.parseInt(reader.readLine());
10 | String[] line = reader.readLine().split(" ");
11 | int[] a = new int[n + 1];
12 | int sum = 0;
13 | for (int i = 0; i < n; i++) {
14 | a[i + 1] = Integer.parseInt(line[i]);
15 | sum += a[i + 1];
16 | }
17 | if (n % 2 == 1 || sum % 2 == 1) {
18 | System.out.println(-1);
19 | return;
20 | }
21 | List>> dp = new ArrayList<>(sum / 2 + 1);
22 | for (int i = 0; i < sum / 2 + 1; i++) {
23 | List> temp = new ArrayList<>();
24 | for (int j = 0; j < n / 2 + 1; j++) {
25 | Set temp2 = new HashSet<>();
26 | temp.add(temp2);
27 | }
28 | dp.add(temp);
29 | }
30 | for (int i = 1; i < n + 1; i++) {
31 | if (a[i] <= sum / 2 && dp.get(a[i]).get(1).isEmpty()) {
32 | dp.get(a[i]).get(1).add(i);
33 | }
34 | }
35 | for (int i = 2; i < n / 2 + 1; i++) {
36 | for (int j = 1; j < sum / 2 + 1; j++) {
37 | for (int p = 1; p < n + 1; p++) {
38 | if (j - a[p] > 0 && !dp.get(j - a[p]).get(i - 1).isEmpty()) {
39 | if (!dp.get(j - a[p]).get(i - 1).contains(p)) {
40 | Set temp = new HashSet<>(dp.get(j - a[p]).get(i - 1));
41 | temp.add(p);
42 | List> temp2 = new ArrayList<>(dp.get(j));
43 | temp2.set(i, temp);
44 | dp.set(j, temp2);
45 | break;
46 | }
47 | }
48 | }
49 | }
50 | }
51 | if (dp.get(sum / 2).get(n / 2).isEmpty()) {
52 | System.out.println(-1);
53 | return;
54 | }
55 | StringBuilder first = new StringBuilder();
56 | StringBuilder second = new StringBuilder();
57 | for (int i = 1; i < n + 1; i++) {
58 | if (dp.get(sum / 2).get(n / 2).contains(i)) {
59 | first.append(i).append(" ");
60 | } else {
61 | second.append(i).append(" ");
62 | }
63 | }
64 | first.setLength(first.length() - 1);
65 | second.setLength(second.length() - 1);
66 | System.out.println(first);
67 | System.out.println(second);
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/sem-2/problems.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kryag/ct-itmo-algorithms/2019c7d4928bb04fc3e0b7c6fdd4453dbeb35f9a/sem-2/problems.pdf
--------------------------------------------------------------------------------
/sem-2/solutions/1A.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 |
5 | public class RMQ {
6 | public static int[] tree;
7 | public static int[] index;
8 | public static String[] a;
9 | public static int n;
10 | public static int q;
11 |
12 | public static int[] get(int v, int l, int r, int ql, int qr) {
13 | if (qr <= l || ql >= r) {
14 | return new int[]{Integer.MIN_VALUE, -1};
15 | }
16 | if (ql <= l && r <= qr) {
17 | return new int[]{tree[v], index[v]};
18 | }
19 | int m = (l + r) / 2;
20 | int[] maxLeftChild = get(2 * v + 1, l, m, ql, qr);
21 | int[] maxRightChild = get(2 * v + 2, m, r, ql, qr);
22 | if (maxLeftChild[0] >= maxRightChild[0]) {
23 | return maxLeftChild;
24 | }
25 | return maxRightChild;
26 | }
27 |
28 | public static void build(int v, int l, int r) {
29 | if (l + 1 == r) {
30 | tree[v] = (l < a.length ? Integer.parseInt(a[l]) : Integer.MIN_VALUE);
31 | index[v] = l;
32 | return;
33 | }
34 | int m = (l + r) / 2;
35 | build(2 * v + 1, l, m);
36 | build(2 * v + 2, m, r);
37 | if (tree[2 * v + 1] >= tree[2 * v + 2]) {
38 | tree[v] = tree[2 * v + 1];
39 | index[v] = index[2 * v + 1];
40 | } else {
41 | tree[v] = tree[2 * v + 2];
42 | index[v] = index[2 * v + 2];
43 | }
44 | }
45 |
46 | public static void main(String[] args) throws IOException {
47 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
48 | n = Integer.parseInt(reader.readLine());
49 | a = reader.readLine().split(" ");
50 | if (!is2k(n)) {
51 | n = (int) Math.pow(2, q);
52 | }
53 | tree = new int[2 * n - 1];
54 | index = new int[2 * n - 1];
55 | build(0, 0, n);
56 | int countQuery = Integer.parseInt(reader.readLine());
57 | for (int i = 0; i < countQuery; i++) {
58 | String[] line = reader.readLine().split(" ");
59 | int[] ans = get(0, 0, n, Integer.parseInt(line[0]) - 1, Integer.parseInt(line[1]));
60 | System.out.println(ans[0] + " " + (ans[1] + 1));
61 | }
62 | }
63 |
64 | public static boolean is2k(int x) {
65 | int a = 1;
66 | q = 0;
67 | while (true) {
68 | if (a == x) {
69 | return true;
70 | }
71 | if (a > x) {
72 | return false;
73 | }
74 | a *= 2;
75 | q++;
76 | }
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/sem-2/solutions/1H.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | struct vertex {
5 | int open;
6 | int close;
7 | int pair;
8 |
9 | void initialization() {
10 | open = 0;
11 | close = 0;
12 | pair = 0;
13 | }
14 | };
15 |
16 | int n;
17 | std::vector tree;
18 |
19 | vertex merge(const vertex &left, const vertex &right){
20 | vertex parent{};
21 | parent.open = left.open + right.open;
22 | parent.close = left.close + right.close;
23 | int leftDist = std::max(left.open - left.pair / 2, 0);
24 | int rightDist = std::max(right.close - right.pair / 2, 0);
25 | parent.pair = left.pair + right.pair + 2 * (std::min(leftDist, rightDist));
26 | return parent;
27 | }
28 |
29 | void set(int v, int l, int r, int i, vertex value) {
30 | if (l + 1 == r) {
31 | tree[v] = value;
32 | return;
33 | }
34 | int m = l + (r - l) / 2;
35 | if (i < m) {
36 | set(2 * v + 1, l, m, i, value);
37 | } else {
38 | set(2 * v + 2, m, r, i, value);
39 | }
40 | tree[v] = merge(tree[2 * v + 1], tree[2 * v + 2]);
41 | }
42 |
43 | vertex getAnswer(int v, int l, int r, int ql, int qr) {
44 | if (qr <= l || r <= ql) {
45 | vertex tmp{};
46 | tmp.initialization();
47 | return tmp;
48 | }
49 | if (ql <= l && r <= qr) {
50 | return tree[v];
51 | }
52 | int m = l + (r - l) / 2;
53 | vertex left = getAnswer(2 * v + 1, l, m, ql, qr);
54 | vertex right = getAnswer(2 * v + 2, m, r, ql, qr);
55 | return merge(left, right);
56 | }
57 |
58 | int main() {
59 | std::ios_base::sync_with_stdio(false);
60 | std::string line;
61 | std::cin >> line;
62 | n = 1;
63 | while (n < line.length()) {
64 | n *= 2;
65 | }
66 | vertex zero{};
67 | zero.initialization();
68 | tree.assign(2 * n - 1, zero);
69 | for (int i = 0; i < line.length(); i++) {
70 | vertex temp{};
71 | temp.open = (line[i] == '(') ? 1 : 0;
72 | temp.close = (line[i] == ')') ? 1 : 0;
73 | temp.pair = 0;
74 | set(0, 0, n, i, temp);
75 | }
76 | int m;
77 | std::cin >> m;
78 | while (m > 0) {
79 | int ql, qr;
80 | std::cin >> ql >> qr;
81 | vertex answer = getAnswer(0, 0, n, ql - 1, qr);
82 | std::cout << answer.pair << '\n';
83 | m--;
84 | }
85 | return 0;
86 | }
87 |
--------------------------------------------------------------------------------
/sem-2/solutions/2D.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | std::vector alf[26];
6 |
7 | int set(int q, int ql, int qr, int delta) {
8 | if (alf[q].empty()) {
9 | return delta;
10 | }
11 | int left = std::lower_bound(alf[q].data(), alf[q].data() + alf[q].size(), ql) - alf[q].data();
12 | int right = std::upper_bound(alf[q].data(), alf[q].data() + alf[q].size(), qr) - alf[q].data();
13 | for (int i = left; i < right; i++) {
14 | alf[q][i] = delta;
15 | delta++;
16 | }
17 | return delta;
18 | }
19 |
20 | int main() {
21 | int n, q;
22 | std::cin >> n >> q;
23 | std::string s;
24 | std::cin >> s;
25 | for (int i = 0; i < s.length(); i++) {
26 | int c = s[i] - 'a';
27 | alf[c].push_back(i);
28 | }
29 | for (int i = 0; i < q; i++) {
30 | int ql, qr, k;
31 | std::cin >> ql >> qr >> k;
32 | ql--;
33 | qr--;
34 | int delta = ql;
35 | if (k == 1) {
36 | for (int no = 0; no < 26; no++) {
37 | delta = set(no, ql, qr, delta);
38 | }
39 | } else {
40 | for (int no = 25; no >= 0; no--) {
41 | delta = set(no, ql, qr, delta);
42 | }
43 | }
44 | }
45 | for (int i = 0; i < 26; i++) {
46 | for (int j = 0; j < alf[i].size(); j++) {
47 | s[alf[i][j]] = 'a' + i;
48 | }
49 | }
50 | std::cout << s;
51 | return 0;
52 | }
53 |
--------------------------------------------------------------------------------
/sem-2/solutions/2H.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 | import java.util.Arrays;
5 |
6 | public class Pictures {
7 | public static final int MOD = 10_007;
8 | public static int[][] tree;
9 | public static int[] col;
10 | public static int[] bw;
11 | public static int n;
12 | public static int c;
13 |
14 | public static void update(int v) {
15 | for (int i = 0; i <= c; i++) {
16 | tree[v][i] = 0;
17 | }
18 | for (int i = 0; i <= c; i++) {
19 | for (int j = 0; j <= c; j++) {
20 | int tmp = Math.min(i + j, c);
21 | tree[v][tmp] += (tree[v * 2][i] * tree[v * 2 + 1][j]) % MOD;
22 | }
23 | }
24 | for (int i = 0; i <= c; i++) {
25 | tree[v][i] %= MOD;
26 | }
27 | }
28 |
29 | public static void set(int v) {
30 | v += n;
31 | Arrays.fill(tree[v], 0);
32 | tree[v][0] = bw[v - n] % MOD;
33 | tree[v][1] = col[v - n] % MOD;
34 | v /= 2;
35 | for (int i = v; i > 0; i /= 2) {
36 | update(i);
37 | }
38 | }
39 |
40 | public static void main(String[] args) throws IOException {
41 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
42 | String[] line = reader.readLine().split(" ");
43 | n = Integer.parseInt(line[0]);
44 | c = Integer.parseInt(line[1]);
45 | col = new int[n];
46 | bw = new int[n];
47 | tree = new int[2 * n][c + 1];
48 |
49 | line = reader.readLine().split(" ");
50 | for (int i = 0; i < n; i++) {
51 | col[i] = Integer.parseInt(line[i]);
52 | }
53 |
54 | line = reader.readLine().split(" ");
55 | for (int i = 0; i < n; i++) {
56 | bw[i] = Integer.parseInt(line[i]);
57 | }
58 |
59 | for (int i = 0; i < n; i++) {
60 | tree[n + i][0] = bw[i] % MOD;
61 | tree[n + i][1] = col[i] % MOD;
62 | }
63 | for (int i = n - 1; i >= 1; i--) {
64 | update(i);
65 | }
66 |
67 | int q = Integer.parseInt(reader.readLine());
68 | while (q-- > 0) {
69 | line = reader.readLine().split(" ");
70 | int change = Integer.parseInt(line[0]) - 1;
71 | col[change] = Integer.parseInt(line[1]);
72 | bw[change] = Integer.parseInt(line[2]);
73 | set(change);
74 | System.out.println(tree[1][c]);
75 | }
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/sem-2/solutions/3A.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | const int SIZE = 100'001;
6 | std::vector a(SIZE);
7 | int table[SIZE][18];
8 |
9 | void create(int n) {
10 | for (int i = 1; i < n + 1; ++i) {
11 | table[i][0] = a[i];
12 | }
13 | for (int i = 1; (1 << i) < n + 1; ++i) {
14 | for (int j = 1; 1 << i < n + 2 - j; ++j) {
15 | table[j][i] = std::min(table[j][i - 1], table[j + (1 << (i - 1))][i - 1]);
16 | }
17 | }
18 | }
19 |
20 | int find(int lq, int rq) {
21 | int noLayer = 31 - __builtin_clz(rq - lq);
22 | return std::min(table[lq][noLayer], table[rq - (1 << noLayer) + 1][noLayer]);
23 | }
24 |
25 | int main() {
26 | std::ios_base::sync_with_stdio(false);
27 | std::cin.tie(nullptr);
28 | int n, m, u, v;
29 | a[0] = 0;
30 | std::cin >> n >> m >> a[1];
31 | for (int i = 2; i < n + 1; i++) {
32 | a[i] = (23 * a[i - 1] + 21563) % 16714589;
33 | }
34 | create(n);
35 | std::cin >> u >> v;
36 | int result = find(u, v);
37 | for (int i = 2; i < m + 1; i++) {
38 | u = ((17 * u + 751 + result + 2 * (i - 1)) % n) + 1;
39 | v = ((13 * v + 593 + result + 5 * (i - 1)) % n) + 1;
40 | result = (u <= v) ? find(u, v) : find(v, u);
41 | }
42 | std::cout << u << " " << v << " " << result;
43 | return 0;
44 | }
45 |
--------------------------------------------------------------------------------
/sem-2/solutions/3B.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | int fenwick[129][129][129] = {0};
4 | int n;
5 |
6 | int dec(int x) {
7 | x -= x & (-x);
8 | return x;
9 | }
10 |
11 | int query(int xq, int yq, int zq) {
12 | int x, y, z;
13 | int answer = 0;
14 | x = xq;
15 | while (x > 0) {
16 | y = yq;
17 | while (y > 0) {
18 | z = zq;
19 | while (z > 0) {
20 | answer += fenwick[x][y][z];
21 | z = dec(z);
22 | }
23 | y = dec(y);
24 | }
25 | x = dec(x);
26 | }
27 | return answer;
28 | }
29 |
30 | int inc(int x) {
31 | x += x & (-x);
32 | return x;
33 | }
34 |
35 | void update(int xq, int yq, int zq, int value) {
36 | int x, y, z;
37 | x = xq + 1;
38 | while (x < n + 1) {
39 | y = yq + 1;
40 | while (y < n + 1) {
41 | z = zq + 1;
42 | while (z < n + 1) {
43 | fenwick[x][y][z] += value;
44 | z = inc(z);
45 | }
46 | y = inc(y);
47 | }
48 | x = inc(x);
49 | }
50 | }
51 |
52 | int main() {
53 | std::ios_base::sync_with_stdio(false);
54 | std::cin.tie(nullptr);
55 | int c[7], ans[8], m = 0, result;
56 | std::cin >> n;
57 | while (true) {
58 | std::cin >> m;
59 | if (m == 1) {
60 | std::cin >> c[0] >> c[2] >> c[4] >> c[6];
61 | update(c[0], c[2], c[4], c[6]);
62 | } else if (m == 2) {
63 | std::cin >> c[0] >> c[2] >> c[4] >> c[1] >> c[3] >> c[5];
64 | ans[0] = query(c[1] + 1, c[3] + 1, c[5] + 1);
65 | ans[1] = query(c[0], c[2], c[4]);
66 | ans[2] = query(c[0], c[2], c[5] + 1);
67 | ans[3] = query(c[1] + 1, c[3] + 1, c[4]);
68 | ans[4] = query(c[0], c[3] + 1, c[4]);
69 | ans[5] = query(c[1] + 1, c[2], c[5] + 1);
70 | ans[6] = query(c[1] + 1, c[2], c[4]);
71 | ans[7] = query(c[0], c[3] + 1, c[5] + 1);
72 | result = 0;
73 | for (int i = 0; i < 8; ++i) {
74 | result += (i % 2 == 0) ? ans[i] : -ans[i];
75 | }
76 | std::cout << result << '\n';
77 | } else {
78 | return 0;
79 | }
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/sem-2/solutions/3C.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | const int N = 200'010;
5 | const int countLayers = 19;
6 |
7 | int S[N], a[countLayers][N], b[countLayers][N], n;
8 |
9 | void build() {
10 | for (int i = 1; i <= S[n]; ++i) {
11 | for (int j = 1; j <= n - (1 << i) + 1; ++j) {
12 | a[i][j] = std::max(a[i - 1][j], a[i - 1][j + (1 << (i - 1))]);
13 | b[i][j] = std::min(b[i - 1][j], b[i - 1][j + (1 << (i - 1))]);
14 | }
15 | }
16 | }
17 |
18 | int getA(int l, int r) {
19 | return std::max(a[S[r - l + 1]][l], a[S[r - l + 1]][r - (1 << S[r - l + 1]) + 1]);
20 | }
21 |
22 | int getB(int l, int r) {
23 | return std::min(b[S[r - l + 1]][l], b[S[r - l + 1]][r - (1 << S[r - l + 1]) + 1]);
24 | }
25 |
26 | int binarySearchRight(int border) {
27 | int l = 0, r = border + 1;
28 | while (l < r - 1) {
29 | int mid = (l + r) >> 1;
30 | if (getA(mid, border) < getB(mid, border)) {
31 | r = mid;
32 | } else {
33 | l = mid;
34 | }
35 | }
36 | return r;
37 | }
38 |
39 | int binarySearchLeft(int border) {
40 | int l = 0, r = border + 1;
41 | while (l < r - 1) {
42 | int mid = (l + r) >> 1;
43 | if (getA(mid, border) > getB(mid, border)) {
44 | l = mid;
45 | } else {
46 | r = mid;
47 | }
48 | }
49 | return r;
50 | }
51 |
52 | int main() {
53 | std::ios_base::sync_with_stdio(false);
54 | std::cin.tie(nullptr);
55 | std::cin >> n;
56 | S[1] = 0;
57 | for (int i = 2; i <= n; ++i) {
58 | S[i] = 1 + S[i >> 1];
59 | }
60 | for (int i = 1; i <= n; ++i) {
61 | std::cin >> a[0][i];
62 | }
63 | for (int i = 1; i <= n; ++i) {
64 | std::cin >> b[0][i];
65 | }
66 | long long ans = 0;
67 | build();
68 | for (int i = 1; i <= n; ++i) {
69 | ans += (binarySearchRight(i) - binarySearchLeft(i));
70 | }
71 | std::cout << ans << '\n';
72 | return 0;
73 | }
74 |
--------------------------------------------------------------------------------
/sem-2/solutions/3D.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | const int N = 200005, LOG = 20;
4 | int lg[N];
5 | long long n, sp[LOG][N], a[N];
6 | std::map map;
7 |
8 | void build() {
9 | lg[1] = 0;
10 | for (int i = 2; i <= n; ++i) {
11 | lg[i] = lg[i / 2] + 1;
12 | }
13 | for (int i = 1; i <= n; ++i) {
14 | sp[0][i] = a[i];
15 | }
16 | for (int i = 1; (1 << i) <= n; ++i) {
17 | for (int j = 1; j + (1 << i) - 1 <= n; ++j) {
18 | sp[i][j] = (sp[i - 1][j] | sp[i - 1][j + (1 << (i - 1))]);
19 | }
20 | }
21 | }
22 |
23 | long long get(int l, int r) {
24 | int temp = lg[r - l + 1];
25 | return (sp[temp][l] | sp[temp][r - (1 << temp) + 1]);
26 | }
27 |
28 | long long binarySearchRight(int l, int r, int index) {
29 | while (l < r) {
30 | int m = r - (r - l) / 2;
31 | if (get(index, m) == a[index]) {
32 | l = m;
33 | } else {
34 | r = m - 1;
35 | }
36 | }
37 | return r;
38 | }
39 |
40 | long long binarySearchLeft(int l, int r, int index) {
41 | while (l < r) {
42 | int m = (l + r) / 2;
43 | if (get(m, index) == a[index]) {
44 | r = m;
45 | } else {
46 | l = m + 1;
47 | }
48 | }
49 | return l;
50 | }
51 |
52 | long long eliminate(int index) {
53 | int tmp = 0;
54 | if (map.count(a[index])) {
55 | tmp = map[a[index]];
56 | }
57 | long long d1 = index - binarySearchLeft(tmp + 1, index, index) + 1;
58 | long long d2 = binarySearchRight(index, n, index) - index + 1;
59 | return d1 * d2 - 1;
60 | }
61 |
62 | int main() {
63 | std::ios_base::sync_with_stdio(false);
64 | std::cin.tie(nullptr);
65 | std::cin >> n;
66 | for (int i = 1; i <= n; ++i) {
67 | std::cin >> a[i];
68 | }
69 | build();
70 | long long answer = n * (n - 1) / 2;
71 | for (int i = 1; i <= n; i++) {
72 | answer -= eliminate(i);
73 | map[a[i]] = i;
74 | }
75 | std::cout << answer << '\n';
76 | return 0;
77 | }
78 |
--------------------------------------------------------------------------------
/sem-2/solutions/4A.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | const int SIZE = 2'540'313;
6 |
7 | struct Cell {
8 | std::vector v;
9 |
10 | bool exists(int x) {
11 | return std::find(v.begin(), v.end(), x) != v.end();
12 | }
13 |
14 | void insert(int x) {
15 | if (!exists(x)) {
16 | v.push_back(x);
17 | }
18 | }
19 |
20 | void remove(int x) {
21 | auto it = std::find(v.begin(), v.end(), x);
22 | if (it != v.end()) {
23 | v.erase(it);
24 | }
25 | }
26 | };
27 |
28 | int h(int x) {
29 | return std::abs(x) % SIZE;
30 | }
31 |
32 | int main() {
33 | std::ios_base::sync_with_stdio(false);
34 | std::cin.tie(nullptr);
35 | std::vector a(SIZE);
36 | for (int i = 1; i <= SIZE; i++) {
37 | a.emplace_back();
38 | }
39 | std::string command;
40 | int value;
41 | while (std::cin >> command >> value) {
42 | if (command == "insert") {
43 | a[h(value)].insert(value);
44 | } else if (command == "delete") {
45 | a[h(value)].remove(value);
46 | } else {
47 | bool ans = a[h(value)].exists(value);
48 | if (ans) {
49 | std::cout << "true" << '\n';
50 | } else {
51 | std::cout << "false" << '\n';
52 | }
53 | }
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/sem-2/solutions/4D.java:
--------------------------------------------------------------------------------
1 | import java.io.BufferedReader;
2 | import java.io.IOException;
3 | import java.io.InputStreamReader;
4 | import java.util.HashSet;
5 | import java.util.Set;
6 |
7 | public class HashCode {
8 | public static void main(String[] args) throws IOException {
9 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
10 | int k = Integer.parseInt(reader.readLine());
11 | StringBuilder first = new StringBuilder("a".repeat(k));
12 | Set words = new HashSet<>(Set.of(first.toString()));
13 | for (int i = 0; i <= k - 2; i++) {
14 | StringBuilder sb = new StringBuilder(first);
15 | sb.setCharAt(i, 'b');
16 | sb.setCharAt(i + 1, 'B');
17 | words.add(sb.toString());
18 | }
19 | for (String s : words) {
20 | System.out.println(s);
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/sem-2/solutions/4E.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 |
6 | int p, q;
7 | std::random_device rd;
8 | std::mt19937 gen(rd());
9 |
10 | char random_char() {
11 | std::uniform_int_distribution<> dist(97, 122);
12 | return (char) dist(gen);
13 | }
14 |
15 | long long get_hash(const std::string &s, int cur) {
16 | if (cur == -1) {
17 | return 0;
18 | }
19 | return (get_hash(s, cur - 1) * p + s[cur]) % q;
20 | }
21 |
22 | int main() {
23 | std::ios_base::sync_with_stdio(false);
24 | std::cin.tie(nullptr);
25 | std::cout.tie(nullptr);
26 | std::cin >> p >> q;
27 | std::unordered_set set;
28 | std::vector> v;
29 | while (true) {
30 | std::string s;
31 | for (int i = 0; i < 100; i++) {
32 | s.push_back(random_char());
33 | }
34 | int cur_hash = get_hash(s, s.length() - 1);
35 | if (set.count(cur_hash) == 0) {
36 | set.insert(cur_hash);
37 | v.emplace_back(cur_hash, s);
38 | } else {
39 | bool flag = false;
40 | for (auto &i: v) {
41 | if (i.first == cur_hash && i.second != s) {
42 | std::cout << s << '\n' << i.second;
43 | flag = true;
44 | break;
45 | }
46 | }
47 | if (flag) {
48 | break;
49 | }
50 | }
51 | }
52 | return 0;
53 | }
54 |
--------------------------------------------------------------------------------
/sem-3/problems.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kryag/ct-itmo-algorithms/2019c7d4928bb04fc3e0b7c6fdd4453dbeb35f9a/sem-3/problems.pdf
--------------------------------------------------------------------------------
/sem-3/solutions/1A.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | struct node {
5 | int n;
6 | std::vector edges;
7 |
8 | explicit node(int n) {
9 | this->n = n;
10 | }
11 | };
12 |
13 | std::vector graph;
14 | std::vector mark;
15 |
16 | void dfs(int u) {
17 | mark[u] = true;
18 | for (int v: graph[u].edges) {
19 | if (!mark[v]) {
20 | std::cout << (u + 1) << " " << (v + 1) << '\n';
21 | dfs(v);
22 | }
23 | }
24 | }
25 |
26 | int main() {
27 | int n, m, u, v;
28 | std::cin >> n >> m;
29 | for (int i = 0; i < n; ++i) {
30 | graph.emplace_back(i);
31 | mark.emplace_back();
32 | }
33 | for (int i = 0; i < m; ++i) {
34 | std::cin >> u >> v;
35 | graph[u - 1].edges.emplace_back(v - 1);
36 | graph[v - 1].edges.emplace_back(u - 1);
37 | }
38 | dfs(0);
39 | }
40 |
--------------------------------------------------------------------------------
/sem-3/solutions/1B.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | struct node {
5 | int n;
6 | std::vector edges;
7 |
8 | explicit node(int n) {
9 | this->n = n;
10 | }
11 | };
12 |
13 | struct component {
14 | int size{};
15 | std::vector nodes;
16 | };
17 |
18 | std::vector graph;
19 | std::vector components;
20 | std::vector mark;
21 |
22 | void dfs(int u) {
23 | mark[u] = true;
24 | ++components.back().size;
25 | components.back().nodes.emplace_back(u);
26 | for (int v: graph[u].edges) {
27 | if (!mark[v]) {
28 | dfs(v);
29 | }
30 | }
31 | }
32 |
33 | int main() {
34 | std::ios_base::sync_with_stdio(false);
35 | std::cin.tie(nullptr);
36 | std::cout.tie(nullptr);
37 | int n, m;
38 | std::cin >> n >> m;
39 | for (int i = 0; i < n; ++i) {
40 | graph.emplace_back(i);
41 | mark.emplace_back();
42 | }
43 | int u, v;
44 | for (int i = 0; i < m; ++i) {
45 | std::cin >> u >> v;
46 | graph[u - 1].edges.emplace_back(v - 1);
47 | graph[v - 1].edges.emplace_back(u - 1);
48 | }
49 | for (int i = 0; i < n; ++i) {
50 | if (!mark[i]) {
51 | components.emplace_back();
52 | dfs(i);
53 | }
54 | }
55 | std::cout << components.size() << '\n';
56 | for (component const& c : components) {
57 | std::cout << c.size << '\n';
58 | for (int i : c.nodes) {
59 | std::cout << (i + 1) << " ";
60 | }
61 | std::cout << '\n';
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/sem-3/solutions/1C.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | struct node {
5 | int n;
6 | std::vector edges;
7 |
8 | explicit node(int n) {
9 | this->n = n;
10 | }
11 | };
12 |
13 | std::vector graph;
14 | std::vector main_nodes;
15 | std::vector mark;
16 |
17 | void dfs(int u) {
18 | mark[u] = true;
19 | main_nodes.back() = u;
20 | for (int v: graph[u].edges) {
21 | if (!mark[v]) {
22 | dfs(v);
23 | }
24 | }
25 | }
26 |
27 | int main() {
28 | std::ios_base::sync_with_stdio(false);
29 | std::cin.tie(nullptr);
30 | std::cout.tie(nullptr);
31 | int n, m;
32 | std::cin >> n >> m;
33 | for (int i = 0; i < n; ++i) {
34 | graph.emplace_back(i);
35 | mark.emplace_back();
36 | }
37 | int u, v;
38 | for (int i = 0; i < m; ++i) {
39 | std::cin >> u >> v;
40 | graph[u - 1].edges.emplace_back(v - 1);
41 | graph[v - 1].edges.emplace_back(u - 1);
42 | }
43 | for (int i = 0; i < n; ++i) {
44 | if (!mark[i]) {
45 | main_nodes.emplace_back();
46 | dfs(i);
47 | }
48 | }
49 | std::cout << main_nodes.size() - 1 << '\n';
50 | for (int i = 0; i < main_nodes.size() - 1; ++i) {
51 | std::cout << main_nodes[i] + 1 << " " << main_nodes[i + 1] + 1 << '\n';
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/sem-3/solutions/1D.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | std::vector> edges;
6 | std::vector from;
7 | std::vector mark;
8 |
9 | void dfs(int u, int p) {
10 | mark[u] = true;
11 | from[u] = p;
12 | for (int v: edges[u]) {
13 | if (mark[v] == 0) {
14 | dfs(v, u);
15 | } else if (mark[v] == 1) {
16 | std::vector res;
17 | int count = 0;
18 | while (u != v) {
19 | res.emplace_back(u);
20 | ++count;
21 | u = from[u];
22 | }
23 | res.emplace_back(v);
24 | ++count;
25 | std::cout << count << '\n';
26 | for (auto i = res.rbegin(); i != res.rend(); ++i) {
27 | std::cout << *i + 1 << " ";
28 | }
29 | exit(0);
30 | }
31 | }
32 | mark[u] = 2;
33 | }
34 |
35 | int main() {
36 | std::ios_base::sync_with_stdio(false);
37 | std::cin.tie(nullptr);
38 | std::cout.tie(nullptr);
39 | int n, m, i;
40 | std::cin >> n >> m;
41 | for (i = 0; i < n; ++i) {
42 | edges.emplace_back();
43 | from.emplace_back(-1);
44 | mark.emplace_back();
45 | }
46 | int u, v;
47 | for (i = 0; i < m; ++i) {
48 | std::cin >> u >> v;
49 | edges[u - 1].emplace_back(v - 1);
50 | }
51 | for (i = 0; i < n; ++i) {
52 | if (mark[i] == 0) {
53 | dfs(i, -1);
54 | }
55 | }
56 | std::cout << -1;
57 | }
58 |
--------------------------------------------------------------------------------
/sem-3/solutions/1E.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | struct node {
5 | int color{};
6 | std::vector edges;
7 | };
8 |
9 | std::vector graph;
10 | std::vector mark;
11 |
12 | void dfs(int u, int color) {
13 | mark[u] = true;
14 | graph[u].color = color;
15 | for (int v: graph[u].edges) {
16 | if (!mark[v]) {
17 | dfs(v, color == 1 ? 2 : 1);
18 | } else if (graph[v].color == color) {
19 | std::cout << -1;
20 | exit(0);
21 | }
22 | }
23 | }
24 |
25 | int main() {
26 | std::ios_base::sync_with_stdio(false);
27 | std::cin.tie(nullptr);
28 | std::cout.tie(nullptr);
29 | int n, m;
30 | std::cin >> n >> m;
31 | for (int i = 0; i < n; ++i) {
32 | graph.emplace_back();
33 | mark.emplace_back();
34 | }
35 | int u, v;
36 | for (int i = 0; i < m; ++i) {
37 | std::cin >> u >> v;
38 | graph[u - 1].edges.emplace_back(v - 1);
39 | graph[v - 1].edges.emplace_back(u - 1);
40 | }
41 | for (int i = 0; i < n; ++i) {
42 | if (!mark[i]) {
43 | dfs(i, 1);
44 | }
45 | }
46 | for (int i = 0; i < n; ++i) {
47 | std::cout << graph[i].color << " ";
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/sem-3/solutions/1F.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | struct node {
6 | int deg{};
7 | std::vector edges;
8 | };
9 |
10 | std::vector graph;
11 | std::vector mark;
12 |
13 | void dfs(int u) {
14 | mark[u] = 1;
15 | for (int v: graph[u].edges) {
16 | if (mark[v] == 0) {
17 | dfs(v);
18 | } else if (mark[v] == 1) {
19 | std::cout << -1;
20 | exit(0);
21 | }
22 | }
23 | mark[u] = 2;
24 | }
25 |
26 | int main() {
27 | std::ios_base::sync_with_stdio(false);
28 | std::cin.tie(nullptr);
29 | std::cout.tie(nullptr);
30 | int n, m;
31 | std::cin >> n >> m;
32 | for (int i = 0; i < n; ++i) {
33 | graph.emplace_back();
34 | mark.emplace_back();
35 | }
36 | int u, v;
37 | for (int i = 0; i < m; ++i) {
38 | std::cin >> u >> v;
39 | graph[u - 1].edges.emplace_back(v - 1);
40 | ++graph[v - 1].deg;
41 | }
42 | for (int i = 0; i < n; ++i) {
43 | if (mark[i] == 0) {
44 | dfs(i);
45 | }
46 | }
47 | std::queue q;
48 | for (int i = 0; i < n; ++i) {
49 | if (!graph[i].deg) {
50 | q.push(i);
51 | }
52 | }
53 | while (!q.empty()) {
54 | v = q.front();
55 | std::cout << v + 1 << " ";
56 | q.pop();
57 | for (int i: graph[v].edges) {
58 | if (!--graph[i].deg) {
59 | q.push(i);
60 | }
61 | }
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/sem-3/solutions/1G.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | std::vector> edges;
5 | std::vector mark;
6 |
7 | void dfs(int u) {
8 | mark[u] = 1;
9 | for (int v: edges[u]) {
10 | if (mark[v] == 0) {
11 | dfs(v);
12 | } else if (mark[v] == 1) {
13 | std::cout << "NO";
14 | exit(0);
15 | }
16 | }
17 | mark[u] = 2;
18 | }
19 |
20 | int main() {
21 | std::ios_base::sync_with_stdio(false);
22 | std::cin.tie(nullptr);
23 | std::cout.tie(nullptr);
24 | int n;
25 | std::cin >> n;
26 | for (int i = 0; i < n; ++i) {
27 | edges.emplace_back();
28 | mark.emplace_back();
29 | }
30 | int u, v;
31 | for (int i = 1; i < n; ++i) {
32 | for (int j = 0; j < n - i; ++j) {
33 | char c;
34 | std::cin >> c;
35 | if (c == 'R') {
36 | edges[i + j].emplace_back(i - 1);
37 | } else {
38 | edges[i - 1].emplace_back(i + j);
39 | }
40 | }
41 | }
42 | for (int i = 0; i < n; ++i) {
43 | if (mark[i] == 0) {
44 | dfs(i);
45 | }
46 | }
47 | std::cout << "YES";
48 | }
49 |
--------------------------------------------------------------------------------
/sem-3/solutions/1I.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 |
6 | struct node {
7 | int min_value = INT32_MAX, deg = 0;
8 | std::vector> edges;
9 | };
10 |
11 | int main() {
12 | std::ios_base::sync_with_stdio(false);
13 | std::cin.tie(nullptr);
14 | std::cout.tie(nullptr);
15 | int n, m, s, t;
16 | std::cin >> n >> m >> s >> t;
17 | std::vector graph(n);
18 | --s;
19 | --t;
20 | int u, v, w;
21 | for (int i = 0; i < m; ++i) {
22 | std::cin >> u >> v >> w;
23 | graph[u - 1].edges.emplace_back(v - 1, w);
24 | ++graph[v - 1].deg;
25 | }
26 | std::queue q;
27 | std::vector top_sort;
28 | for (int i = 0; i < n; ++i) {
29 | if (!graph[i].deg) {
30 | q.push(i);
31 | }
32 | }
33 | while (!q.empty()) {
34 | v = q.front();
35 | top_sort.emplace_back(v);
36 | q.pop();
37 | for (auto const& e: graph[v].edges) {
38 | if (!--graph[e.first].deg) {
39 | q.push(e.first);
40 | }
41 | }
42 | }
43 | auto start = std::find(top_sort.begin(), top_sort.end(), s);
44 | auto end = std::find(top_sort.begin(), top_sort.end(), t);
45 | graph[*start].min_value = 0;
46 | for (; start < end; ++start) {
47 | if (graph[*start].min_value == INT32_MAX) continue;
48 | for (auto const& e: graph[*start].edges) {
49 | graph[e.first].min_value = std::min(graph[e.first].min_value, graph[*start].min_value + e.second);
50 | }
51 | }
52 | if (graph[*end].min_value == INT32_MAX) {
53 | std::cout << "Unreachable";
54 | return 0;
55 | }
56 | std::cout << graph[*end].min_value;
57 | }
58 |
--------------------------------------------------------------------------------
/sem-3/solutions/1J.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | struct node {
5 | int time;
6 | std::vector edges;
7 |
8 | explicit node(int time) {
9 | this->time = time;
10 | }
11 | };
12 |
13 | std::vector graph;
14 | std::vector mark;
15 | std::vector result;
16 | long long T;
17 |
18 | void dfs(int u) {
19 | mark[u] = true;
20 | for (int v: graph[u].edges) {
21 | if (!mark[v]) {
22 | dfs(v);
23 | }
24 | }
25 | T += graph[u].time;
26 | result.emplace_back(u);
27 | }
28 |
29 | int main() {
30 | int n, t, count;
31 | std::cin >> n;
32 | for (int i = 0; i < n; ++i) {
33 | std::cin >> t;
34 | graph.emplace_back(t);
35 | mark.emplace_back();
36 | }
37 | for (int i = 0; i < n; ++i) {
38 | std::cin >> count;
39 | while (count--) {
40 | std::cin >> t;
41 | graph[i].edges.emplace_back(t - 1);
42 | }
43 | }
44 | dfs(0);
45 | std::cout << T << " " << result.size() << '\n';
46 | for (int v: result) {
47 | std::cout << v + 1 << " ";
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/sem-3/solutions/1K.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | struct node {
6 | int deg{};
7 | std::vector edges;
8 | };
9 |
10 | int main() {
11 | std::ios_base::sync_with_stdio(false);
12 | std::cin.tie(nullptr);
13 | std::cout.tie(nullptr);
14 | int n, m;
15 | std::cin >> n >> m;
16 | std::vector graph(n);
17 | int u, v;
18 | for (int i = 0; i < m; ++i) {
19 | std::cin >> u >> v;
20 | graph[u - 1].edges.emplace_back(v - 1);
21 | ++graph[v - 1].deg;
22 | }
23 | for (int i = 0; i < n; ++i) {
24 | std::cin >> u;
25 | --u;
26 | if (graph[u].deg != 0) {
27 | std::cout << "NO";
28 | return 0;
29 | }
30 | for (int e: graph[u].edges) {
31 | --graph[e].deg;
32 | }
33 | }
34 | std::cout << "YES";
35 | }
36 |
--------------------------------------------------------------------------------
/sem-3/solutions/1L.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | struct node {
6 | int deg{};
7 | std::vector edges;
8 | };
9 |
10 | int main() {
11 | std::ios_base::sync_with_stdio(false);
12 | std::cin.tie(nullptr);
13 | std::cout.tie(nullptr);
14 | int n, count, v;
15 | std::cin >> n;
16 | std::vector graph(n);
17 | for (int i = 0; i < n; ++i) {
18 | std::cin >> count;
19 | while (count--) {
20 | std::cin >> v;
21 | graph[i].edges.emplace_back(v - 1);
22 | ++graph[v - 1].deg;
23 | }
24 | }
25 | std::priority_queue q;
26 | std::vector top_sort;
27 | for (int i = 0; i < n; ++i) {
28 | if (!graph[i].deg) {
29 | q.push(i);
30 | }
31 | }
32 | while (!q.empty()) {
33 | v = q.top();
34 | top_sort.emplace_back(v);
35 | q.pop();
36 | for (int i: graph[v].edges) {
37 | if (!--graph[i].deg) {
38 | q.push(i);
39 | }
40 | }
41 | }
42 | for (auto i = top_sort.rbegin(); i != top_sort.rend(); ++i) {
43 | std::cout << *i + 1 << " ";
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/sem-3/solutions/2A.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | struct node {
6 | int comp{};
7 | std::vector edges;
8 | std::vector reverse_edges;
9 | };
10 |
11 | std::vector graph;
12 | std::vector order;
13 | std::vector mark;
14 |
15 | void dfs(int u) {
16 | mark[u] = true;
17 | for (int v: graph[u].edges) {
18 | if (!mark[v]) {
19 | dfs(v);
20 | }
21 | }
22 | order.emplace_back(u);
23 | }
24 |
25 | void reverse_dfs(int u, int comp) {
26 | mark[u] = true;
27 | graph[u].comp = comp;
28 | for (int v: graph[u].reverse_edges) {
29 | if (!mark[v]) {
30 | reverse_dfs(v, comp);
31 | }
32 | }
33 | }
34 |
35 | int main() {
36 | std::ios_base::sync_with_stdio(false);
37 | std::cin.tie(nullptr);
38 | std::cout.tie(nullptr);
39 |
40 | int n, m, u, v;
41 | std::cin >> n >> m;
42 | for (int i = 0; i < n; ++i) {
43 | graph.emplace_back();
44 | mark.emplace_back();
45 | }
46 | for (int i = 0; i < m; ++i) {
47 | std::cin >> u >> v;
48 | --u; --v;
49 | graph[u].edges.emplace_back(v);
50 | graph[v].reverse_edges.emplace_back(u);
51 | }
52 |
53 | for (int i = 0; i < n; ++i) {
54 | if (!mark[i]) {
55 | dfs(i);
56 | }
57 | }
58 |
59 | std::reverse(order.begin(), order.end());
60 | std::fill(mark.begin(), mark.end(), false);
61 |
62 | int comp = 0;
63 | for (int i: order) {
64 | if (!mark[i]) {
65 | ++comp;
66 | reverse_dfs(i, comp);
67 | }
68 | }
69 |
70 | std::cout << comp << '\n';
71 | for (int i = 0; i < n; ++i) {
72 | std::cout << graph[i].comp << " ";
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/sem-3/solutions/2B.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | struct node {
6 | std::vector edges;
7 | std::vector reverse_edges;
8 | };
9 |
10 | std::vector graph;
11 | std::vector order;
12 | std::vector mark;
13 | int count;
14 |
15 | void dfs(int u) {
16 | mark[u] = true;
17 | for (int v: graph[u].edges) {
18 | if (!mark[v]) {
19 | dfs(v);
20 | }
21 | }
22 | order.emplace_back(u);
23 | }
24 |
25 | void reverse_dfs(int u) {
26 | mark[u] = true;
27 | ++count;
28 | for (int v: graph[u].reverse_edges) {
29 | if (!mark[v]) {
30 | reverse_dfs(v);
31 | }
32 | }
33 | }
34 |
35 | int main() {
36 | std::ios_base::sync_with_stdio(false);
37 | std::cin.tie(nullptr);
38 | std::cout.tie(nullptr);
39 |
40 | int n, m, u, v;
41 | std::cin >> n >> m;
42 | for (int i = 0; i < n; ++i) {
43 | graph.emplace_back();
44 | mark.emplace_back();
45 | }
46 | for (int i = 0; i < m; ++i) {
47 | std::cin >> u >> v;
48 | if (u == v) continue;
49 | --u; --v;
50 | graph[v].edges.emplace_back(u);
51 | graph[u].reverse_edges.emplace_back(v);
52 | }
53 |
54 | for (int i = 0; i < n; ++i) {
55 | if (!mark[i]) {
56 | dfs(i);
57 | }
58 | }
59 |
60 | std::reverse(order.begin(), order.end());
61 | std::fill(mark.begin(), mark.end(), false);
62 |
63 | int res = 0;
64 | for (int i: order) {
65 | if (!mark[i]) {
66 | ++res;
67 | count = 0;
68 | reverse_dfs(i);
69 | res += count > 1;
70 | }
71 | }
72 |
73 | std::cout << res << '\n';
74 | }
75 |
--------------------------------------------------------------------------------
/sem-3/solutions/2C.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | const int UNINITIALIZED = -1, CYCLE = -2;
6 |
7 | struct node {
8 | int a{};
9 | long long dp{};
10 | std::vector edges;
11 | };
12 |
13 | std::vector graph;
14 | bool has_cycle;
15 |
16 | long long dfs(int u, int cur_max) {
17 | if (graph[u].a > cur_max) {
18 | return 0;
19 | }
20 | if (graph[u].dp == CYCLE) {
21 | has_cycle = true;
22 | return 0;
23 | }
24 | if (graph[u].dp != UNINITIALIZED) {
25 | return graph[u].dp;
26 | }
27 | graph[u].dp = CYCLE;
28 | long long max_len = 0;
29 | for (int v: graph[u].edges) {
30 | max_len = std::max(max_len, dfs(v, cur_max));
31 | }
32 | graph[u].dp = max_len + 1;
33 | return graph[u].dp;
34 | }
35 |
36 | int main() {
37 | std::ios_base::sync_with_stdio(false);
38 | std::cin.tie(nullptr);
39 | std::cout.tie(nullptr);
40 |
41 | long long n, m, k;
42 | int a, max_a, u, v;
43 | std::cin >> n >> m >> k;
44 | graph.resize(n);
45 | for (int i = 0; i < n; ++i) {
46 | std::cin >> a;
47 | graph[i].a = a;
48 | max_a = std::max(max_a, a);
49 | }
50 | for (int i = 0; i < m; ++i) {
51 | std::cin >> u >> v;
52 | graph[u - 1].edges.emplace_back(v - 1);
53 | }
54 |
55 | int left = 1, right = max_a;
56 |
57 | label:
58 | while (left <= right) {
59 | int mid = (left + right) / 2;
60 | for (int i = 0; i < n; ++i) {
61 | graph[i].dp = UNINITIALIZED;
62 | }
63 | has_cycle = false;
64 | for (int i = 0; i < n; ++i) {
65 | if (dfs(i, mid) >= k || has_cycle) {
66 | right = mid - 1;
67 | goto label;
68 | }
69 | }
70 | left = mid + 1;
71 | }
72 |
73 | std::cout << (right == max_a ? -1 : right + 1);
74 | }
75 |
--------------------------------------------------------------------------------
/sem-3/solutions/2D.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | struct node {
6 | int comp{};
7 | std::vector> edges;
8 | std::vector> reverse_edges;
9 | };
10 |
11 | std::vector graph;
12 | std::vector order;
13 | std::vector reachable;
14 | std::vector mark;
15 |
16 | void dfs1(int u) {
17 | reachable[u] = true;
18 | for (auto const& v: graph[u].edges) {
19 | if (!reachable[v.first]) {
20 | dfs1(v.first);
21 | }
22 | }
23 | }
24 |
25 | void dfs2(int u) {
26 | mark[u] = true;
27 | for (auto const& v: graph[u].edges) {
28 | if (!v.second) continue;
29 | if (!mark[v.first]) {
30 | dfs2(v.first);
31 | }
32 | }
33 | order.emplace_back(u);
34 | }
35 |
36 | void reverse_dfs(int u, int comp) {
37 | mark[u] = true;
38 | graph[u].comp = comp;
39 | for (auto const& v: graph[u].reverse_edges) {
40 | if (!v.second) continue;
41 | if (!mark[v.first]) {
42 | reverse_dfs(v.first, comp);
43 | }
44 | }
45 | }
46 |
47 | int main() {
48 | std::ios_base::sync_with_stdio(false);
49 | std::cin.tie(nullptr);
50 | std::cout.tie(nullptr);
51 |
52 | int n, m, u, v, t;
53 | std::cin >> n >> m;
54 |
55 | graph.resize(n);
56 | mark.resize(n);
57 | reachable.resize(n);
58 |
59 | for (int i = 0; i < m; ++i) {
60 | std::cin >> u >> v >> t;
61 | --u; --v, --t;
62 | graph[u].edges.emplace_back(v, t);
63 | graph[v].reverse_edges.emplace_back(u, t);
64 | }
65 |
66 | dfs1(0);
67 | for (int i = 0; i < n; ++i) {
68 | if (reachable[i] && !mark[i]) {
69 | dfs2(i);
70 | }
71 | }
72 |
73 | std::reverse(order.begin(), order.end());
74 | std::fill(mark.begin(), mark.end(), false);
75 |
76 | int comp = 0;
77 | for (int i: order) {
78 | if (!mark[i]) {
79 | ++comp;
80 | reverse_dfs(i, comp);
81 | }
82 | }
83 |
84 | for (int i: order) {
85 | for (auto const& j: graph[i].edges) {
86 | if (graph[i].comp == graph[j.first].comp) continue;
87 | if (j.second) {
88 | std::cout << "YES";
89 | return 0;
90 | }
91 | }
92 | }
93 | std::cout << "NO";
94 | }
95 |
--------------------------------------------------------------------------------
/sem-3/solutions/2F.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include |