제출 #552329

#제출 시각아이디문제언어결과실행 시간메모리
552329hoanghq2004카니발 티켓 (IOI20_tickets)C++14
100 / 100
760 ms84056 KiB
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
#pragma GCC optimize ("unroll-loops")
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include "tickets.h"

using namespace __gnu_pbds;
using namespace std;

template <typename T>
using ordered_set = tree <T, null_type, less <T>, rb_tree_tag, tree_order_statistics_node_update>;

mt19937 gen(std :: chrono :: system_clock :: now().time_since_epoch().count());

//static int n;
//static int m;
//static int k;
//static std::vector<std::vector<int>> d;
//static std::vector<std::vector<int>> x;
//static int called = 0;
//
//static void check(bool cond, std::string message) {
//    if (!cond) {
//        printf("%s\n", message.c_str());
//        exit(0);
//    }
//}
//
//
//void allocate_tickets( std::vector<std::vector<int>> _d) {
//    check(!called, "allocate_tickets called more than once");
//    d = _d;
//    check((int)d.size() == n, "allocate_tickets called with parameter of wrong size");
//    for (int i = 0; i < n; i++) {
//        check((int)d[i].size() == m, "allocate_tickets called with parameter of wrong size");
//    }
//    called = 1;
//}

long long find_maximum(int k, vector <vector <int> > x) {
	int n = x.size();
	int m = x[0].size();
	vector <vector <int> > ans(n);
	vector <pair <int, int> > tmp;
	long long B = 0;
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < k; ++j) {
            B -= x[i][j];
            tmp.push_back({x[i][j] + x[i][m - k + j], i});
		}
//    cout << B << '\n';
    sort(tmp.begin(), tmp.end(), greater<>());
    vector <int> used(n, 0);
    int cnt = 0;
    for (auto [x, i]: tmp) {
        if (cnt == n * k / 2) break;
        ++used[i];
        ++cnt;
        B += x;
    }
//    cout << B << endl;
    vector <int> c1(n, 0), c2(n, 0);
    for (int i = 0, cur = 0; i < n; ++i) {
        ans[i].assign(m, -1);
        for (int j = m - used[i]; j < m; ++j) {
            ans[i][j] = cur;
            cur = (cur + 1) % k;
        }
        for (int j = 0; j < k - used[i]; ++j) ans[i][j] = (j + cur) % k;
    }
	allocate_tickets(ans);
	return B;
}
//
//
//int main() {
//    assert(scanf("%d %d %d", &n, &m, &k) == 3);
//    x.resize(n);
//    for (int i = 0; i < n; i++) {
//        x[i].resize(m);
//        for (int j=0; j < m; j++) {
//            assert(scanf("%d", &x[i][j]) == 1);
//        }
//    }
//    fclose(stdin);
//    long long answer = find_maximum(k, x);
////    assert(0);
//    check(called, "failure to call allocate_tickets");
//    printf("%lld\n", answer);
//    for (int i = 0; i < n; i++) {
//        for (int j = 0; j < m; j++) {
//            if (j) printf(" ");
//            printf("%d", d[i][j]);
//        }
//        printf("\n");
//    }
//    fclose(stdout);
//    return 0;
//}

컴파일 시 표준 에러 (stderr) 메시지

tickets.cpp: In function 'long long int find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:56:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   56 |     for (auto [x, i]: tmp) {
      |               ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...