Alex_tz307

margi

Jan 8th, 2022
1,343
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.61 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. ifstream fin("margi.in");
  6. ofstream fout("margi.out");
  7.  
  8. vector < string > a;
  9. vector < vector < int > > dp;
  10. vector < int > A, B;
  11.  
  12. int calc_sum(int x1, int y1, int x2, int y2) {
  13.     return dp[x2][y2] - dp[x2][y1 - 1] - dp[x1 - 1][y2] + dp[x1 - 1][y1 - 1];
  14. }
  15.  
  16. int solveA(int x, int y, int dim, vector < int > &rez) {
  17.     if(dim == 1)
  18.         return 0;
  19.     int new_dim = dim >> 1;
  20.     vector < int > v(5, -1);
  21.     vector < vector < int > > cand(5);
  22.     v[1] = solveA(x, y, new_dim, cand[1]);
  23.     v[1] += calc_sum(x, y, x + new_dim - 1, y + new_dim - 1);
  24.     v[2] = solveA(x, y + new_dim, new_dim, cand[2]);
  25.     v[2] += calc_sum(x, y + new_dim, x + new_dim - 1, y + 2 * new_dim - 1);
  26.     v[3] = solveA(x + new_dim, y, new_dim, cand[3]);
  27.     v[3] += calc_sum(x + new_dim, y, x + 2 * new_dim - 1, y + new_dim - 1);
  28.     v[4] = solveA(x + new_dim, y + new_dim, new_dim, cand[4]);
  29.     v[4] += calc_sum(x + new_dim, y + new_dim, x + 2 * new_dim - 1, y + 2 * new_dim - 1);
  30.     int index = 0;
  31.     for(int i = 1; i < 5; ++i)
  32.         if(v[i] > v[index])
  33.             index = i;
  34.     rez.emplace_back(index);
  35.     for(int x : cand[index])
  36.         rez.emplace_back(x);
  37.     return v[index];
  38. }
  39.  
  40. int solveB(int x, int y, int dim, int itr, vector < int > &rez, bool flag) {
  41.     if(dim == 1)
  42.         return 0;
  43.     int new_dim = dim >> 1;
  44.     vector < int > v(5, -1);
  45.     vector < vector < int > > cand(5);
  46.     bool new_flag = flag;
  47.     if(!flag && A[itr] != 1)
  48.         new_flag = true;
  49.     v[1] = solveB(x, y, new_dim, itr + 1, cand[1], new_flag);
  50.     if(new_flag)
  51.         v[1] += calc_sum(x, y, x + new_dim - 1, y + new_dim - 1);
  52.     new_flag = flag;
  53.     if(!flag && A[itr] != 2)
  54.         new_flag = true;
  55.     v[2] = solveB(x, y + new_dim, new_dim, itr + 1, cand[2], new_flag);
  56.     if(new_flag)
  57.         v[2] += calc_sum(x, y + new_dim, x + new_dim - 1, y + 2 * new_dim - 1);
  58.     new_flag = flag;
  59.     if(!flag && A[itr] != 3)
  60.         new_flag = true;
  61.     v[3] = solveB(x + new_dim, y, new_dim, itr + 1, cand[3], new_flag);
  62.     if(new_flag)
  63.         v[3] += calc_sum(x + new_dim, y, x + 2 * new_dim - 1, y + new_dim - 1);
  64.     new_flag = flag;
  65.     if(!flag && A[itr] != 4)
  66.         new_flag = true;
  67.     v[4] = solveB(x + new_dim, y + new_dim, new_dim, itr + 1, cand[4], new_flag);
  68.     if(new_flag)
  69.         v[4] += calc_sum(x + new_dim, y + new_dim, x + 2 * new_dim - 1, y + 2 * new_dim - 1);
  70.     int index = 0;
  71.     for(int i = 1; i < 5; ++i)
  72.         if(v[i] > v[index])
  73.             index = i;
  74.     rez.emplace_back(index);
  75.     for(int x : cand[index])
  76.         rez.emplace_back(x);
  77.     return v[index];
  78. }
  79.  
  80. int main() {
  81.     int task, N;
  82.     fin >> task >> N;
  83.     N = (1 << N);
  84.     a.resize(N + 1);
  85.     dp = vector < vector < int > >(N + 1, vector < int >(N + 1));
  86.     for(int i = 1; i <= N; ++i) {
  87.         fin >> a[i];
  88.         a[i] = '0' + a[i];
  89.         for(int j = 1; j <= N; ++j) {
  90.             int add = a[i][j] - '0';
  91.             dp[i][j] = dp[i][j - 1] + dp[i - 1][j] - dp[i - 1][j - 1] + add;
  92.         }
  93.     }
  94.     fout << solveA(1, 1, N, A) + solveB(1, 1, N, 0, B, false) << '\n';
  95.     if(task == 2) {
  96.         int p = 0, M = A.size();
  97.         while(p < M && A[p] == B[p])
  98.             ++p;
  99.         if(p < M && A[p] < B[p]) {
  100.             for(int x : A)
  101.                 fout << x << ' ';
  102.             fout << '\n';
  103.             for(int x : B)
  104.                 fout << x << ' ';
  105.         }
  106.         else {
  107.             for(int x : B)
  108.                 fout << x << ' ';
  109.             fout << '\n';
  110.             for(int x : A)
  111.                 fout << x << ' ';
  112.         }
  113.     }
  114. }
Advertisement
Add Comment
Please, Sign In to add comment