답안 #51329

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
51329 2018-06-17T13:40:54 Z KieranHorgan 과수원 (NOI14_orchard) C++17
25 / 25
265 ms 18428 KB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>

using namespace std;
#define endl '\n'
#define ll long long
#define int long long
#define ld long double
#define pii pair<int,int>
#define rand() abs((rand()<<15)|rand())
#define randll() abs(((long long)rand()<<30)|rand())

signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long seed;
  asm("rdtsc" : "=A"(seed));
  srand(seed);

  int n, m;
  cin >> n >> m;

  if(n == 1) {
    vector<int> grid(m+1, 0);
    int totalOnes = 0;
    for(int i = 1; i <= m; i++) {
      cin >> grid[i];
      if(grid[i])
        totalOnes++;
    }

    int ans = 1ll<<29;
    int carried = totalOnes;
    for(int i = 1; i <= m; i++) {
      if(grid[i] == 1) {
        carried--;
        carried = min(carried, totalOnes-1);
        ans = min(ans, carried);
      } else {
        carried++;
        carried = min(carried, totalOnes+1);
        ans = min(ans, carried);
      }
    }
    cout << ans << endl;
  } else if(n == 2) {
    vector<int> g1(m+1, 0);
    vector<int> g2(m+1, 0);
    int totalOnes = 0;
    int ones1 = 0;
    int ones2 = 0;
    for(int i = 1; i <= m; i++) {
      cin >> g1[i];
      if(g1[i])
        totalOnes++,
        ones1++;
    }
    for(int i = 1; i <= m; i++) {
      cin >> g2[i];
      if(g2[i])
        totalOnes++,
        ones2++;
    }


    int ans = 1ll<<29;
    int carried = ones1;
    for(int i = 1; i <= m; i++) {
      if(g1[i] == 1) {
        carried--;
        carried = min(carried, ones1-1);
        ans = min(ans, carried+ones2);
      } else {
        carried++;
        carried = min(carried, ones1+1);
        ans = min(ans, carried+ones2);
      }
    }
    carried = ones2;
    for(int i = 1; i <= m; i++) {
      if(g2[i] == 1) {
        carried--;
        carried = min(carried, ones2-1);
        ans = min(ans, carried+ones1);
      } else {
        carried++;
        carried = min(carried, ones2+1);
        ans = min(ans, carried+ones1);
      }
    }

    for(int i = 1; i <= m; i++) {
      if(g1[i]==0) g1[i] = -1;
      if(g2[i]==0) g2[i] = -1;
      g1[i] += g2[i];
    }

    carried = totalOnes;
    for(int i = 1; i <= m; i++) {
      if(g1[i] >= 0) {
        carried -= g1[i];
        carried = min(carried, totalOnes-g1[i]);
        ans = min(ans, carried);
      } else {
        carried -= g1[i];
        carried = min(carried, totalOnes-g1[i]);
        ans = min(ans, carried);
      }
    }
    cout << ans << endl;
  } else {
    vector<vector<int>> grid(n+1, vector<int>(m+1, 0));
    vector<vector<int>> zs(n+1, vector<int>(m+1, 0));
    vector<vector<int>> os(n+1, vector<int>(m+1, 0));
    int totalOnes = 0;
    for(int i = 1; i <= n; i++) {
      for(int j = 1; j <= m; j++) {
        cin >> grid[i][j];
        if(grid[i][j])
          totalOnes++;
        os[i][j] = grid[i][j] + os[i-1][j] + os[i][j-1] - os[i-1][j-1];
        zs[i][j] =!grid[i][j] + zs[i-1][j] + zs[i][j-1] - zs[i-1][j-1];
      }
    }

    int ans = 1ll<<29;
    for(int top = 0; top < n; top++) {
      for(int bot = top+1; bot <= n; bot++) {
        int carried = totalOnes;
        for(int j = 1; j <= m; j++) {
          carried -= os[bot][j] - os[bot][j-1] - os[top][j] + os[top][j-1];
          carried += zs[bot][j] - zs[bot][j-1] - zs[top][j] + zs[top][j-1];
          int single = (zs[bot][j] - zs[bot][j-1] - zs[top][j] + zs[top][j-1]) + (totalOnes - (os[bot][j] - os[bot][j-1] - os[top][j] + os[top][j-1]));
          carried = min(carried, single);
          ans = min(ans, carried);
        }
      }
    }
    cout << ans << endl;
  }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 248 KB Output is correct
2 Correct 2 ms 356 KB Output is correct
3 Correct 2 ms 392 KB Output is correct
4 Correct 2 ms 468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 612 KB Output is correct
2 Correct 3 ms 672 KB Output is correct
3 Correct 3 ms 672 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 79 ms 8428 KB Output is correct
2 Correct 83 ms 8428 KB Output is correct
3 Correct 80 ms 8428 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 8428 KB Output is correct
2 Correct 20 ms 8428 KB Output is correct
3 Correct 19 ms 8428 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 8428 KB Output is correct
2 Correct 10 ms 8428 KB Output is correct
3 Correct 12 ms 8428 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 265 ms 18428 KB Output is correct
2 Correct 258 ms 18428 KB Output is correct
3 Correct 261 ms 18428 KB Output is correct