#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define fast ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
#define MOD 1000000007
#define inf 1e18
#define fi first
#define se second
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FORD(i,a,b) for(int i=a;i>=b;i--)
#define sz(a) ((int)(a).size())
#define endl '\n'
#define pi 3.14159265359
#define TASKNAME "olympiad"
using namespace std;
template<typename T> bool maximize(T &res, const T &val) { if (res < val){ res = val; return true; }; return false; }
template<typename T> bool minimize(T &res, const T &val) { if (res > val){ res = val; return true; }; return false; }
typedef pair<int,int> ii;
typedef pair<int,ii> iii;
typedef vector<int> vi;
const int MAXN = 5e5 + 9;
int n, k, c;
int a[MAXN][7];
namespace subtask1{
bool check(){
return n <= 500 and k <= 2 and c <= 2000;
}
vector<int> listVal;
void solve(){
FOR(i, 1, n){
FOR(j, i + 1, n){
int p = 0;
FOR(t, 1, k){
p += max(a[i][t], a[j][t]);
}
listVal.pb(p);
}
}
sort(listVal.rbegin(), listVal.rend());
cout << listVal[c - 1] << ' ';
}
}
namespace subtask2{
bool check(){
return n <= 40 or (n <= 500 and k <= 2);
}
int cnt[6000009];
vector<int> curTeam, listVal, sortedListVal;
int getScore(){
int ans = 0;
FOR(i, 1, k){
int cur = 0;
FOR(j, 0, (int) curTeam.size() - 1){
maximize(cur, a[curTeam[j]][i]);
}
ans += cur;
}
return ans;
}
void backtrack(int pos){
if (curTeam.size() == k){
listVal.pb(getScore());
return;
}
if (pos == n + 1){
return;
}
backtrack(pos + 1);
curTeam.pb(pos);
backtrack(pos + 1);
curTeam.pop_back();
}
void solve(){
backtrack(1);
sortedListVal.resize(listVal.size() + 9);
FOR(i, 0, (int) listVal.size() - 1){
cnt[listVal[i]]++;
}
FORD(i, 6000000, 0){
cnt[i] += cnt[i + 1];
}
FOR(i, 0, (int) listVal.size() - 1){
sortedListVal[--cnt[listVal[i]]] = listVal[i];
}
cout << sortedListVal[c - 1] << endl;
}
}
/**
dp[5000][10][10][10][10][10][10][7]
**/
namespace subtask3{
bool check(){
FOR(i, 1, n){
FOR(j, 1, k){
if (a[i][j] > 10) return false;
}
}
return true;
return n <= 500 and k <= 6 and c <= 2000;
}
/**
aij <= 10. Số điểm của ta <= 60.
Ta chỉ có tối đa 10^6 cấu hình thỏa mãn. Việc của ta bây giờ là đếm số cấu hình thỏa mãn 1 biểu thức.
Giả sử ta có cấu hình là: x1 x2 x3 x4 x5 x6
Thì tất cả các thằng của ta thỏa mãn:
<=> ai1 ai2 ai3 ai4 ai5 ai6
và tồn tại 1 i sao cho aij = xj với mọi thằng j.
Bao hàm bù trừ:
Cái trạng thái mà tất
**/
vector<int> ord;
bitset<501> b[7][12];
int C(int n, int k){
int res = 1;
if (n < k) return 0;
FOR(i, n - k + 1, n){
res *= i;
res /= (i - n + k);
}
return res;
}
vector<int> listScore[60];
vector<int> currentScore;
int cntValid(vector<int> &listScore){
int res = 0;
bitset<501> unite;
FOR(i, 1, k){
if (i == 1) unite = b[i][listScore[i - 1]];
else unite &= b[i][listScore[i - 1]];
}
return C(unite.count(), k);
}
int countSolution(vector<int> &listScore){
int ans = cntValid(listScore);
FOR(i, 1, (1 << k) - 1){
FOR(j, 0, k - 1){
if (i & (1 << j)){
listScore[j]--;
}
}
int v = cntValid(listScore);
if (__builtin_popcount(i)&1) ans -= v;
else ans += v;
FOR(j, 0, k - 1){
if (i & (1 << j)){
listScore[j]++;
}
}
}
return ans;
}
void backtrack(int pos){
if (pos == k + 1) {
int sum = 0;
FOR(i, 0, (int) currentScore.size() - 1) sum += currentScore[i];
listScore[sum].pb(countSolution(currentScore));
return;
}
FORD(i, 10, 0){
currentScore.pb(i);
backtrack(pos + 1);
currentScore.pop_back();
}
}
void solve(){
FOR(i, 1, n){
FOR(j, 1, k){
FOR(t, a[i][j], 10){
b[j][t][i] = 1;
}
}
}
backtrack(1);
FORD(i, k * 10, 0){
for(auto cnt: listScore[i]){
if (c <= cnt){
cout << i << endl;
exit(0);
}
else c -= cnt;
}
}
}
}
main()
{
fast;
if (fopen(TASKNAME".inp","r")){
freopen(TASKNAME".inp","r",stdin);
freopen(TASKNAME".out","w",stdout);
}
cin>> n>> k >> c;
FOR(i, 1, n){
FOR(j, 1, k){
cin >> a[i][j];
}
}
// if (subtask1::check()) return subtask1::solve(), 0;
if (subtask2::check()) return subtask2::solve(), 0;
if (subtask3::check()) return subtask3::solve(), 0;
}
/**
Warning:
Đọc sai đề???
Cận lmao
Code imple thiếu case nào không.
Limit.
**/
Compilation message (stderr)
olympiads.cpp:217:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
217 | main()
| ^~~~
olympiads.cpp: In function 'int main()':
olympiads.cpp:221:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
221 | freopen(TASKNAME".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
olympiads.cpp:222:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
222 | freopen(TASKNAME".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |