제출 #985222

#제출 시각아이디문제언어결과실행 시간메모리
985222oolimry자리 배치 (IOI18_seats)C++17
25 / 100
4102 ms80300 KiB
#include "seats.h" #include <bits/stdc++.h> using namespace std; mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); vector<int> R; vector<int> C; int lv1[1100100 * 4]; int rv1[1100100 * 4]; int lv2[1100100 * 4]; int rv2[1100100 * 4]; void hupdate(int i, int s, int e, int in, int k){ if(s == e){ lv1[i] = k; rv1[i] = k; return; } int m = (s + e)/2; if(in <= m){ hupdate(i * 2,s,m,in,k); } else{ hupdate(i * 2 + 1,m + 1, e, in, k); } lv1[i] = min(lv1[i * 2], lv1[i * 2 + 1]); rv1[i] = max(rv1[i * 2], rv1[i * 2 + 1]); } pair<int,int> hquery(int i, int s, int e, int S, int E){ if(S <= s && e <= E){ return {lv1[i],rv1[i]}; } int m = (s + e)/2; pair<int,int> ii = {1100100100, -1}; if(S <= m){ pair<int,int> ii1 = hquery(i * 2,s,m,S,E); ii.first = min(ii.first, ii1.first); ii.second = max(ii.second, ii1.second); } if(m < E){ pair<int,int> ii1 = hquery(i * 2 + 1,m + 1,e,S,E); ii.first = min(ii.first, ii1.first); ii.second = max(ii.second, ii1.second); } return ii; } void cupdate(int i, int s, int e, int in, int k){ if(s == e){ lv2[i] = k; rv2[i] = k; return; } int m = (s + e)/2; if(in <= m){ cupdate(i * 2,s,m,in,k); } else{ cupdate(i * 2 + 1,m + 1, e, in, k); } lv2[i] = min(lv2[i * 2], lv2[i * 2 + 1]); rv2[i] = max(rv2[i * 2], rv2[i * 2 + 1]); } pair<int,int> cquery(int i, int s, int e, int S, int E){ if(S <= s && e <= E){ return {lv2[i],rv2[i]}; } int m = (s + e)/2; pair<int,int> ii = {1100100100, -1}; if(S <= m){ pair<int,int> ii1 = cquery(i * 2,s,m,S,E); ii.first = min(ii.first, ii1.first); ii.second = max(ii.second, ii1.second); } if(m < E){ pair<int,int> ii1 = cquery(i * 2 + 1,m + 1,e,S,E); ii.first = min(ii.first, ii1.first); ii.second = max(ii.second, ii1.second); } return ii; } int H,W; int HW; void give_initial_chart(int H_, int W_, std::vector<int> R_, std::vector<int> C_) { R = R_; C = C_; H = H_; W = W_; HW = H * W; for(int i = 0; i < H * W ; i++){ hupdate(1,0,HW-1,i,R[i]); cupdate(1,0,HW-1,i,C[i]); } } int swap_seats(int a, int b) { swap(R[a],R[b]); swap(C[a],C[b]); hupdate(1,0,HW-1,a,R[a]); hupdate(1,0,HW-1,b,R[b]); cupdate(1,0,HW-1,a,C[a]); cupdate(1,0,HW-1,b,C[b]); int num = 2; int v = 2; int s = 1; int e = 1; while(v < H * W){ pair<int,int> ii = hquery(1,0,HW-1,0, v - 1); pair<int,int> ii1 = cquery(1,0,HW-1,0, v - 1); s = (ii.second - ii.first + 1); e = (ii1.second - ii1.first + 1); if( s * e == v ){ v = min( (s + 1) * e, s * (e + 1) ); num++; } v = max(v, s * e); } return num; }
#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...