Submission #499888

# Submission time Handle Problem Language Result Execution time Memory
499888 2021-12-29T22:13:57 Z jesus_coconut Table Tennis (info1cup20_tabletennis) C++17
49 / 100
65 ms 13092 KB
#include <bits/stdc++.h>
#define F first
#define S second
#define pb push_back
#define all(a) begin(a), end(a)
using namespace std;

int n, k;
vector<int> v;
vector<int> dif;
void load() {
	cin >> n >> k;
	v.resize(n + k);
	for (auto &it : v) cin >> it;
}

map<pair<int, int>, pair<int, int>> nxt;

pair<int, int> getnxt(pair<int, int> const &p) {
	if (p.F >= p.S) return p;
	if (dif[p.F+1] != dif[p.S]) return p;
	if (nxt.count(p)) return nxt[p];
	return nxt[p] = getnxt({p.F+1, p.S-1});
}



vector<int> ans;

void getAns(int l, int r) {
	if (l >= r) return;
	ans.clear();
	while (l < r) {
		int cl = dif[l+1];
		int cr = dif[r];
		while (cl != cr && l < r) {
			if (cl < cr) {
				l++;
				cl += dif[l+1];
			} else {
				r--;
				cr += dif[r];
			}
		}
		if (l >= r) break;
		if (cl == cr) {
			ans.pb(v[l]);
			ans.pb(v[r]);
			++l; --r;
		}
		if (ans.size() == n) return;
	}
}

bool solve(int sl, int sr) {
	int l = sl, r = sr;
	if (l >= r) return false;
	ans.clear();
	ans.pb(v[l]);
	ans.pb(v[r]);
	int cnt = n + k - (sr - sl + 1);
	while (l < r) {
		tie(l, r) = getnxt({l, r});
		int cl = dif[l+1];
		int cr = dif[r];
		while (cl != cr && l < r) {
			if (cl < cr) {
				l++;
				cl += dif[l+1];
			} else {
				r--;
				cr += dif[r];
			}
			if (++cnt > k) return false;
		}
		++l; --r;
	}
	getAns(sl, sr);
	return true;
}

void solve() {
	for (int i = 0; i <= k; ++i) {
		for (int j = 0; j <= k - i; ++j) {
			if (solve(i, n + k - 1 - j)) {
				sort(all(ans));
				for (auto &it: ans) cout << it << ' ';
				return;
			};
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	load();
	sort(all(v));
	dif.resize(size(v));
	adjacent_difference(all(v), begin(dif));
	solve();

	return 0;
}

Compilation message

tabletennis.cpp: In function 'void getAns(int, int)':
tabletennis.cpp:51:18: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   51 |   if (ans.size() == n) return;
      |       ~~~~~~~~~~~^~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 460 KB Output is correct
2 Correct 1 ms 460 KB Output is correct
3 Correct 1 ms 460 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 7 ms 2124 KB Output does not have symmetry property
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 51 ms 12988 KB Output is correct
2 Correct 51 ms 13092 KB Output is correct
3 Correct 58 ms 12992 KB Output is correct
4 Correct 53 ms 13056 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 1 ms 292 KB Output is correct
5 Correct 0 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 1 ms 460 KB Output is correct
3 Correct 2 ms 460 KB Output is correct
4 Correct 1 ms 460 KB Output is correct
5 Correct 1 ms 460 KB Output is correct
6 Incorrect 1 ms 460 KB Output does not have symmetry property
# Verdict Execution time Memory Grader output
1 Correct 0 ms 204 KB Output is correct
2 Incorrect 49 ms 10768 KB Output does not have symmetry property
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 236 KB Output is correct
2 Incorrect 65 ms 9816 KB Output does not have symmetry property
3 Halted 0 ms 0 KB -