제출 #293653

#제출 시각아이디문제언어결과실행 시간메모리
293653TheLorax자리 배치 (IOI18_seats)C++11
17 / 100
4061 ms77944 KiB
#include <bits/stdc++.h>
#include "seats.h"

#define F first
#define S second
#define SZ(a) ((int)(a).size())
#define PB push_back
#define ALL(a) (a).begin(), (a).end()

using namespace std;

typedef long long ll;
typedef pair<ll, ll> ii;

std::vector<ii> p, mi, mx;
std::vector<int> f;
int h, w, s;

ii mip(ii a, ii b){
  return {min(a.F,b.F),min(a.S,b.S)};
}

ii mxp(ii a, ii b){
  return {max(a.F,b.F),max(a.S,b.S)};
}

void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) {
  h=H; w=W;
  mi.resize(h*w);
  mx.resize(h*w);
  p.resize(h*w);
  f.resize(h*w);
  for(int i=0; i<h*w; i++)
    p[i]={R[i],C[i]};
  mi[0]=mx[0]=p[0];
  for(int i=1; i<h*w; i++){
    mi[i]=mip(mi[i-1],p[i]);
    mx[i]=mxp(mx[i-1],p[i]);
  }
  for(int i=0; i<h*w; i++)
    if((mx[i].F-mi[i].F+1)*(mx[i].S-mi[i].S+1)==i+1){
      s++;
      f[i]=1;
    } else
      f[i]=0;
}

int swap_seats(int a, int b) {
  if(a>b)
    swap(a,b);
  swap(p[a], p[b]);
  if(a==0)
    mi[0]=mx[0]=p[0];
  for(int i=max(a,1); i<h*w; i++){
    if(mi[i]==mip(mi[i-1],p[i]) && mx[i]==mxp(mx[i-1],p[i])){
      if(i>=b)
        break;
      else
        i=b;
    }
    s-=f[i];
    mi[i]=mip(mi[i-1],p[i]);
    mx[i]=mxp(mx[i-1],p[i]);
    f[i]=((mx[i].F-mi[i].F+1)*(mx[i].S-mi[i].S+1)==i+1)?1:0;
    s+=f[i];
  }
  return s;
}
#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...