QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#72034#5143. Quick Sortdaniel14311531WA 78ms7876kbC++141.9kb2023-01-13 18:33:312023-01-13 18:33:32

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-01-13 18:33:32]
  • 评测
  • 测评结果:WA
  • 用时:78ms
  • 内存:7876kb
  • [2023-01-13 18:33:31]
  • 提交

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'