# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
588489 | lorenzoferrari | 팀들 (IOI15_teams) | C++17 | 3253 ms | 55508 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "teams.h"
#include <bits/stdc++.h>
using namespace std;
int n;
vector<vector<int>> ft;
int count(const vector<vector<int>*>& v, int l, int r) {
// return elements in [l, r]
if (l > r) return 0;
int ans = 0;
for (auto p : v) {
ans += upper_bound(p->begin(), p->end(), r) -
upper_bound(p->begin(), p->end(), l-1);
}
return ans;
}
vector<vector<int>*> get_prefix(int a) {
vector<vector<int>*> ans;
for (; a > 0; a -= (a & -a)) {
ans.push_back(&ft[a]);
}
return ans;
}
int can(int M, int K[]) {
// cerr << "query: \n";
sort(K, K + M);
int delta = 0;
for (int i = 0; i < M; ++i) {
auto p = get_prefix(K[i]);
// for (auto x : p) for (auto y : *x) cerr << y << " ";
// cerr << endl;
int l = K[i]-1, r = n;
while (r - l > 1) {
int m = (l + r) / 2;
if (count(p, K[i], m) >= K[i] + delta) {
r = m;
} else {
l = m;
}
}
if (count(p, K[i], r) < K[i] + delta) return 0;
if (i != M-1) {
if (K[i+1] > r) {
delta = 0;
} else {
int r_used = K[i] + delta - count(p, K[i], r-1);
delta = count(p, K[i+1], r-1) + r_used;
}
}
}
return 1;
}
void init(int n, int a[], int b[]) {
::n = n;
ft.resize(n + 1);
for (int i = 0; i < n; ++i) {
for (int j = a[i]; j <= n; j += (j & -j)) {
ft[j].push_back(b[i]);
}
}
for (int i = 1; i <= n; ++i) {
sort(ft[i].begin(), ft[i].end());
}
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |