Advertisement
Nik_Perepelov

Доп контест Даше

Nov 17th, 2021 (edited)
740
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.99 KB | None | 0 0
  1. // 1 задача
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. vector<int> root;
  8. vector<int> sizes;
  9. vector<vector<int>> cat_per_cage;
  10.  
  11. void set_dsu(int n) {
  12.     root.resize(n);
  13.     sizes.resize(n, 1);
  14.     cat_per_cage.resize(n);
  15.     for (int i = 0; i < n; i++) {
  16.         root[i] = i;
  17.         cat_per_cage[i].emplace_back(i);
  18.     }
  19. }
  20.  
  21. int find_root(int v) {
  22.     if (root[v] == v)
  23.         return v;
  24.     return root[v] = find_root(root[v]);
  25. }
  26.  
  27. void union_sets(int v, int u) {
  28.     v = find_root(v);
  29.     u = find_root(u);
  30.     if (v != u) {
  31.         if (sizes[v] < sizes[u])
  32.             swap(v, u);
  33.  
  34.         cat_per_cage[v].resize(cat_per_cage[v].size() + cat_per_cage[u].size());
  35.         for (int i = 0; i < cat_per_cage[u].size(); i++){
  36.             cat_per_cage[v][cat_per_cage[v].size() - cat_per_cage[u].size() + i] = cat_per_cage[u][i];
  37.         }
  38.         cat_per_cage[u].clear();
  39.         root[u] = v;
  40.         sizes[v] += sizes[u];
  41.     }
  42. }
  43.  
  44. void print_cats(){
  45.     int final_root = find_root(0);
  46.     for (int i = 0; i < cat_per_cage[final_root].size(); i++){
  47.         cout << cat_per_cage[final_root][i] + 1 << ' ';
  48.     }
  49. }
  50.  
  51.  
  52. int main() {
  53.     int n, v1, v2;
  54.     cin >> n;
  55.     set_dsu(n);
  56.     for (int i = 0; i < n - 1; i++) {
  57.         cin >> v1 >> v2;
  58.         union_sets(--v1, --v2);
  59.     }
  60.     print_cats();
  61.     return 0;
  62. }
  63.  
  64. // 2 задача
  65. #include <iostream>
  66. #include <vector>
  67.  
  68. using namespace std;
  69.  
  70. struct command {
  71.     int type;
  72.     int v1;
  73.     int v2;
  74. };
  75.  
  76. int n, k;
  77. vector<int> root;
  78. vector<int> sizes;
  79. vector<vector<int>> cat_per_cage;
  80. vector<bool> ans;
  81.  
  82. void set_dsu(int n) {
  83.     root = vector<int>(n);
  84.     sizes = vector<int>(n, 1);
  85.     cat_per_cage = vector<vector<int>>(n);
  86.     for (int i = 0; i < n; i++) {
  87.         root[i] = i;
  88.         cat_per_cage[i].emplace_back(i);
  89.     }
  90. }
  91.  
  92. int find_root(int v) {
  93.     if (root[v] == v)
  94.         return v;
  95.     return root[v] = find_root(root[v]);
  96. }
  97.  
  98. void union_sets(int v, int u) {
  99.     v = find_root(v);
  100.     u = find_root(u);
  101.     if (v != u) {
  102.         if (sizes[v] < sizes[u]) {
  103.             int tmp = v;
  104.             v = u;
  105.             u = tmp;
  106.         }
  107.  
  108.         cat_per_cage[v].resize(cat_per_cage[v].size() + cat_per_cage[u].size());
  109.         for (int i = 0; i < cat_per_cage[u].size(); i++){
  110.             cat_per_cage[v][cat_per_cage[v].size() - cat_per_cage[u].size() + i] = cat_per_cage[u][i];
  111.         }
  112.         cat_per_cage[u].clear();
  113.         root[u] = v;
  114.         sizes[v] += sizes[u];
  115.     }
  116. }
  117.  
  118. void solve() {
  119.     int m;
  120.     cin >> m >> k;
  121.     if (k == 0)
  122.         exit(0);
  123.     vector<command> commands(k);
  124.     for (int i = 0; i < 2 * m; i++) {
  125.         int trash;
  126.         cin >> trash;
  127.     }
  128.     for (int i = 0; i < k; i++) {
  129.         string command_type;
  130.         cin >> command_type;
  131.         if (command_type == "cut") {
  132.             commands[i].type = 2;
  133.         } else {
  134.             commands[i].type = 1;
  135.         }
  136.         int a, b;
  137.         cin >> a >> b;
  138.         b--;
  139.         commands[i].v1 = a - 1;
  140.         commands[i].v2 = b;
  141.     }
  142.  
  143.  
  144.     for (int i = k - 1; i >= 0; i--) {
  145.         if (commands[i].type == 1)
  146.             ans.push_back(find_root(commands[i].v1) == find_root(commands[i].v2));
  147.         else
  148.             union_sets(commands[i].v1, commands[i].v2);
  149.     }
  150.  
  151.     for (int u = ans.size() - 1; u >= 0; u--) {
  152.         if (ans[u])
  153.             cout << "YES\n";
  154.         else
  155.             cout << "NO\n";
  156.     }
  157. }
  158.  
  159.  
  160. int main() {
  161.     cin >> n;
  162.     set_dsu(n);
  163.     solve();
  164.     return 0;
  165. }
  166. // 3 задача
  167.  
  168. #include <iostream>
  169. #include <vector>
  170.  
  171. using namespace std;
  172.  
  173. int n, m;
  174. vector<vector<int>> g;
  175. vector<int> stroi;
  176. vector<int> state;
  177. int flag = false;
  178.  
  179. void dfs(int v, int parent) {
  180.     state[v] = 1;
  181.     for (auto &i: g[v]) {
  182.         if (state[i] == 1) {
  183.             flag = true;
  184.             return;
  185.         }
  186.         if (state[i] == 0) {
  187.             dfs(i, v);
  188.             if (flag)
  189.                 return;
  190.         }
  191.     }
  192.     stroi.push_back(v);
  193.     state[v] = 2;
  194. }
  195.  
  196. void input() {
  197.     cin >> n >> m;
  198.  
  199.     state.resize(n);
  200.     g.resize(n);
  201.  
  202.     for (int i = 0; i < m; i++) {
  203.         int fr, to;
  204.         cin >> fr >> to;
  205.         fr--;
  206.         to--;
  207.         g[fr].emplace_back(to);
  208.     }
  209. }
  210.  
  211. void solve() {
  212.     for (int i = 0; i < n; i++) {
  213.         if (!state[i]) {
  214.             dfs(i, -1);
  215.             if (flag) {
  216.                 cout << "No";
  217.                 return;
  218.             }
  219.         }
  220.     }
  221. }
  222.  
  223. void print() {
  224.     cout << "Yes\n";
  225.     for (int i = 0; i < n; i++) {
  226.         cout << stroi[n - 1 - i] + 1 << ' ';
  227.     }
  228. }
  229.  
  230.  
  231. int main() {
  232.  
  233.     input();
  234.     solve();
  235.     if (flag)
  236.         return 0;
  237.     print();
  238.  
  239.  
  240.     return 0;
  241. }
  242.  
  243. // 4 задача
  244. #include <iostream>
  245. #include <vector>
  246.  
  247. using namespace std;
  248.  
  249. struct command {
  250.     int type;
  251.     int v1;
  252.     int v2;
  253. };
  254.  
  255. int n, k;
  256. vector<int> root;
  257. vector<int> sizes;
  258. vector<vector<int>> cat_per_cage;
  259. vector<bool> ans;
  260.  
  261. void set_dsu(int n) {
  262.     root = vector<int>(n);
  263.     sizes = vector<int>(n, 1);
  264.     k = 0;
  265.     cat_per_cage = vector<vector<int>>(n);
  266.     for (int i = 0; i < n; i++) {
  267.         root[i] = i;
  268.         cat_per_cage[i].emplace_back(i);
  269.     }
  270. }
  271.  
  272. int find_root(int v) {
  273.     if (root[v] == v)
  274.         return v;
  275.     return root[v] = find_root(root[v]);
  276. }
  277.  
  278. void union_sets(int v, int u) {
  279.     v = find_root(v);
  280.     u = find_root(u);
  281.     if (v != u) {
  282.         if (sizes[v] < sizes[u]) {
  283.             int tmp = v;
  284.             v = u;
  285.             u = tmp;
  286.         }
  287.  
  288.         cat_per_cage[v].resize(cat_per_cage[v].size() + cat_per_cage[u].size());
  289.         for (int i = 0; i < cat_per_cage[u].size(); i++){
  290.             cat_per_cage[v][cat_per_cage[v].size() - cat_per_cage[u].size() + i] = cat_per_cage[u][i];
  291.         }
  292.         cat_per_cage[u].clear();
  293.         root[u] = v;
  294.         sizes[v] += sizes[u];
  295.         k++;
  296.     }
  297. }
  298.  
  299. void solve() {
  300.     for (int i = 0; i < n; i++){
  301.         int v;
  302.         cin >> v;
  303.         union_sets(i, v - 1);
  304.     }
  305.     cout << n - k;
  306. }
  307.  
  308.  
  309. int main() {
  310.     cin >> n;
  311.     set_dsu(n);
  312.     solve();
  313.     return 0;
  314. }
  315. // 7 задача
  316. #include <iostream>
  317. #include <vector>
  318.  
  319. using namespace std;
  320.  
  321. struct route {
  322.     int from;
  323.     int to;
  324.     int from_time;
  325.     int to_time;
  326.  
  327.     route(int _from, int _to, int _from_time, int _to_time) {
  328.         from = _from;
  329.         to = _to;
  330.         from_time = _from_time;
  331.         to_time = _to_time;
  332.     }
  333. };
  334.  
  335. int n, m, finish, k;
  336. vector<vector<route>> graph;
  337. vector<int> used;
  338. vector<int> village_time;
  339.  
  340. void dijkstra() {
  341.     for (;;) {
  342.         int min_village = -2;
  343.         int min_time = INT_MAX;
  344.         for (int i = 0; i < n; i++) {
  345.             if (used[i] == 0 && village_time[i] < min_time) {
  346.                 min_village = i;
  347.                 min_time = village_time[i];
  348.             }
  349.         }
  350.         if (min_village == -2)
  351.             return;
  352.         used[min_village] = 1;
  353.         for (int i = 0; i < graph[min_village].size(); i++){
  354.             if (village_time[min_village] <= graph[min_village][i].from_time && graph[min_village][i].to_time < village_time[graph[min_village][i].to])
  355.                 village_time[graph[min_village][i].to] = graph[min_village][i].to_time;
  356.         }
  357.     }
  358. }
  359.  
  360. void input(){
  361.     cin >> n >> finish >> m;
  362.     finish--;
  363.  
  364.     graph = vector<vector<route>>(n);
  365.     used = vector<int>(n);
  366.     village_time = vector<int>(n, INT_MAX);
  367.  
  368.     for (int i = 0; i < m; i++) {
  369.         cin >> k;
  370.  
  371.         int from, to, old_time, time;
  372.         for (int j = 0; j < k; j++) {
  373.             cin >> to >> time;
  374.             to--;
  375.             if (j > 0) {
  376.                 graph[from].push_back(route(from, to, old_time, time));
  377.             }
  378.             from = to;
  379.             old_time = time;
  380.         }
  381.     }
  382. }
  383.  
  384. void solve(){
  385.     village_time[0] = 0;
  386.  
  387.     dijkstra();
  388. }
  389.  
  390. void print(){
  391.     if (village_time[finish] < INT_MAX)
  392.         cout << village_time[finish];
  393.     else
  394.         cout << -1;
  395. }
  396.  
  397. int main() {
  398.     input();
  399.     solve();
  400.     print();
  401.  
  402.     return 0;
  403. }
  404. // 8 задача
  405. #include <iostream>
  406. #include <vector>
  407.  
  408. using namespace std;
  409.  
  410. struct route {
  411.     int from;
  412.     int to;
  413.     int from_time;
  414.     int to_time;
  415.  
  416.     route(int _from, int _to, int _from_time, int _to_time) {
  417.         from = _from;
  418.         to = _to;
  419.         from_time = _from_time;
  420.         to_time = _to_time;
  421.     }
  422. };
  423.  
  424. int n, m, finish, start;
  425. vector<vector<route>> graph;
  426. vector<int> used;
  427. vector<int> village_time;
  428.  
  429. void dijkstra() {
  430.     for (;;) {
  431.         int min_village = -2;
  432.         int min_time = INT_MAX;
  433.         for (int i = 0; i < n; i++) {
  434.             if (used[i] == 0 && village_time[i] < min_time) {
  435.                 min_village = i;
  436.                 min_time = village_time[i];
  437.             }
  438.         }
  439.         if (min_village == -2)
  440.             return;
  441.         used[min_village] = 1;
  442.         for (int i = 0; i < graph[min_village].size(); i++){
  443.             if (village_time[min_village] <= graph[min_village][i].from_time && graph[min_village][i].to_time < village_time[graph[min_village][i].to])
  444.                 village_time[graph[min_village][i].to] = graph[min_village][i].to_time;
  445.         }
  446.     }
  447. }
  448.  
  449. void input(){
  450.     cin >> n >> start >> finish >> m;
  451.     start= start-1;
  452.     finish = finish - 1;
  453.  
  454.     graph = vector<vector<route>>(n);
  455.     used = vector<int>(n);
  456.     village_time = vector<int>(n, INT_MAX);
  457.  
  458.     for (int i = 0; i < m; i++) {
  459.         int from, departing_time_curr, to, arrival_time_curr;
  460.         cin >> from >> departing_time_curr >> to >> arrival_time_curr;
  461.         from--;
  462.         to--;
  463.         graph[from].push_back(route(from, to, departing_time_curr, arrival_time_curr));
  464.     }
  465. }
  466.  
  467. void solve(){
  468.     village_time[start] = 0;
  469.  
  470.     dijkstra();
  471. }
  472.  
  473. void print(){
  474.     if (village_time[finish] < INT_MAX)
  475.         cout << village_time[finish];
  476.     else
  477.         cout << -1;
  478. }
  479.  
  480. int main() {
  481.     input();
  482.     solve();
  483.     print();
  484.  
  485.     return 0;
  486. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement