# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
793206 |
2023-07-25T15:47:31 Z |
PixelCat |
Teams (IOI15_teams) |
C++14 |
|
3930 ms |
278640 KB |
#ifdef NYAOWO
#include "grader.cpp"
#endif
#include "teams.h"
#include <bits/stdc++.h>
#define For(i, a, b) for(int i = a; i <= b; i++)
#define Forr(i, a, b) for(int i = a; i >= b; i--)
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define sz(x) ((int)x.size())
#define eb emplace_back
using namespace std;
using LL = long long;
using pii = pair<int, int>;
const int MAXN = 500'000;
const int MAXND = 10'000'000;
namespace SegTree {
struct Node {
Node *l, *r;
int sum;
Node(): l(nullptr), r(nullptr), sum(0) {}
} _nodes[MAXND + 10];
int _node_count = 0;
Node* new_node(Node* nd) {
_node_count++;
if(nd) _nodes[_node_count] = (*nd);
else _nodes[_node_count] = Node();
return (_nodes + _node_count);
}
Node* add(Node* rt, int l, int r, int i, int x) {
Node* nd = new_node(rt);
nd->sum += x;
if(l == r) return nd;
int m = (l + r) / 2;
if(i <= m) nd->l = add(nd->l, l, m, i, x);
else nd->r = add(nd->r, m + 1, r, i, x);
return nd;
}
int get_sum(Node* rt, int l, int r, int L, int R) {
if(!rt) return 0;
if(l >= L && r <= R) return rt->sum;
int m = (l + r) / 2;
int res = 0;
if(L <= m) res += get_sum(rt->l, l, m, L, R);
if(R > m) res += get_sum(rt->r, m + 1, r, L, R);
return res;
}
}
int n;
vector<int> v[MAXN + 10];
SegTree::Node* seg[MAXN + 10];
// int sum(int u, int d, int l, int r) {
// d--; l--;
// return ps[r][u] + ps[l][d] - ps[l][u] - ps[r][d];
// }
int sum(int u, int d, int l, int r) {
return SegTree::get_sum(seg[r], 1, n, d, u) - SegTree::get_sum(seg[l - 1], 1, n, d, u);
}
pii find_pos(int u, int d, int l, int r, int &rem){
int hi = u, lo = d - 1;
while(hi - lo > 1) {
int mi = (hi + lo) / 2;
if(sum(mi, d, l, r) <= rem) lo = mi;
else hi = mi;
}
rem -= sum(lo, d, l, r);
int y = hi;
hi = r, lo = l - 1;
while(hi - lo > 1) {
int mi = (hi + lo) / 2;
if(sum(y, y, l, mi) <= rem) lo = mi;
else hi = mi;
}
rem -= sum(y, y, l, lo);
int x = hi;
return pii(x, y);
}
void init(int N, int A[], int B[]) {
n = N;
For(i, 1, n) {
v[A[i - 1]].eb(B[i - 1]);
}
seg[0] = nullptr;
For(i, 1, n) {
seg[i] = seg[i - 1];
for(auto &x:v[i]) seg[i] = SegTree::add(seg[i], 1, n, x, 1);
}
// Forr(y, n, 1) For(x, 1, n) cerr << sum(y, y, x, x) << " \n"[x == n];
}
struct Ayaya {
int l, u, d, minus;
};
int can(int M, int K[]) {
sort(K, K + M);
vector<Ayaya> stk;
stk.eb((Ayaya){ 1, n, 1, 0 });
// auto out = [&]() {
// for(auto &i:stk) {
// cerr << i.l << " " << i.u << "~" << i.d << " (-" << i.minus << ")\n";
// }
// };
bool fail = false;
For(iter, 0, M - 1) {
int x = K[iter];
while(sz(stk) && (stk.back().u < x || stk.back().l > x)) stk.pop_back();
if(stk.empty()) {
fail = true;
goto END;
}
if(stk.back().d < x) stk.back().d = x;
// out();
int rem = x;
while(rem > 0) {
if(stk.empty()) {
fail = true;
goto END;
}
Ayaya aya = stk.back();
stk.pop_back();
int su = sum(aya.u, aya.d, aya.l, x) - aya.minus;
if(su <= rem) {
// cerr << su << " " << rem << " take all\n";
rem -= su;
continue;
}
rem += aya.minus;
pii pos = find_pos(aya.u, aya.d, aya.l, x, rem);
if(pos.S < aya.u) stk.eb((Ayaya){ aya.l, aya.u, pos.S + 1, 0 });
stk.eb((Ayaya){ pos.F, pos.S, pos.S, rem });
rem = 0;
}
if(stk.empty()) stk.eb((Ayaya){ x + 1, n, 1, 0 });
else if(stk.back().d > 1) stk.eb((Ayaya){ x + 1, stk.back().d - 1, 1, 0 });
}
END:
// cerr << "--- end of test ---\n";
if(fail) return 0;
return 1;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
84 ms |
246860 KB |
Output is correct |
2 |
Correct |
81 ms |
246748 KB |
Output is correct |
3 |
Correct |
96 ms |
246772 KB |
Output is correct |
4 |
Correct |
83 ms |
246772 KB |
Output is correct |
5 |
Correct |
82 ms |
246752 KB |
Output is correct |
6 |
Correct |
85 ms |
246868 KB |
Output is correct |
7 |
Correct |
82 ms |
246860 KB |
Output is correct |
8 |
Correct |
82 ms |
246860 KB |
Output is correct |
9 |
Correct |
83 ms |
246860 KB |
Output is correct |
10 |
Correct |
82 ms |
246876 KB |
Output is correct |
11 |
Correct |
83 ms |
246768 KB |
Output is correct |
12 |
Correct |
87 ms |
246972 KB |
Output is correct |
13 |
Correct |
83 ms |
246872 KB |
Output is correct |
14 |
Correct |
84 ms |
246868 KB |
Output is correct |
15 |
Correct |
84 ms |
246860 KB |
Output is correct |
16 |
Correct |
82 ms |
246800 KB |
Output is correct |
17 |
Correct |
84 ms |
246800 KB |
Output is correct |
18 |
Correct |
85 ms |
246860 KB |
Output is correct |
19 |
Correct |
83 ms |
246796 KB |
Output is correct |
20 |
Correct |
82 ms |
246784 KB |
Output is correct |
21 |
Correct |
83 ms |
246816 KB |
Output is correct |
22 |
Correct |
83 ms |
246844 KB |
Output is correct |
23 |
Correct |
87 ms |
246820 KB |
Output is correct |
24 |
Correct |
88 ms |
246784 KB |
Output is correct |
25 |
Correct |
83 ms |
246780 KB |
Output is correct |
26 |
Correct |
86 ms |
246872 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
116 ms |
250204 KB |
Output is correct |
2 |
Correct |
114 ms |
250632 KB |
Output is correct |
3 |
Correct |
120 ms |
250668 KB |
Output is correct |
4 |
Correct |
118 ms |
250992 KB |
Output is correct |
5 |
Correct |
96 ms |
249496 KB |
Output is correct |
6 |
Correct |
96 ms |
249508 KB |
Output is correct |
7 |
Correct |
97 ms |
249524 KB |
Output is correct |
8 |
Correct |
98 ms |
249488 KB |
Output is correct |
9 |
Correct |
100 ms |
249284 KB |
Output is correct |
10 |
Correct |
101 ms |
249276 KB |
Output is correct |
11 |
Correct |
96 ms |
249324 KB |
Output is correct |
12 |
Correct |
97 ms |
249248 KB |
Output is correct |
13 |
Correct |
118 ms |
249508 KB |
Output is correct |
14 |
Correct |
106 ms |
249668 KB |
Output is correct |
15 |
Correct |
116 ms |
250244 KB |
Output is correct |
16 |
Correct |
113 ms |
250316 KB |
Output is correct |
17 |
Correct |
100 ms |
249372 KB |
Output is correct |
18 |
Correct |
114 ms |
249260 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
122 ms |
250704 KB |
Output is correct |
2 |
Correct |
124 ms |
250824 KB |
Output is correct |
3 |
Correct |
732 ms |
254244 KB |
Output is correct |
4 |
Correct |
120 ms |
251944 KB |
Output is correct |
5 |
Correct |
121 ms |
250740 KB |
Output is correct |
6 |
Correct |
114 ms |
250548 KB |
Output is correct |
7 |
Correct |
103 ms |
250652 KB |
Output is correct |
8 |
Correct |
112 ms |
250604 KB |
Output is correct |
9 |
Correct |
100 ms |
249720 KB |
Output is correct |
10 |
Correct |
124 ms |
249844 KB |
Output is correct |
11 |
Correct |
146 ms |
250088 KB |
Output is correct |
12 |
Correct |
193 ms |
250292 KB |
Output is correct |
13 |
Correct |
459 ms |
251080 KB |
Output is correct |
14 |
Correct |
1067 ms |
253632 KB |
Output is correct |
15 |
Correct |
248 ms |
252068 KB |
Output is correct |
16 |
Correct |
288 ms |
252048 KB |
Output is correct |
17 |
Correct |
200 ms |
250832 KB |
Output is correct |
18 |
Correct |
203 ms |
250836 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
386 ms |
264732 KB |
Output is correct |
2 |
Correct |
396 ms |
264836 KB |
Output is correct |
3 |
Correct |
2889 ms |
278640 KB |
Output is correct |
4 |
Correct |
398 ms |
271484 KB |
Output is correct |
5 |
Correct |
195 ms |
263208 KB |
Output is correct |
6 |
Correct |
191 ms |
263172 KB |
Output is correct |
7 |
Correct |
173 ms |
263184 KB |
Output is correct |
8 |
Correct |
186 ms |
263072 KB |
Output is correct |
9 |
Correct |
171 ms |
262060 KB |
Output is correct |
10 |
Correct |
237 ms |
260440 KB |
Output is correct |
11 |
Correct |
292 ms |
261028 KB |
Output is correct |
12 |
Correct |
438 ms |
262048 KB |
Output is correct |
13 |
Correct |
1762 ms |
265424 KB |
Output is correct |
14 |
Correct |
3930 ms |
274004 KB |
Output is correct |
15 |
Correct |
606 ms |
270140 KB |
Output is correct |
16 |
Correct |
581 ms |
270172 KB |
Output is correct |
17 |
Correct |
419 ms |
264416 KB |
Output is correct |
18 |
Correct |
390 ms |
264520 KB |
Output is correct |