Nik_Perepelov

9 контест Надару

Nov 17th, 2021 (edited)
321
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.99 KB | None | 0 0
  1. // 1 task
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7.  
  8. int n, m, a, b;
  9. int free_cell_counter = 0;
  10. vector<bool> used;
  11.  
  12. vector<vector<int>> graph;
  13. vector<int> match;
  14.  
  15. bool dfs(int v) {
  16.     if (used[v])
  17.         return false;
  18.     used[v] = true;
  19.     for (int i = 0; i < graph[v].size(); i++) {
  20.         int to = graph[v][i];
  21.         if (match[to] == -1 || dfs(match[to])) {
  22.             match[to] = v;
  23.             return true;
  24.         }
  25.     }
  26.     return false;
  27. }
  28.  
  29. void handle_simbols(vector<string> &s, int i, int j){
  30.     if (i && (s[i - 1][j] == '*'))
  31.         graph[i * m + j].push_back((i - 1) * m + j);
  32.  
  33.     if ((i < n - 1) && (s[i + 1][j] == '*'))
  34.         graph[i * m + j].push_back((i + 1) * m + j);
  35.  
  36.     if (j && (s[i][j - 1] == '*'))
  37.         graph[i * m + j].push_back(i * m + j - 1);
  38.  
  39.     if ((j < m - 1) && (s[i][j + 1] == '*'))
  40.         graph[i * m + j].push_back(i * m + j + 1);
  41. }
  42.  
  43. vector<string> s;
  44. void init() {
  45.  
  46.     s.resize(n);
  47.     for (int i = 0; i < s.size(); i++) {
  48.         cin >> s[i];
  49.     }
  50.  
  51.     int nm = n*m;
  52.  
  53.     match.assign(nm, -1);
  54.     graph = vector<vector<int>>(nm);
  55.     used.resize(nm);
  56.     match.resize(nm);
  57.     for (int i = 0; i < n; i++) {
  58.         for (int j = 0; j < m; j++) {
  59.             if (s[i][j] == '.')
  60.                 continue;
  61.             free_cell_counter++;
  62.             if ((i + j) % 2)
  63.                 continue;
  64.  
  65.  
  66.             handle_simbols(s, i, j);
  67.         }
  68.     }
  69. }
  70.  
  71.  
  72.  
  73.  
  74.  
  75. int main() {
  76.     cin >> n >> m >> a >> b;
  77.  
  78.     init();
  79.  
  80.     if (2 * b <= a) {
  81.         cout << free_cell_counter * b;
  82.         return 0;
  83.     }
  84.  
  85.  
  86.     for (int i = 0; i < n; i++) {
  87.         for (int j = 0; j < m; j++) {
  88.             if ((i + j) % 2 == 1)
  89.                 continue;
  90.             used.assign(n * m, false);
  91.             dfs(i * m + j);
  92.         }
  93.     }
  94.     int answer = 0;
  95.     for (int i = 0; i < n * m; i++) {
  96.         if (match[i] != -1)
  97.             answer++;
  98.     }
  99.  
  100.     cout << answer * a + (free_cell_counter - 2 * answer) * b;
  101.  
  102.     return 0;
  103. }
  104.  
  105. // 2 task
  106. #include <iostream>
  107. #include <vector>
  108.  
  109. using namespace std;
  110.  
  111.  
  112. int n, m;
  113. int free_cell_counter = 0;
  114. vector<bool> used;
  115.  
  116. vector<vector<int>> graph;
  117. vector<int> match;
  118. string sister_name;
  119.  
  120. bool dfs(int v) {
  121.     if (used[v])
  122.         return false;
  123.     used[v] = true;
  124.     for (int i = 0; i < graph[v].size(); i++) {
  125.         int to = graph[v][i];
  126.         if (match[to] == -1 || dfs(match[to])) {
  127.             match[to] = v;
  128.             return true;
  129.         }
  130.     }
  131.     return false;
  132. }
  133.  
  134. void handle_simbols(vector<string> &s, int i, int j) {
  135.     if (i && (s[i - 1][j] == '*'))
  136.         graph[i * m + j].push_back((i - 1) * m + j);
  137.  
  138.     if ((i < n - 1) && (s[i + 1][j] == '*'))
  139.         graph[i * m + j].push_back((i + 1) * m + j);
  140.  
  141.     if (j && (s[i][j - 1] == '*'))
  142.         graph[i * m + j].push_back(i * m + j - 1);
  143.  
  144.     if ((j < m - 1) && (s[i][j + 1] == '*'))
  145.         graph[i * m + j].push_back(i * m + j + 1);
  146. }
  147.  
  148. vector<string> s;
  149.  
  150. void init() {
  151.  
  152.  
  153.     match.assign(n, -1);
  154.     graph = vector<vector<int>>(n);
  155.     used.resize(n);
  156.     match.resize(n);
  157.     for (int i = 0; i < sister_name.size(); i++) {
  158.         for (int j = 0; j < n; j++) {
  159.             for (int k = 0; k < 6; k++) {
  160.                 if (sister_name[i] == s[j][k]) {
  161.                     graph[j].push_back(i);
  162.                 }
  163.             }
  164.         }
  165.     }
  166. }
  167.  
  168.  
  169. int main() {
  170.     cin >> n >> sister_name;
  171.     if (sister_name.size() > n) {
  172.         cout << "NO";
  173.         return 0;
  174.     }
  175.     s.resize(n);
  176.     for (int i = 0; i < s.size(); i++) {
  177.         cin >> s[i];
  178.     }
  179.  
  180.     init();
  181.  
  182.  
  183.     for (int i = 0; i < n; i++) {
  184.         used.assign(n, false);
  185.         dfs(i);
  186.  
  187.     }
  188.     for (int i = 0; i < n; i++) {
  189.         if (match[i] == -1) {
  190.             cout << "NO";
  191.             return 0;
  192.         }
  193.     }
  194.  
  195.     cout << "YES" << endl;
  196.     for (int i = 0; i < match.size(); i++) {
  197.         cout << match[i] + 1 << ' ';
  198.     }
  199.  
  200.     return 0;
  201. }
Add Comment
Please, Sign In to add comment