제출 #557848

#제출 시각아이디문제언어결과실행 시간메모리
557848600Mihnea건물 4 (JOI20_building4)C++17
100 / 100
341 ms35832 KiB
#include <bits/stdc++.h>

bool home = 1;

using namespace std;

const int N=500000+7;
const int INF=(int)1e9+7;
int n,a[2][2*N],take[2*N];

signed main() {
#ifdef ONLINE_JUDGE
  home = 0;
#endif

  home=0;

  if (home) {
    freopen("I_am_iron_man", "r", stdin);
  }
  else {
    ios::sync_with_stdio(0); cin.tie(0);
  }

  cin>>n;
  for (int it=0;it<2;it++) {
    for (int i=1;i<=2*n;i++) {
      cin>>a[it][i];
    }
  }

  if (a[0][1]<a[1][1]) take[1]=0;
  else take[1]=1;


  for (int i=2;i<=2*n;i++) {
    int last_value=a[take[i-1]][i-1];
    vector<int> pot;
    for (int it=0;it<2;it++) {
      if (last_value<=a[it][i]) {
        pot.push_back(it);
      }
    }
    if (pot.empty()) {
      cout<<"-1\n";
      return 0;
    }
    if ((int)pot.size()==1) {
      take[i]=pot[0];
    }else{
      assert((int)pot.size()==2);
      if (a[0][i]<a[1][i]) take[i]=0;
      else take[i]=1;
    }
  }

  int delta=0;
  for (int i=1;i<=2*n;i++) {
    if(take[i]==0) delta++;
    else delta--;
  }

  int i=1;
  while (i<=2*n){
    if (a[take[i-1]][i-1]<=a[take[i]^1][i]) {
      bool valid=1;
      int j=i;
      while (1) {
        if (j==2*n) break;
        j++;
        assert(j<=2*n);
        if (a[take[j-1]^1][j-1]<=a[take[j]][j]) {
          j--;
          break;
        }
        assert(a[take[j-1]^1][j-1]>a[take[j]][j]);
        if (a[take[j-1]^1][j-1]<=a[take[j]^1][j]) {
          continue;
        }
        valid=0;
        j--;
        break;
      }
      if (valid) {
        vector<int> deltas;
        int cur=0;
        deltas.push_back(cur);
        for (int k=j;k>=i;k--) {
          if (take[k]==0) cur--; else cur++;
          if (take[k]==1) cur++; else cur--;
          deltas.push_back(cur);
        }
        /// delta -> delta + cur
        int best=delta,p=0;
        for (int k=0;k<(int)deltas.size();k++) {
          if (abs(deltas[k]+delta)<abs(best)) {
            best=deltas[k]+delta;
            p=k;
          }
        }
        delta=best;
        for (int k=j-p+1;k<=j;k++) {
          take[k]^=1;
        }
      }
      i=j;
    }
    i++;
  }
  if (delta!=0) {
    cout<<"-1\n";
    exit(0);
  }
  for (int i=1;i<=2*n;i++){
    cout<<(char)('A'+take[i]);
  }
  cout<<"\n";
}

컴파일 시 표준 에러 (stderr) 메시지

building4.cpp: In function 'int main()':
building4.cpp:19:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |     freopen("I_am_iron_man", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...