Submission #722094

#TimeUsernameProblemLanguageResultExecution timeMemory
722094danikoynov카니발 티켓 (IOI20_tickets)C++14
41 / 100
1074 ms143916 KiB
#include "tickets.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1510; int N, M, K, used[maxn][maxn], vis[maxn]; vector < vector < int > > answer; vector < int > free_box[maxn]; struct element { ll max_pos, min_pos, delta, row; bool operator < (const element &e) const { return delta < e.delta; } }; struct box { int row, col; ll val; bool operator < (const box &bx) const { return val < bx.val; } }; bool cmp_box(box b1, box b2) { return b1.row < b2.row; } long long find_maximum(int k, vector < vector < int > > x) { N = x.size(); M = x[0].size(); K = k; answer.resize(N); for (int i = 0; i < N; i++) { answer[i].resize(M, - 1); } ll max_prize = 0; if (M == 1 || K == 1) { for (int round = 0; round < k; round ++) { vector < element > arr; for (int i = 0; i < N; i ++) { element cur; cur.row = i; cur.min_pos = cur.max_pos = 0; while(used[i][cur.min_pos] == 1) cur.min_pos ++; cur.max_pos = cur.min_pos; for (int j = 0; j < M; j ++) { if (used[i][j] == 1) continue; if (x[i][j] < x[i][cur.min_pos]) cur.min_pos = j; if (x[i][j] > x[i][cur.max_pos]) cur.max_pos = j; } ///cout << "here " << round << " " << cur.row << " " << cur.max_pos << " " << cur.min_pos << endl; cur.delta = (x[cur.row][cur.max_pos] + x[cur.row][cur.min_pos]); arr.push_back(cur); } sort(arr.begin(), arr.end()); for (int i = 0; i < N; i ++) { element cur = arr[i]; if (i < N / 2) { max_prize = max_prize - x[cur.row][cur.min_pos]; ///cout << cur.row << " :: " << cur.min_pos << endl; used[cur.row][cur.min_pos] = 1; answer[cur.row][cur.min_pos] = round; } else { max_prize = max_prize + x[cur.row][cur.max_pos]; ///cout << cur.row << " :: " << cur.max_pos << endl; used[cur.row][cur.max_pos] = 1; answer[cur.row][cur.max_pos] = round; } } } } else if (M == K) { vector < box > vec; for (int i = 0; i < N; i ++) for (int j = 0; j < M; j ++) { box b; b.row = i; b.col = j; b.val = x[i][j]; vec.push_back(b); } sort(vec.begin(), vec.end()); vector < box > small, big; for (int i = 0; i < vec.size() / 2; i ++) small.push_back(vec[i]); for (int i = vec.size() / 2; i < vec.size(); i ++) big.push_back(vec[i]); sort(small.begin(), small.end(), cmp_box); sort(big.begin(), big.end(), cmp_box); int turn = 0; for (int i = 0; i < small.size(); i ++) { box b = small[i]; answer[b.row][b.col] = turn ++; if (turn == k) turn = 0; max_prize = max_prize - b.val; } for (int i = 0; i < N; i ++) { for (int j = 0; j < M; j ++) { if (answer[i][j] == -1) continue; vis[answer[i][j]] = 1; } for (int j = 0; j < M; j ++) { if (!vis[j]) free_box[i].push_back(j); vis[j] = 0; } } for (int i = 0; i < big.size(); i ++) { box b = big[i]; answer[b.row][b.col] = free_box[b.row].back(); free_box[b.row].pop_back(); max_prize = max_prize + b.val; } } allocate_tickets(answer); return max_prize; }

Compilation message (stderr)

tickets.cpp: In function 'long long int find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:112:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<box>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |         for (int i = 0; i < vec.size() / 2; i ++)
      |                         ~~^~~~~~~~~~~~~~~~
tickets.cpp:114:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<box>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |         for (int i = vec.size() / 2; i < vec.size(); i ++)
      |                                      ~~^~~~~~~~~~~~
tickets.cpp:120:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<box>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  120 |         for (int i = 0; i < small.size(); i ++)
      |                         ~~^~~~~~~~~~~~~~
tickets.cpp:146:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<box>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  146 |         for (int i = 0; i < big.size(); i ++)
      |                         ~~^~~~~~~~~~~~
#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...