Submission #1489482
Source Code Expand
#include <cstdio>
#include <algorithm>
#include <set>
#include <utility>
static const int MAXN = 2e5 + 4;
static const int LOGN = 18;
int n;
int a[MAXN], p[MAXN];
int b[MAXN], top = 0;
struct quq {
int first, second;
quq(int f = 0, int s = 0) : first(f), second(s) { }
inline bool operator < (const quq &other) const {
return (this->first == other.first) ?
(this->second < other.second) : (this->first < other.first);
}
};
struct rmq {
quq f[LOGN][MAXN];
inline void build(int n, int *a) {
for (int i = 0; i < n; ++i) f[0][i] = quq(a[i], i);
for (int j = 1; j < LOGN; ++j)
for (int i = 0; i <= n - (1 << j); ++i)
f[j][i] = std::min(f[j - 1][i], f[j - 1][i + (1 << (j - 1))]);
}
inline quq query(int l, int r) {
if (l == r) return f[0][l];
int sz = 8 * sizeof(int) - __builtin_clz(r - l) - 1;
return std::min(f[sz][l], f[sz][r - (1 << sz) + 1]);
}
} all, even, odd;
struct cmp_peek {
inline bool operator () (const std::pair<int, int> a, const std::pair<int, int> b)
{
int ua = ((a.first & 1) ? odd : even).query(a.first, a.second).first;
int ub = ((b.first & 1) ? odd : even).query(b.first, b.second).first;
return ua < ub;
}
};
std::set<std::pair<int, int>, cmp_peek> s;
void solve(int l, int r)
{
auto u = ((l & 1) ? odd : even).query(l, r);
auto v = ((r & 1) ? odd : even).query(u.second, r);
int pu = u.second, pv = v.second;
b[top++] = u.first;
b[top++] = v.first;
if (l <= pu - 1) s.insert(std::make_pair(l, pu - 1));
if (pu + 1 <= pv - 1) s.insert(std::make_pair(pu + 1, pv - 1));
if (pv + 1 <= r) s.insert(std::make_pair(pv + 1, r));
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; ++i) scanf("%d", &a[i]), p[--a[i]] = i;
all.build(n, a);
for (int i = 0; i < n; ++i) b[i] = (i & 1) ? MAXN : a[i];
even.build(n, b);
for (int i = 0; i < n; ++i) b[i] = (i & 1) ? a[i] : MAXN;
odd.build(n, b);
s.insert(std::make_pair(0, n - 1));
while (!s.empty()) {
auto r = *s.begin(); s.erase(s.begin());
solve(r.first, r.second);
}
for (int i = 0; i < n; ++i) printf("%d%c", b[i] + 1, i == n - 1 ? '\n' : ' ');
return 0;
}
Submission Info
Submission Time
2017-08-06 21:55:59+0900
Task
E - Young Maids
User
cyand1317
Language
C++14 (GCC 5.4.1)
Score
800
Code Size
2366 Byte
Status
AC
Exec Time
150 ms
Memory
90112 KB
Compile Error
./Main.cpp: In function ‘int main()’:
./Main.cpp:61:20: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &n);
^
./Main.cpp:62:66: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
for (int i = 0; i < n; ++i) scanf("%d", &a[i]), p[--a[i]] = i;
^
Judge Result
Set Name
Sample
All
Score / Max Score
0 / 0
800 / 800
Status
Set Name
Test Cases
Sample
0_00.txt, 0_01.txt, 0_02.txt
All
0_00.txt, 0_01.txt, 0_02.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt, 1_18.txt, 1_19.txt
Case Name
Status
Exec Time
Memory
0_00.txt
AC
26 ms
86272 KB
0_01.txt
AC
26 ms
86272 KB
0_02.txt
AC
26 ms
86272 KB
1_00.txt
AC
26 ms
86272 KB
1_01.txt
AC
26 ms
86272 KB
1_02.txt
AC
88 ms
88192 KB
1_03.txt
AC
88 ms
88192 KB
1_04.txt
AC
88 ms
88192 KB
1_05.txt
AC
141 ms
89856 KB
1_06.txt
AC
137 ms
89600 KB
1_07.txt
AC
145 ms
90112 KB
1_08.txt
AC
139 ms
89600 KB
1_09.txt
AC
93 ms
88192 KB
1_10.txt
AC
91 ms
88192 KB
1_11.txt
AC
94 ms
88192 KB
1_12.txt
AC
141 ms
89600 KB
1_13.txt
AC
150 ms
89728 KB
1_14.txt
AC
144 ms
89600 KB
1_15.txt
AC
145 ms
89728 KB
1_16.txt
AC
145 ms
89728 KB
1_17.txt
AC
146 ms
89728 KB
1_18.txt
AC
145 ms
89600 KB
1_19.txt
AC
144 ms
89600 KB