제출 #974451

#제출 시각아이디문제언어결과실행 시간메모리
974451LucaIlie카니발 티켓 (IOI20_tickets)C++17
25 / 100
753 ms121516 KiB
#include "tickets.h" #include <bits/stdc++.h> using namespace std; struct cell { int i, j, val; }; const int MAX_N = 1500; const int MAX_M = 1500; const long long INF = 1e15; int x[MAX_N + 1][MAX_M + 1]; long long sx[MAX_N + 1][MAX_M + 1]; vector<int> mins[MAX_N + 1], maxs[MAX_N + 1], minTake[MAX_N + 1], maxTake[MAX_N + 1]; bool isMax[MAX_N + 1]; vector<cell> cells; long long find_maximum( int k, vector<vector<int>> X ) { int n = X.size(); int m = X[0].size(); vector<vector<int>> answer( n ); long long sum = 0; for ( int i = 1; i <= n; i++ ) { answer[i - 1].resize( m ); for ( int j = 1; j <= m; j++ ) { x[i][j] = X[i - 1][j - 1]; sx[i][j] = sx[i][j - 1] + x[i][j]; answer[i - 1][j - 1] = -1; cells.push_back( { i, j, x[i][j] } ); } } sort( cells.begin(), cells.end(), []( cell x, cell y ) { return x.val < y.val; } ); int minimums = 0, maximums = 0; for ( int i = 0; i < n * m; i++ ) { if ( mins[cells[i].i].size() < k && minimums < n * k / 2 ) { minimums++; mins[cells[i].i].push_back( cells[i].j ); } i = n * m - 1 - i; if ( mins[cells[i].i].size() + maxs[cells[i].i].size() < k && maximums < n * k / 2 ) { maximums++; maxs[cells[i].i].push_back( cells[i].j ); } i = n * m - 1 - i; } if ( minimums != n * k / 2 || maximums != n * k / 2 ) exit( 2 ); for ( int i = 1; i <= n; i++ ) reverse( maxs[i].begin(), maxs[i].end() ); for ( int pas = 0; pas < k; pas++ ) { for ( int i = 1; i <= n; i++ ) isMax[i] = false; vector<pair<int, int>> maxx; for ( int i = 1; i <= n; i++ ) { if ( !maxs[i].empty() ) maxx.push_back( { (mins[i].empty() ? 0 : x[i][maxs[i].back()]), i } ); } sort( maxx.begin(), maxx.end() ); for ( int i = 0; i < n / 2; i++ ) { isMax[maxx[i].second] = true; //printf( "%d\n", maxx[i].second ); answer[maxx[i].second - 1][maxs[maxx[i].second].back() - 1] = pas; sum += x[maxx[i].second][maxs[maxx[i].second].back()]; maxs[maxx[i].second].pop_back(); } for ( int i = 1; i <= n; i++ ) { if ( isMax[i] ) continue; if ( mins[i].empty() ) exit( 1 ); answer[i - 1][mins[i].back() - 1] = pas; sum -= x[i][mins[i].back()]; mins[i].pop_back(); } } allocate_tickets( answer ); return sum; }

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

tickets.cpp: In function 'long long int find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:38:38: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   38 |         if ( mins[cells[i].i].size() < k && minimums < n * k / 2 ) {
      |              ~~~~~~~~~~~~~~~~~~~~~~~~^~~
tickets.cpp:43:64: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   43 |         if ( mins[cells[i].i].size() + maxs[cells[i].i].size() < k && maximums < n * k / 2 )  {
      |              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
#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...