제출 #722140

#제출 시각아이디문제언어결과실행 시간메모리
722140danikoynov카니발 티켓 (IOI20_tickets)C++14
100 / 100
811 ms98216 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]; ll dp[310][310 * 310]; vector < vector < int > > answer; vector < int > free_box[maxn]; struct element { ll 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; } int pt[maxn], type[maxn][maxn]; long long find_maximum(int k, vector < vector < int > > x) { N = x.size(); M = x[0].size(); K = k; ll max_val = 0; for (int i = 0; i < N; i ++) for (int j = 0; j < M; j ++) max_val = max(max_val, (ll)(x[i][j])); answer.resize(N); for (int i = 0; i < N; i++) { answer[i].resize(M, - 1); } ll max_prize = 0; priority_queue < element > pq; for (int i = 0; i < N; i ++) { pt[i] = 0; for (int j = M - 1; j >= M - k; j --) { max_prize += x[i][j]; type[i][j] = 1; } element cur; cur.row = i; cur.delta = x[i][M - k] + x[i][0]; pq.push(cur); } for (int step = 0; step < N * k / 2; step ++) { element cur = pq.top(); pq.pop(); max_prize -= cur.delta; type[cur.row][M - k + pt[cur.row]] = 0; type[cur.row][pt[cur.row]] = -1; pt[cur.row] ++; if (pt[cur.row] < k) { cur.delta = x[cur.row][M - k + pt[cur.row]] + x[cur.row][pt[cur.row]]; pq.push(cur); } } vector < box > small, big; for (int i = 0; i < N; i ++) for (int j = 0; j < M; j ++) { if (type[i][j] == 0) continue; box b; b.row = i; b.col = j; b.val = x[i][j]; ///cout << i << " " << j << endl; if (type[i][j] == -1) small.push_back(b); else big.push_back(b); } 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; } 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 < k; 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(); } allocate_tickets(answer); return max_prize; }

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

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