QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#198579 | #5143. Quick Sort | bigJ | TL | 3892ms | 3728kb | C++20 | 4.7kb | 2023-10-03 15:01:07 | 2023-10-03 15:01:08 |
Judging History
answer
#include <bits/stdc++.h>
template<typename T, std::size_t N> std::istream& operator>>(std::istream& is, std::array<T, N>& v) { for (auto& i : v) is >> i; return is; }
template<typename T, std::size_t N> std::ostream& operator<<(std::ostream& os, std::array<T, N>& v) { for (auto& i : v) os << i << ' '; return os; }
template<typename T> std::istream& operator>>(std::istream& is, std::vector<T>& v) { for (auto& i : v) is >> i; return is; }
template<typename T> std::ostream& operator<<(std::ostream& os, std::vector<T>& v) { for (auto& i : v) os << i << ' '; return os; }
template<typename...Args> void debug(Args...args) { ((std::cerr << args << ' '), ...); std::cerr << '\n'; }
template<typename...Args> void println(Args...args) { ((std::cout << args << ' '), ...); std::cout << '\n'; }
using i64 = long long;
template <class Info>
struct SegmentTree {
#define m (l + r) / 2
int n;
std::vector<Info> tr;
SegmentTree() : n(0) {}
SegmentTree(int n_, Info v_ = Info()) {
init(n_, v_);
}
template<class T>
SegmentTree(std::vector<T> init_) {
init(init_);
}
void init(int n_, Info v_ = Info()) {
init(std::vector(n_, v_));
}
template<class T>
void init(std::vector<T> init_) {
n = init_.size();
tr.assign(4 << std::__lg(n), Info());
std::function<void(int, int, int)> build = [&](int p, int l, int r) {
if (r - l == 1) {
tr[p] = { init_[l] };
return;
}
build(2 * p, l, m);
build(2 * p + 1, m, r);
pull(p);
};
build(1, 0, n);
}
void pull(int p) {
tr[p] = tr[2 * p] + tr[2 * p + 1];
}
void modify(int p, int l, int r, int x, const Info& v) {
if (r - l == 1) {
tr[p] = v;
return;
}
if (x < m) {
modify(2 * p, l, m, x, v);
}
else {
modify(2 * p + 1, m, r, x, v);
}
pull(p);
}
void modify(int x, const Info& v) {
modify(1, 0, n, x, v);
}
Info rangeQuery(int p, int l, int r, int x, int y) {
if (l >= y || r <= x) {
return Info();
}
if (l >= x && r <= y) {
return tr[p];
}
return rangeQuery(2 * p, l, m, x, y) + rangeQuery(2 * p + 1, m, r, x, y);
}
Info rangeQuery(int l, int r) {
return rangeQuery(1, 0, n, l, r);
}
#undef m
};
struct Info {
int mx, mn;
Info(int x) :mx(x), mn(x) {}
Info() :mx(-1e9), mn(1e9) {}
Info(int mx, int mn) :mx(mx), mn(mn) {}
friend Info operator+(const Info& a, const Info& b) {
return Info(std::max(a.mx, b.mx), std::min(a.mn, b.mn));
}
};
constexpr int N = 5e5;
int maple[N];
SegmentTree<Info> seg;
int res = 0;
int work(std::vector<int>& a, int l, int r) {
int m = a[(l + r) / 2];
int i = l - 1, j = r + 1;
while (true) {
i++, j--;
auto work1 = [&]() {
int lo = i, hi = a.size() - 1;
while (lo < hi) {
int mid = (lo + hi) / 2;
if (seg.rangeQuery(i, mid + 1).mx >= m) {
hi = mid;
}
else {
lo = mid + 1;
}
}
return lo;
};
auto work2 = [&]() {
int lo = 1, hi = j;
while (lo < hi) {
int mid = (lo + hi + 1) / 2;
if (seg.rangeQuery(mid, j + 1).mn <= m) {
lo = mid;
}
else {
hi = mid - 1;
}
}
return lo;
};
std::tie(i, j) = std::pair(work1(), work2());
if (i >= j) {
return j;
}
else {
auto [u, v] = std::pair(a[i], a[j]);
seg.modify(i, a[j]);
seg.modify(j, a[i]);
std::swap(a[i], a[j]);
res++;
}
}
return -1;
}
void quickSort(std::vector<int>& a, int l, int r) {
if (l >= 0 && r >= 0 && l < r) {
int m = work(a, l, r);
quickSort(a, l, m);
quickSort(a, m + 1, r);
}
}
auto solve() {
int n;
std::cin >> n;
std::vector<int> a(n + 1, -1);
for (int i = 1; i <= n; i++) {
std::cin >> a[i];
a[i]--;
maple[a[i]] = i;
}
seg.init(a);
quickSort(a, 1, n);
std::cout << res << "\n";
}
int main() {
std::cin.tie(nullptr);
std::ios::sync_with_stdio(false);
int c = 1;
std::cin >> c;
for (int i = 1; i <= c; i++) {
res = 0;
solve();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3432kb
input:
3 3 3 2 1 5 2 4 5 3 1 10 7 2 4 6 1 9 10 8 5 3
output:
1 4 7
result:
ok 3 number(s): "1 4 7"
Test #2:
score: 0
Accepted
time: 71ms
memory: 3440kb
input:
100000 4 3 4 2 1 5 5 4 1 3 2 4 3 1 4 2 4 4 2 1 3 4 1 3 2 4 4 4 2 3 1 4 3 2 1 4 5 1 2 3 4 5 5 5 2 3 1 4 5 1 3 5 4 2 5 4 3 2 1 5 5 3 4 2 1 5 5 5 4 3 2 1 4 3 4 2 1 5 4 2 5 1 3 5 4 1 5 2 3 4 3 4 1 2 4 2 1 3 4 5 4 3 2 5 1 4 4 2 1 3 5 3 1 5 2 4 4 4 1 2 3 5 1 5 2 4 3 5 4 1 3 5 2 5 4 2 3 5 1 5 1 2 3 4 5 5 4...
output:
3 4 3 2 1 1 1 0 2 2 2 3 2 3 2 3 2 1 3 2 4 3 2 3 2 0 4 2 4 1 3 2 3 2 2 1 3 1 1 2 4 3 2 3 1 1 1 3 3 3 4 4 2 3 3 2 3 3 3 2 1 1 2 3 1 3 1 1 3 4 2 2 4 1 1 3 2 2 2 2 1 3 4 4 3 4 2 2 1 3 2 3 2 3 3 2 1 4 2 3 4 1 2 2 3 2 2 3 2 2 2 2 4 1 2 3 2 2 2 2 3 2 3 4 3 2 3 4 2 4 1 3 2 3 4 3 3 4 1 2 4 3 2 4 2 3 3 1 2 2 ...
result:
ok 100000 numbers
Test #3:
score: 0
Accepted
time: 103ms
memory: 3448kb
input:
50000 10 3 1 2 10 6 8 5 4 7 9 10 8 3 9 2 10 4 5 1 7 6 9 6 8 4 9 5 7 1 3 2 9 6 7 9 3 8 5 2 1 4 10 7 10 1 2 6 5 3 9 4 8 10 1 10 4 3 2 9 7 8 5 6 9 1 5 3 4 9 6 7 2 8 10 4 7 2 8 3 6 9 5 10 1 9 6 4 9 1 8 5 2 3 7 10 5 1 7 8 10 3 9 6 2 4 9 4 8 6 3 9 7 5 2 1 9 9 1 7 6 2 3 8 5 4 10 5 7 2 1 4 3 6 8 9 10 10 9 7...
output:
8 8 8 8 9 5 3 8 8 9 9 8 7 9 8 9 6 8 8 7 7 11 7 6 9 8 3 6 8 8 6 7 8 4 8 6 6 8 5 6 7 6 7 5 5 6 9 5 9 10 6 7 8 9 4 9 6 7 8 8 9 9 5 7 6 6 10 9 8 6 4 8 6 10 4 9 9 6 9 6 7 7 7 9 6 6 9 8 7 11 9 5 6 8 8 8 8 8 6 4 8 8 5 8 8 8 9 8 8 7 8 7 6 10 9 7 7 7 6 5 5 6 8 9 5 6 7 8 6 7 9 6 7 9 7 7 6 8 9 9 7 7 9 7 8 6 7 ...
result:
ok 50000 numbers
Test #4:
score: 0
Accepted
time: 564ms
memory: 3564kb
input:
5000 94 69 86 59 9 67 89 24 63 14 18 16 11 19 46 23 40 4 55 53 61 30 3 78 29 15 74 32 41 51 13 77 47 66 92 57 45 42 21 62 43 26 1 84 75 71 54 73 36 39 48 88 8 80 64 58 10 60 76 17 70 25 37 38 6 72 91 7 20 68 2 35 44 90 79 50 93 81 94 27 33 5 52 28 82 56 87 31 22 83 34 65 85 49 12 97 44 97 28 56 95 6...
output:
141 146 142 150 149 145 135 144 135 145 141 140 140 134 138 137 156 142 148 146 159 149 148 154 158 152 144 154 140 136 143 152 143 155 149 148 160 153 125 155 152 149 133 130 144 138 136 154 150 141 141 142 139 140 154 152 138 161 150 138 140 143 143 153 133 137 129 145 154 144 159 150 148 132 145 ...
result:
ok 5000 numbers
Test #5:
score: 0
Accepted
time: 1803ms
memory: 3484kb
input:
500 959 670 618 579 212 780 557 380 412 672 951 777 921 684 768 99 952 140 122 139 919 623 17 911 18 880 790 625 505 307 747 801 754 783 146 757 263 285 228 719 640 199 193 105 234 847 842 348 159 823 577 466 954 850 851 643 802 819 317 826 55 617 690 604 229 570 254 759 575 498 240 397 736 864 415 ...
output:
2204 2106 2121 2073 2255 2250 2181 2117 2156 2066 2217 2307 2248 2155 2272 2219 2213 2180 2379 2168 2319 2014 2193 2256 2111 2223 2044 2058 2172 2168 2350 2216 2079 2242 2087 2198 2318 2312 2294 2132 2073 2102 2267 2157 2058 2082 2244 2213 2185 2216 2029 2076 2204 2157 2028 2266 2330 2236 2232 2051 ...
result:
ok 500 numbers
Test #6:
score: 0
Accepted
time: 3892ms
memory: 3728kb
input:
50 9597 2421 5801 7761 5556 4158 3033 4751 9284 3326 1858 2849 8472 5917 6077 4438 1948 5294 3028 4716 8042 2671 5305 5076 6924 5569 8173 6362 2160 3095 7385 1374 3167 8128 551 2363 1371 5799 3273 1366 5050 7680 198 5577 1236 2843 1127 5381 3029 6977 4823 702 8077 528 526 7027 4278 7947 6058 5005 90...
output:
29310 28096 27809 27929 30189 28312 30370 28918 28971 29145 30375 28996 29862 29780 30176 27658 30518 29051 28532 27876 28081 27765 29274 27475 28265 29613 28306 27747 29273 30631 29036 29645 28861 27797 29968 30333 28032 29242 30500 28291 30177 29925 29233 27507 28648 28030 27846 27893 28592 30041
result:
ok 50 numbers
Test #7:
score: -100
Time Limit Exceeded
input:
5 92316 4486 51971 40435 31486 22840 51804 19355 35116 71427 50525 34461 46690 44101 15605 33166 25846 90319 50846 8819 36285 58519 23478 20717 14434 37378 37454 60063 17182 70164 59883 45000 84942 58799 11505 13371 52739 66680 30438 67677 41266 53940 34428 79533 55092 76616 54423 21642 25614 48002 ...