제출 #232419

#제출 시각아이디문제언어결과실행 시간메모리
232419crossing0ver삶의 질 (IOI10_quality)C++17
60 / 100
5067 ms23160 KiB
#include<bits/stdc++.h> #include "quality.h" using namespace std; const int N = 9E5 + 5; int median; int t[4*N]; int pos,numb,ans = INT_MAX; void upd (int v = 1,int tl = 1,int tr = numb) { if (tl == tr) { if (t[v]) t[v] = 0; else t[v] = 1; return; } int tm = (tl +tr)/2; if (pos <= tm) upd (v*2,tl,tm); else upd (v*2|1,tm+1,tr); t[v] = t[v*2] + t[v*2 + 1]; } int get (int v = 1, int tl = 1, int tr = numb,int F = median) { if (tl == tr) return tl; int tm = (tl + tr)/2; // if (F <= t[v*2+1]) return get(v*2 + 1,tm + 1,tr,F); // F -= t[v*2 + 1]; // return get(v*2,tl,tm,F); if (F <= t[v*2]) return get(v*2,tl,tm,F); F -= t[v*2]; return get(v*2|1,tm+1,tr,F); } int rectangle(int R, int C, int H, int W, int Q[3001][3001]) { numb = R*C; median = (H*W+1)/2; for (int i = 0; i < H; i++) for (int j = 0; j < W; j++) { pos = Q[i][j]; upd(); } // ans = get(); // cout << ans; // exit(0); int r = W - 1, l = 0, h = 0, d = H - 1; int dir = 0; // 0 - r 1 - d 2 - l while (true) { ans = min(ans,get()); if (dir == 0) { if (r != C - 1) { for (int i = h; i <= d; i++) { pos = Q[i][l]; upd(); pos = Q[i][r + 1]; upd(); } r++; l++; } else if (d != R - 1){ dir = 1; for (int i = l; i <=r ; i++) { pos = Q[h][i]; upd(); pos = Q[d + 1][i]; upd(); } h++; d++; } else break; } else if (dir == 1) { if (l != 0) { dir = 2; for (int i = h; i <= d; i++) { pos = Q[i][r]; upd(); pos = Q[i][l-1]; upd(); } r--; l--; } else if (r != C - 1) { dir = 0; for (int i = h; i <= d; i++) { pos = Q[i][l]; upd(); pos = Q[i][r + 1]; upd(); } r++; l++; } else if (d != R - 1) { for (int i = l; i <=r ; i++) { pos = Q[h][i]; upd(); pos = Q[d + 1][i]; upd(); } h++; d++; } else break; } else { if (l != 0) { for (int i = h; i <= d; i++) { pos = Q[i][r]; upd(); pos = Q[i][l-1]; upd(); } r--; l--; } else if (d != R - 1) { dir = 1; for (int i = l; i <=r ; i++) { pos = Q[h][i]; upd(); pos = Q[d + 1][i]; upd(); } h++; d++; } else break; } } return ans; //return R*C/2; } //static int R,C,H,W,Q[3001][3001],i,j,ans; /* int main(){ static int R,C,H,W,Q[3001][3001] = {},i,j; scanf("%d%d%d%d",&R,&C,&H,&W); for (i=0;i<R;i++) for (j=0;j<C;j++) scanf("%d",&Q[i][j]); // ans = rectangle(R,C,H,W,Q); printf("%d\n",ans); return 0; } */
#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...