제출 #808012

#제출 시각아이디문제언어결과실행 시간메모리
808012mindiyak자리 배치 (IOI18_seats)C++14
0 / 100
4048 ms35500 KiB
#include "seats.h"
#include <iostream>
using namespace std;

const int MX = 1e6+5;
vector<int> pos(MX);
int n = 0;
vector<int> rmin(MX,0);
vector<int> rmax(MX,0);
vector<long long> temp_ans(MX,0);

void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) {
  n = W;
  for(int i=0;i<W;i++)pos[i] = R[i];

  
  rmin[0]=rmax[0]=pos[0];

  for(int i=1;i<n;i++){
    rmin[i] = min(rmin[i-1],pos[i]);
    rmax[i] = max(rmax[i-1],pos[i]);
  }

  long long ans = 0;
  for(int i=0;i<n;i++){
    int box_size = (rmax[i]-rmin[i]+1);
    // cout << "{" << rmin[i] << "," << rmax[i] << "} {" <<  cmin[i] << "," << cmax[i] << "} " <<  box_size << " " << i+1 << endl;
    if(i+1 == box_size){
      ans++;
      temp_ans[i] = ans;
    }
  }
}


int swap_seats(int a, int b) {
  swap(pos[a],pos[b]);
  long long ans = 0;

  if(a==0){
    rmin[0]=rmax[0]=pos[0];
  }else{
    ans = temp_ans[a-1];
  }
  for(int i=max(a,1);i<=b;i++){
    rmin[i] = min(rmin[i-1],pos[i]);
    rmax[i] = max(rmax[i-1],pos[i]);
  }

  // cout << endl;
  int change = 0;
  for(int i=a;i<=b;i++){
    int box_size = (rmax[i]-rmin[i]+1);
    // cout << "{" << rmin[i] << "," << rmax[i] << "} {" <<  cmin[i] << "," << cmax[i] << "} " <<  box_size << " " << i+1 << endl;
    if(i+1 == box_size){
      ans++;
      change ++;
      temp_ans[i] = ans;
    }
  }for(int i=b+1;i<n;i++)temp_ans[i]+=change;
  // cout << " ans = " << ans << endl << endl;

  return temp_ans[n-1];
}
#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...