답안 #51323

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
51323 2018-06-17T13:20:18 Z KieranHorgan 과수원 (NOI14_orchard) C++17
16 / 25
101 ms 8408 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;

  }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 248 KB Output is correct
2 Correct 2 ms 356 KB Output is correct
3 Correct 2 ms 560 KB Output is correct
4 Correct 2 ms 560 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 560 KB Output is correct
2 Correct 3 ms 664 KB Output is correct
3 Correct 3 ms 664 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 86 ms 8364 KB Output is correct
2 Correct 81 ms 8364 KB Output is correct
3 Correct 101 ms 8408 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 8408 KB Output is correct
2 Correct 19 ms 8408 KB Output is correct
3 Correct 20 ms 8408 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 8408 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 8408 KB Output isn't correct
2 Halted 0 ms 0 KB -