답안 #387578

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
387578 2021-04-09T02:17:10 Z casperwang Table Tennis (info1cup20_tabletennis) C++14
100 / 100
627 ms 40876 KB
#include <bits/stdc++.h>
using namespace std;
#define debug(args...) kout("[ " + string(#args) + " ]", args)
void kout() { cerr << endl; }
template <class T, class ...U> void kout(T a, U ...b) { cerr << a << ' ',kout(b...); }
template <class T> void pary(T L, T R) { while (L != R) cerr << *L << " \n"[++L==R]; }

const int MAXN = 150000;
const int MAXK = 400;
const int B = 1000;
int N, K;
int a[MAXN+MAXK+1];
bool flag[MAXN+MAXK+1];
unordered_map <int,int> arr;

bool check(int S) {
	int nowR = N+K, cnt = 0;
	for (int i = 1; i <= N+K; i++) flag[i] = false;
	for (int i = 1; i < nowR; i++) {
		while (a[i] + a[nowR] > S && nowR > i)
			nowR--;
		if (nowR > i && a[i] + a[nowR] == S) {
			flag[i] = flag[nowR] = true;
			cnt++;
			nowR--;
		}
		if (cnt == N / 2) break;
	}
	return cnt == N / 2;
}

void solve() {
	for (int i = 1; i <= B+1; i++) {
		for (int j = N+K-B; j <= N+K; j++) {
			if (i < j) arr[a[i] + a[j]]++;
		}
	}
	for (auto [v, c] : arr) {
		if (c >= 400 && check(v)) {
			return;
		}
	}
}

void naive() {
	for (int L = 1; L <= K+1; L++) {
		for (int R = N; R <= N+K; R++) {
			if (R-L+1 < N) continue;
			fill(flag+1, flag+1+N+K, false);
			int S = a[L] + a[R], cnt = 1;
			flag[L] = flag[R] = true;
			int nowR = R-1;
			for (int i = L+1; i < nowR; i++) {
				while (a[i] + a[nowR] > S && nowR > i)
					nowR--;
				if (a[i] + a[nowR] == S) {
					flag[i] = flag[nowR] = true;
					cnt++;
					nowR--;
				}
			}
			if (cnt == N / 2) return;
		}
	}
}

signed main() {
	ios_base::sync_with_stdio(0), cin.tie(0);
	cin >> N >> K;
	for (int i = 1; i <= N+K; i++) {
		cin >> a[i];
	}
	if (N+K <= B) {
		naive();
	} else {
		solve();
	}
	for (int i = 1; i <= N+K; i++) {
		if (flag[i]) cout << a[i] << ' ';
	}
	cout << '\n';
	return 0;
}

Compilation message

tabletennis.cpp: In function 'void solve()':
tabletennis.cpp:38:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   38 |  for (auto [v, c] : arr) {
      |            ^
# 결과 실행 시간 메모리 Grader output
1 Correct 211 ms 20272 KB Output is correct
2 Correct 19 ms 448 KB Output is correct
3 Correct 395 ms 30812 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 39 ms 648 KB Output is correct
2 Correct 563 ms 39316 KB Output is correct
3 Correct 575 ms 39404 KB Output is correct
4 Correct 611 ms 39292 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 191 ms 2652 KB Output is correct
2 Correct 422 ms 35076 KB Output is correct
3 Correct 258 ms 2628 KB Output is correct
4 Correct 438 ms 33672 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 2 ms 204 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 2 ms 204 KB Output is correct
5 Correct 0 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 1 ms 256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 22 ms 1228 KB Output is correct
3 Correct 552 ms 37244 KB Output is correct
4 Correct 383 ms 30852 KB Output is correct
5 Correct 28 ms 1300 KB Output is correct
6 Correct 24 ms 732 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 554 ms 39276 KB Output is correct
3 Correct 477 ms 34348 KB Output is correct
4 Correct 210 ms 3396 KB Output is correct
5 Correct 391 ms 33032 KB Output is correct
6 Correct 196 ms 2852 KB Output is correct
7 Correct 79 ms 3288 KB Output is correct
8 Correct 55 ms 3340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 617 ms 39024 KB Output is correct
3 Correct 627 ms 40876 KB Output is correct
4 Correct 482 ms 37940 KB Output is correct
5 Correct 272 ms 10248 KB Output is correct
6 Correct 94 ms 2820 KB Output is correct
7 Correct 465 ms 35012 KB Output is correct
8 Correct 454 ms 36420 KB Output is correct