답안 #792655

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
792655 2023-07-25T07:52:47 Z GEN 이지후(#10086) Line Town (CCO23_day1problem3) C++17
4 / 25
2000 ms 8148 KB
#include <bits/stdc++.h>
using namespace std;
using lint = long long;
using pi = array<lint, 2>;
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
const int MAXN = 500005;

struct bit {
	int tree[MAXN];
	void add(int x, int v) {
		for (int i = x + 2; i < MAXN; i += i & -i)
			tree[i] += v;
	}
	int query(int x) {
		int ret = 0;
		for (int i = x + 2; i; i -= i & -i)
			ret += tree[i];
		return ret;
	}
} bit;

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin >> n;
	vector<pi> a(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i][0];
		if (i % 2 == 1)
			a[i][0] *= -1;
		a[i][1] = i;
	}
	sort(all(a), [&](const pi &a, const pi &b) { return pi{abs(a[0]), a[1]} < pi{abs(b[0]), b[1]}; });
	lint dp[2] = {0, lint(1e18)};
	for (int i = n - 1; i >= 0;) {
		int j = i;
		while (j >= 0 && abs(a[i][0]) == abs(a[j][0]))
			j--;
		if (abs(a[i][0]) == 0)
			break;
		vector<array<int, 3>> values[2];
		for (int k = j + 1; k <= i; k++) {
			int L = 0, R = 0;
			for (int l = 0; l <= j; l++) {
				if (a[l][1] < a[k][1])
					L++;
				else
					R++;
			}
			if (a[k][0] > 0)
				values[0].push_back({L, R, (int)a[k][1]});
			else
				values[1].push_back({L, R, (int)a[k][1]});
		}
		lint nxt[2] = {lint(1e18), lint(1e18)};
		for (int j = 0; j < 2; j++) {
			int LS = (j + 1) % 2;
			int RS = (j + i) % 2;
			int len = sz(values[0]) + sz(values[1]);
			for (int k = 0; k <= len; k++) {
				int pl[2] = {};
				int pr[2] = {sz(values[0]), sz(values[1])};
				lint invs = 0;
				vector<int> seq, seqR;
				for (int l = 0; l < k; l++) {
					int pos = (LS + l) % 2;
					if (pl[pos] < sz(values[pos]))
						seq.push_back(values[pos][pl[pos]][2]);
					pl[pos]++;
				}
				for (int l = 0; l < len - k; l++) {
					int pos = (RS + l) % 2;
					pr[pos]--;
					if (pr[pos] >= 0)
						seqR.push_back(values[pos][pr[pos]][2]);
				}
				reverse(all(seqR));
				for(auto &x : seqR) seq.push_back(x);
				if (pl[0] == pr[0] && pl[1] == pr[1]) {
					lint cost = 0;
					for (int i = 0; i < sz(seq); i++) {
						for (int j = 0; j < i; j++) {
							if (seq[j] > seq[i])
								cost++;
						}
					}
					for (int i = 0; i < 2; i++) {
						for (int j = 0; j < sz(values[i]); j++) {
							if (j < pl[i])
								cost += values[i][j][0];
							else
								cost += values[i][j][1];
						}
					}
					nxt[j ^ (k % 2)] = min(nxt[j ^ (k % 2)], dp[j] + cost);
				}
			}
		}
		dp[0] = nxt[0];
		dp[1] = nxt[1];
		i = j;
		// cout << dp[0] << " " << dp[1] << endl;
	}
	lint ans = min(dp[0], dp[1]);
	if (ans > 1e12)
		ans = -1;
	cout << ans << "\n";
}

Compilation message

Main.cpp: In function 'int main()':
Main.cpp:66:10: warning: unused variable 'invs' [-Wunused-variable]
   66 |     lint invs = 0;
      |          ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1256 ms 392 KB Output is correct
5 Correct 1267 ms 396 KB Output is correct
6 Execution timed out 2066 ms 340 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1256 ms 392 KB Output is correct
5 Correct 1267 ms 396 KB Output is correct
6 Execution timed out 2066 ms 340 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1256 ms 392 KB Output is correct
5 Correct 1267 ms 396 KB Output is correct
6 Execution timed out 2066 ms 340 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1256 ms 392 KB Output is correct
5 Correct 1267 ms 396 KB Output is correct
6 Execution timed out 2066 ms 340 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 2 ms 340 KB Output is correct
4 Correct 5 ms 340 KB Output is correct
5 Correct 6 ms 340 KB Output is correct
6 Correct 5 ms 340 KB Output is correct
7 Correct 5 ms 360 KB Output is correct
8 Correct 5 ms 340 KB Output is correct
9 Correct 0 ms 224 KB Output is correct
10 Correct 0 ms 212 KB Output is correct
11 Correct 2 ms 340 KB Output is correct
12 Correct 3 ms 340 KB Output is correct
13 Correct 2 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 2 ms 340 KB Output is correct
4 Correct 5 ms 340 KB Output is correct
5 Correct 6 ms 340 KB Output is correct
6 Correct 5 ms 340 KB Output is correct
7 Correct 5 ms 360 KB Output is correct
8 Correct 5 ms 340 KB Output is correct
9 Correct 0 ms 224 KB Output is correct
10 Correct 0 ms 212 KB Output is correct
11 Correct 2 ms 340 KB Output is correct
12 Correct 3 ms 340 KB Output is correct
13 Correct 2 ms 340 KB Output is correct
14 Execution timed out 2045 ms 8148 KB Time limit exceeded
15 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1256 ms 392 KB Output is correct
5 Correct 1267 ms 396 KB Output is correct
6 Execution timed out 2066 ms 340 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1256 ms 392 KB Output is correct
5 Correct 1267 ms 396 KB Output is correct
6 Execution timed out 2066 ms 340 KB Time limit exceeded
7 Halted 0 ms 0 KB -