이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define sz(a) ((int)a.size())
typedef vector<int> vint;
#ifndef wambule
// #include ".h"
#else
#endif
struct sws {
sws *l, *r;
int x;
sws() {
l = r = NULL;
x = 0;
}
void P() {
if(l == NULL) l = new sws();
if(r == NULL) r = new sws();
}
void Px() {
P(); x = max(l->x, r->x);
}
void Ps() {
P(); x = l->x + r->x;
}
};
struct dmtree {
sws *rt;
const int n;
dmtree(int _n) : n(_n), rt(NULL) {};
static void _set(int l, int r, sws *&t, int si, int vl) {
if(t == NULL) t = new sws();
if(l == r) {
t->x = vl;
return;
}
int m = l + r >> 1;
if(m >= si) _set(l, m, t->l, si, vl);
else _set(m + 1, r, t->r, si, vl);
}
static int _get(int l, int r, sws *&t, int si) {
assert(t != NULL);
if(l == r) return t->x;
int m = l + r >> 1;
if(m >= si) return _get(l, m, t->l, si);
else return _get(m + 1, r, t->r, si);
}
void set(int i, int x) {
_set(0, n - 1, rt, i, x);
}
int get(int i) {
return _get(0, n - 1, rt, i);
}
};
struct mxtree {
sws *rt;
const int n;
mxtree(int _n) : n(_n), rt(NULL) {}
static void _set(int l, int r, sws *&t, int si, int vl) {
if(t == NULL) t = new sws();
if(l == r) {
t->x = vl;
return;
}
int m = l + r >> 1;
if(m >= si) _set(l, m, t->l, si, vl);
else _set(m + 1, r, t->r, si, vl);
t->Px();
}
static int _get(int l, int r, sws *&t, int sl, int sr) {
if(l > sr || r < sl || t == NULL) return 0;
if(l >= sl && r <= sr) return t->x;
int m = l + r >> 1;
return max(_get(l, m, t->l, sl, sr), _get(m + 1, r, t->r, sl, sr));
}
void set(int i, int x) {
_set(0, n - 1, rt, i, x);
}
void erase(int i) {
set(i, 0);
}
int operator()(int l, int r) {
return _get(0, n - 1, rt, l, r);
}
};
struct sptree {
dmtree dt;
sws *rt;
const int n;
sptree(int _n) : n(_n), rt(NULL), dt(dmtree(n)) {};
static void _set(int l, int r, sws *&t, int si, int vl) {
if(t == NULL) t = new sws();
if(l == r) {
t->x = vl;
return;
}
int m = l + r >> 1;
if(m >= si) _set(l, m, t->l, si, vl);
else _set(m + 1, r, t->r, si, vl);
t->Ps();
}
static int _get(int l, int r, sws *&t, int x) {
if(l == r) return l;
t->P();
int m = l + r >> 1;
int cl = t->l->x;
if(cl >= x) return _get(l, m, t->l, x);
else return _get(m + 1, r, t->r, x - cl);
}
int get(int x) {
++x;
if(rt == NULL || rt->x < x) return -1;
return _get(0, n - 1, rt, x);
}
void set(int i, int x) {
_set(0, n - 1, rt, i, 1);
dt.set(i, x);
}
void remove(int i) {
_set(0, n - 1, rt, i, 0);
dt.set(i, 0);
}
int operator[](int i) {
return dt.get(i);
}
};
const int N = 100005;
int up[N * 2], sg[N * 2][2];
int GetBestPosition(int n, int c, int r, int k[], int s[], int e[]) {
if(n == 1) return 0;
for(int i = 0; i < n + c; ++i) up[i] = -1;
// // // // // // // //
sptree spt(n);
mxtree mxt(n);
for(int i = n - 1; i >= 1; --i) {
k[i] = k[i - 1];
mxt.set(i, k[i]);
}
mxt.set(0, r);
k[0] = r;
for(int i = 0; i < n; ++i) {
sg[i][0] = sg[i][1] = i;
spt.set(i, i);
}
for(int i = 0; i < c; ++i) {
for(int j = 0; j <= e[i] - s[i]; ++j) {
int x = spt.get(s[i]);
int y = spt[x];
up[y] = n + i;
spt.remove(x);
if(j == 0) {
sg[n + i][0] = sg[y][0];
} else if(j == e[i] - s[i]) {
sg[n + i][1] = sg[y][1];
}
}
spt.set(sg[n + i][0], n + i);
}
int ap = 0, fp = 0, dr = 0;
for(int i = 0; i < n; ++i) {
{
int x = up[i];
while(sg[x][0] == i) {
// cout << x << " " << mxt(sg[x][0], sg[x][1]) << " " << k[i] << endl;
if(mxt(sg[x][0], sg[x][1]) == k[i]) {
++ap;
}
x = up[x];
if(x == -1) break;
}
}
// cout << ap << endl;
if(ap > fp) {
fp = ap;
dr = i;
}
if(i < n - 1) {
int x = up[i];
while(sg[x][1] == i) {
if(mxt(sg[x][0], sg[x][1]) == k[i]) {
--ap;
} else {
break;
}
x = up[x];
if(x == -1) break;
}
mxt.set(i + 1, k[i]);
mxt.set(i, k[i + 1]);
swap(k[i], k[i + 1]);
}
}
#ifdef wambulex
for(int i = 0; i < n; ++i) {
int x = i;
while(x != -1) {
cout << x << " ";
x = up[x];
}
cout << endl;
}
#endif
return dr;
}
#ifdef wambule
int n = 5;
int k[] = {1, 0, 2, 4};
int r = 3;
int c = 3;
int s[] = {1, 0, 0};
int e[] = {3, 1, 1};
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout << GetBestPosition(n, c, r, k, s, e) << endl;
return 0;
}
#endif
컴파일 시 표준 에러 (stderr) 메시지
tournament.cpp: In constructor 'dmtree::dmtree(int)':
tournament.cpp:33:12: warning: 'dmtree::n' will be initialized after [-Wreorder]
33 | const int n;
| ^
tournament.cpp:32:7: warning: 'sws* dmtree::rt' [-Wreorder]
32 | sws *rt;
| ^~
tournament.cpp:34:2: warning: when initialized here [-Wreorder]
34 | dmtree(int _n) : n(_n), rt(NULL) {};
| ^~~~~~
tournament.cpp: In static member function 'static void dmtree::_set(int, int, sws*&, int, int)':
tournament.cpp:42:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
42 | int m = l + r >> 1;
| ~~^~~
tournament.cpp: In static member function 'static int dmtree::_get(int, int, sws*&, int)':
tournament.cpp:50:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
50 | int m = l + r >> 1;
| ~~^~~
tournament.cpp: In constructor 'mxtree::mxtree(int)':
tournament.cpp:65:12: warning: 'mxtree::n' will be initialized after [-Wreorder]
65 | const int n;
| ^
tournament.cpp:64:7: warning: 'sws* mxtree::rt' [-Wreorder]
64 | sws *rt;
| ^~
tournament.cpp:67:2: warning: when initialized here [-Wreorder]
67 | mxtree(int _n) : n(_n), rt(NULL) {}
| ^~~~~~
tournament.cpp: In static member function 'static void mxtree::_set(int, int, sws*&, int, int)':
tournament.cpp:75:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
75 | int m = l + r >> 1;
| ~~^~~
tournament.cpp: In static member function 'static int mxtree::_get(int, int, sws*&, int, int)':
tournament.cpp:84:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
84 | int m = l + r >> 1;
| ~~^~~
tournament.cpp: In constructor 'sptree::sptree(int)':
tournament.cpp:103:12: warning: 'sptree::n' will be initialized after [-Wreorder]
103 | const int n;
| ^
tournament.cpp:102:7: warning: 'sws* sptree::rt' [-Wreorder]
102 | sws *rt;
| ^~
tournament.cpp:104:2: warning: when initialized here [-Wreorder]
104 | sptree(int _n) : n(_n), rt(NULL), dt(dmtree(n)) {};
| ^~~~~~
tournament.cpp:102:7: warning: 'sptree::rt' will be initialized after [-Wreorder]
102 | sws *rt;
| ^~
tournament.cpp:101:9: warning: 'dmtree sptree::dt' [-Wreorder]
101 | dmtree dt;
| ^~
tournament.cpp:104:2: warning: when initialized here [-Wreorder]
104 | sptree(int _n) : n(_n), rt(NULL), dt(dmtree(n)) {};
| ^~~~~~
tournament.cpp: In static member function 'static void sptree::_set(int, int, sws*&, int, int)':
tournament.cpp:112:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
112 | int m = l + r >> 1;
| ~~^~~
tournament.cpp: In static member function 'static int sptree::_get(int, int, sws*&, int)':
tournament.cpp:121:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
121 | int m = l + r >> 1;
| ~~^~~
tournament.cpp: In constructor 'sptree::sptree(int)':
tournament.cpp:104:46: warning: '*<unknown>.sptree::n' is used uninitialized in this function [-Wuninitialized]
104 | sptree(int _n) : n(_n), rt(NULL), dt(dmtree(n)) {};
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |