답안 #713736

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
713736 2023-03-23T00:42:25 Z tutis Olympiads (BOI19_olympiads) C++17
100 / 100
8 ms 852 KB
/*input
5 4 4
7 0 4 9
3 0 8 4
1 1 3 7
5 1 3 4
4 2 2 9
*/
#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
using ll = long long;
using ull = unsigned long long;
using ld = long double;
template<typename A, typename B>
using omap = tree <A, B, less<A>, rb_tree_tag, tree_order_statistics_node_update>;
template<typename A>
using oset = tree <A, null_type, less<A>, rb_tree_tag, tree_order_statistics_node_update>;
struct llist
{
	int x;
	llist *nxt = NULL;
	llist(llist *nxt, int x): nxt(nxt), x(x)
	{

	}
};
int A[6][500];
int P[6][500];
int N, K, C;
struct shard
{
	llist *forb = NULL;
	int k = 0;
	int score;
	int B[6];
	void eval()
	{
		vector<bool> gal(N, true);
		for (llist *k = forb; k != NULL; k = k->nxt)
			gal[k->x] = false;
		int best[6];
		for (int i = 0; i < K; i++)
			best[i] = 0;
		for (int i = 0; i < k; i++)
		{
			gal[B[i]] = false;
			for (int j = 0; j < K; j++)
				best[j] = max(best[j], A[j][B[i]]);
		}
		for (int j = k; j < K; j++)
		{
			bool fnd = false;
			for (int t = 0; t < N; t++)
			{
				int i = P[j][t];
				if (gal[i])
				{
					gal[i] = false;
					B[j] = i;
					for (int k = j; k < K; k++)
						best[k] = max(best[k], A[k][i]);
					fnd = true;
					break;
				}
			}
			if (!fnd)
			{
				score = -1;
				return;
			}
		}
		score = 0;
		for (int j = 0; j < K; j++)
			score += best[j];
	}
};
bool operator < (const shard &a, const shard &b)
{
	return a.score < b.score;
}
void solve()
{
	cin >> N >> K >> C;
	for (int i = 0; i < N; i++)
		for (int j = 0; j < K; j++)
			cin >> A[j][i];
	for (int j = 0; j < K; j++)
	{
		for (int i = 0; i < N; i++)
			P[j][i] = i;
		sort(P[j], P[j] + N, [&](int a, int b) {return A[j][a] > A[j][b];});
	}
	priority_queue<shard>Q;
	{
		shard X;
		X.eval();
		Q.push(X);
	}
	for (int t = 1; t <= C - 1; t++)
	{
		shard s = Q.top();
		Q.pop();
		if (s.k < K)
		{
			shard t;
			t.forb = new llist(s.forb, s.B[s.k]);
			for (int j = 0; j < s.k; j++)
				t.B[j] = s.B[j];
			t.k = s.k;
			t.eval();
			Q.push(t);
			for (int f = s.k + 1; f < K; f++)
			{
				shard t1;
				t1.forb = new llist(s.forb, s.B[f]);
				for (int j = 0; j < f; j++)
					t1.B[j] = s.B[j];
				t1.k = f;
				t1.eval();
				Q.push(t1);
			}
		}
	}
	cout << Q.top().score << "\n";
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	solve();
}

Compilation message

olympiads.cpp: In constructor 'llist::llist(llist*, int)':
olympiads.cpp:26:9: warning: 'llist::nxt' will be initialized after [-Wreorder]
   26 |  llist *nxt = NULL;
      |         ^~~
olympiads.cpp:25:6: warning:   'int llist::x' [-Wreorder]
   25 |  int x;
      |      ^
olympiads.cpp:27:2: warning:   when initialized here [-Wreorder]
   27 |  llist(llist *nxt, int x): nxt(nxt), x(x)
      |  ^~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 340 KB Output is correct
2 Correct 2 ms 340 KB Output is correct
3 Correct 2 ms 340 KB Output is correct
4 Correct 3 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 468 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 2 ms 596 KB Output is correct
4 Correct 2 ms 468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 388 KB Output is correct
2 Correct 3 ms 340 KB Output is correct
3 Correct 3 ms 596 KB Output is correct
4 Correct 4 ms 596 KB Output is correct
5 Correct 4 ms 596 KB Output is correct
6 Correct 1 ms 468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 340 KB Output is correct
2 Correct 2 ms 340 KB Output is correct
3 Correct 2 ms 340 KB Output is correct
4 Correct 3 ms 340 KB Output is correct
5 Correct 2 ms 468 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 2 ms 596 KB Output is correct
8 Correct 2 ms 468 KB Output is correct
9 Correct 3 ms 388 KB Output is correct
10 Correct 3 ms 340 KB Output is correct
11 Correct 3 ms 596 KB Output is correct
12 Correct 4 ms 596 KB Output is correct
13 Correct 4 ms 596 KB Output is correct
14 Correct 1 ms 468 KB Output is correct
15 Correct 2 ms 340 KB Output is correct
16 Correct 4 ms 596 KB Output is correct
17 Correct 8 ms 852 KB Output is correct
18 Correct 2 ms 468 KB Output is correct
19 Correct 3 ms 340 KB Output is correct