Submission #1267496
Source Code Expand
#pragma GCC optimize ("Ofast")
#include <bits/stdc++.h>
using namespace std;
#define rep(i, from, to) for (int i = from; i < (to); ++i)
#define trav(a, x) for (auto& a : x)
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
struct Node {
Node *l = 0, *r = 0;
int val, y;
int first, max;
bool monotone;
Node(int val) : val(val), y(rand()) {
first = max = val;
monotone = 1;
}
void reset() {
first = max = val;
monotone = 1;
}
void recalc();
void recalc3();
};
inline void Node::recalc() {
first = l ? l->first : val;
int max = val;
bool mon = 1;
if (l) {
max = std::max(max, l->max);
if (!l->monotone || l->max > val) mon = 0;
}
if (r) {
max = std::max(max, r->max);
if (mon && (!r->monotone || r->first < val)) mon = 0;
}
this->max = max;
monotone = mon;
}
inline void Node::recalc3() {
first = l ? l->first : val;
int max = val;
if (l) {
max = std::max(max, l->max);
}
if (r) {
max = std::max(max, r->max);
}
this->max = max;
monotone = 1;
}
Node* merge2(Node* l, Node* r) {
if (l->y > r->y) {
l->r = l->r ? merge2(l->r, r) : r;
l->recalc();
return l;
} else {
r->l = r->l ? merge2(l, r->l) : l;
r->recalc();
return r;
}
}
inline Node* merge(Node* l, Node* r) {
if (!l) return r;
if (!r) return l;
return merge2(l, r);
}
Node* merge32(Node* l, Node* r) {
if (l->y > r->y) {
l->r = l->r ? merge32(l->r, r) : r;
l->recalc3();
return l;
} else {
r->l = r->l ? merge32(l, r->l) : l;
r->recalc3();
return r;
}
}
inline Node* merge3(Node* l, Node* r) {
if (!l) return r;
if (!r) return l;
return merge32(l, r);
}
pair<Node*, Node*> split2(Node* n, int lo) {
if (!n) return {0, 0};
if (n->max < lo) return {0, n};
if (n->monotone) {
if (lo < n->first) return {n, 0};
if (!n->l) {
if (!n->r) return {0, n};
assert(lo >= n->val);
auto pa = split2(n->r, lo);
n->r = 0;
n->reset();
pa.second = merge(n, pa.second);
return pa;
}
if (lo < n->val) {
auto pa = split2(n->l, lo);
n->l = 0;
n->recalc();
pa.first = merge3(pa.first, n);
return pa;
}
else {
// if (!n->r) return {0, n};
auto pa = split2(n->r, lo);
n->r = 0;
n->recalc();
pa.second = merge(n, pa.second);
return pa;
}
}
Node *left = n->l, *right = n->r;
n->l = n->r = 0;
n->recalc();
auto pa = split2(left, lo);
if (pa.first) lo = pa.first->max;
if (n->val > lo) {
pa.first = merge3(pa.first, n);
lo = n->val;
}
else {
pa.second = merge(pa.second, n);
}
auto pa2 = split2(right, lo);
return {merge3(pa.first, pa2.first), merge(pa.second, pa2.second)};
}
int main() {
srand(2);
cin.sync_with_stdio(false);
cin.exceptions(cin.failbit);
int N;
cin >> N;
vector<Node> nodes;
rep(i,0,N) {
int p;
cin >> p;
nodes.emplace_back(p);
}
Node* t = 0;
rep(i,0,N)
t = merge(t, &nodes[i]);
int res = 0;
while (!t->monotone) {
++res;
auto pa = split2(t, 0);
t = merge(pa.second, pa.first);
}
cout << res << endl;
exit(0);
}
Submission Info
Submission Time |
|
Task |
F - Strange Sorting |
User |
simonlindholm |
Language |
C++14 (GCC 5.4.1) |
Score |
2400 |
Code Size |
3228 Byte |
Status |
AC |
Exec Time |
1599 ms |
Memory |
12652 KB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
2400 / 2400 |
Status |
|
|
Set Name |
Test Cases |
Sample |
sample1.txt, sample2.txt, sample3.txt |
All |
sample1.txt, sample2.txt, sample3.txt, in1.txt, in10.txt, in11.txt, in12.txt, in13.txt, in14.txt, in15.txt, in16.txt, in17.txt, in18.txt, in19.txt, in2.txt, in20.txt, in21.txt, in22.txt, in23.txt, in3.txt, in4.txt, in5.txt, in6.txt, in7.txt, in8.txt, in9.txt, sample1.txt, sample2.txt, sample3.txt |
Case Name |
Status |
Exec Time |
Memory |
in1.txt |
AC |
1527 ms |
12140 KB |
in10.txt |
AC |
1591 ms |
11116 KB |
in11.txt |
AC |
1560 ms |
10988 KB |
in12.txt |
AC |
1552 ms |
11756 KB |
in13.txt |
AC |
1554 ms |
10988 KB |
in14.txt |
AC |
1585 ms |
11244 KB |
in15.txt |
AC |
1559 ms |
11756 KB |
in16.txt |
AC |
1586 ms |
11500 KB |
in17.txt |
AC |
1584 ms |
12268 KB |
in18.txt |
AC |
1543 ms |
12652 KB |
in19.txt |
AC |
1557 ms |
10860 KB |
in2.txt |
AC |
1560 ms |
11628 KB |
in20.txt |
AC |
1599 ms |
12012 KB |
in21.txt |
AC |
39 ms |
11628 KB |
in22.txt |
AC |
175 ms |
11756 KB |
in23.txt |
AC |
1 ms |
256 KB |
in3.txt |
AC |
1540 ms |
12652 KB |
in4.txt |
AC |
1581 ms |
12652 KB |
in5.txt |
AC |
1575 ms |
11884 KB |
in6.txt |
AC |
1576 ms |
11372 KB |
in7.txt |
AC |
1515 ms |
12652 KB |
in8.txt |
AC |
1591 ms |
11756 KB |
in9.txt |
AC |
1515 ms |
12524 KB |
sample1.txt |
AC |
1 ms |
256 KB |
sample2.txt |
AC |
1 ms |
256 KB |
sample3.txt |
AC |
1 ms |
256 KB |