제출 #1035233

#제출 시각아이디문제언어결과실행 시간메모리
1035233huutuan자리 배치 (IOI18_seats)C++14
17 / 100
4062 ms60464 KiB
#include "seats.h"

#include <bits/stdc++.h>

using namespace std;

const int N=1e6+10;
int min_x[N], max_x[N], min_y[N], max_y[N];
pair<int, int> pos[N];
int check[N], sum;

void give_initial_chart(int H, int W, vector<int> R, vector<int> C) {
   for (int i=0; i<H*W; ++i){
      pos[i]={R[i], C[i]};
      if (!i) min_x[i]=max_x[i]=pos[i].first, min_y[i]=max_y[i]=pos[i].second;
      else{
         min_x[i]=min(min_x[i-1], pos[i].first);
         max_x[i]=max(max_x[i-1], pos[i].first);
         min_y[i]=min(min_y[i-1], pos[i].second);
         max_y[i]=max(max_y[i-1], pos[i].second);
      }
      check[i]=(max_x[i]-min_x[i]+1)*(max_y[i]-min_y[i]+1)==(i+1);
      sum+=check[i];
   }
}

int swap_seats(int a, int b) {
   if (a>b) swap(a, b);
   swap(pos[a], pos[b]);
   for (int i=a; i<b; ++i){
      sum-=check[i];
      if (!i) min_x[i]=max_x[i]=pos[i].first, min_y[i]=max_y[i]=pos[i].second;
      else{
         min_x[i]=min(min_x[i-1], pos[i].first);
         max_x[i]=max(max_x[i-1], pos[i].first);
         min_y[i]=min(min_y[i-1], pos[i].second);
         max_y[i]=max(max_y[i-1], pos[i].second);
      }
      check[i]=(max_x[i]-min_x[i]+1)*(max_y[i]-min_y[i]+1)==(i+1);
      sum+=check[i];
   }
   return sum;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...