QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#72034 | #5143. Quick Sort | daniel14311531 | WA | 78ms | 7876kb | C++14 | 1.9kb | 2023-01-13 18:33:31 | 2023-01-13 18:33:32 |
Judging History
answer
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int N = 500010;
int n, a[N], ans;
int mn[N * 4], mx[N * 4];
void pushup(int u) {
mn[u] = min(mn[u * 2], mn[u * 2 + 1]);
mx[u] = max(mx[u * 2], mx[u * 2 + 1]);
}
void build(int u, int l, int r) {
if(l >= r) { mn[u] = mx[u] = a[l]; return ; }
int mid = (l + r) >> 1;
build(u * 2, l, mid), build(u * 2 + 1, mid + 1, r);
pushup(u);
}
void mdy(int u, int l, int r, int x) {
if(l >= r) { mn[u] = mx[u] = a[l]; return ; }
int mid = (l + r) >> 1;
x <= mid ? mdy(u * 2, l, mid, x) : mdy(u * 2 + 1, mid + 1, r, x);
pushup(u);
}
int findl(int u, int l, int r, int L, int R, int w) {
if(mx[u] < w || R < l || L > r) return 0;
if(l >= r) return l;
int mid = (l + r) >> 1;
int res = 0;
if(L <= mid) res = findl(u * 2, l, mid, L, R, w);
if(res) return res;
if(R > mid) res = findl(u * 2 + 1, mid + 1, r, L, R, w);
return res;
}
int findr(int u, int l, int r, int L, int R, int w) {
if(mn[u] > w || R < l || L > r) return 0;
if(l >= r) return l;
int mid = (l + r) >> 1;
int res = 0;
if(R > mid) res = findr(u * 2 + 1, mid + 1, r, L, R, w);
if(res) return res;
if(L <= mid) res = findr(u * 2, l, mid, L, R, w);
return res;
}
void qsort(int l, int r) {
if(l >= r) return ;
int mid = a[(l + r) / 2], pos = (l + r) / 2;
int tl = l, tr = r;
for(;;) {
tl = findl(1, 1, n, tl, r, mid);
tr = findr(1, 1, n, l, tr, mid);
// printf(">>> %d %d : %d %d\n", l, r, tl, tr);
assert(tl && tr);
if(tl >= tr) { pos = tl; break; }
swap(a[tl], a[tr]), ++ans;
mdy(1, 1, n, tl), mdy(1, 1, n, tr);
}
qsort(l, pos), qsort(pos + 1, r);
}
void solve() {
scanf("%d", &n), ans = 0;
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
build(1, 1, n);
qsort(1, n);
printf("%d\n", ans);
}
int main() {
int T; scanf("%d", &T);
for(; T; --T) solve();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 3ms
memory: 7876kb
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: 54ms
memory: 7728kb
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: -100
Wrong Answer
time: 78ms
memory: 7648kb
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 7 8 7 9 8 11 6 8 8 7 7 11 7 6 11 8 3 6 8 6 6 7 10 4 8 6 6 8 5 6 7 6 7 5 5 8 9 5 9 10 6 7 8 9 4 9 6 7 8 8 9 7 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 9 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 5 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 ...
result:
wrong answer 11th numbers differ - expected: '9', found: '7'