# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
796466 | esomer | 마상시합 토너먼트 (IOI12_tournament) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#include "tournament.h"
using namespace std;
int GetBestPosition(int N, int C, int R, int *K, int *S, int *E){
set<pair<int, int>> left;
int ans = 0;
int mx = 0;
for(int pos = 0; pos < N; pos++){
left.clear();
left.insert({pos, R});
for(int i = 0; i < N - 1; i++){
if(i < pos) left.insert({i, K[i]});
else left.insert({i+1, K[i]});
}
int wins = 0;
for(int i = 0; i < C; i++){
int l = S[i];
int r = E[i];
//The left_endpoint is always correct, because I update it.
int total = 0;
int mx = 0;
bool seen = 0;
auto it = left.lower_bound({l, -1});
vector<pair<int, int>> eras;
while(total < (r - l + 1)){
total++;
pair<int, int> p = *it; it++; eras.push_back(p);
mx = max(mx, p.second);
if(p.second == R) seen = 1;
}
for(pair<int, int> p : eras) left.erase(p);
if(seen){
if(mx > R) break;
else wins++;
}
left.insert({l, mx});
}
if(wins > mx){
mx = wins;
ans = pos;
}
}
return ans;
}
//~ int main() {
//~ int tmp;
//~ int N, C, R;
//~ int *K, *S, *E;
//~ tmp = scanf("%d %d %d", &N, &C, &R);
//~ assert(tmp == 3);
//~ K = (int*) malloc((N-1) * sizeof(int));
//~ S = (int*) malloc(C * sizeof(int));
//~ E = (int*) malloc(C * sizeof(int));
//~ int i;
//~ for (i = 0; i < N-1; i++) {
//~ tmp = scanf("%d", &K[i]);
//~ assert(tmp == 1);
//~ }
//~ for (i = 0; i < C; i++) {
//~ tmp = scanf("%d %d", &S[i], &E[i]);
//~ assert(tmp == 2);
//~ }
//~ printf("%d\n", GetBestPosition(N, C, R, K, S, E));
//~ return 0;
//~ }