Submission #800757

#TimeUsernameProblemLanguageResultExecution timeMemory
800757lollipopCarnival Tickets (IOI20_tickets)C++17
100 / 100
1474 ms190780 KiB
#include<bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include <ext/rope> #define ll long long #define pb push_back #define s second #define f first #define pf push_front #define inf 100000000000000000 #define bitebi __builtin_popcountll #define FOR( i , n ) for( int i = 0 ; i < n ; i ++ ) #define YES cout <<"YES\n" #define NO cout << "NO\n" #define debug cout << "Here Fine" << endl ; #define pr pair < int , int > #define fbo find_by_order // returns iterator #define ook order_of_key // returns strictly less numbers than key using namespace std ; //#pragma GCC optimize("Ofast") //#pragma GCC target("avx,avx2,fma") using namespace __gnu_pbds; using namespace __gnu_cxx; #define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> const double Pi=acos(-1.0); const double EPS=1E-8; const int mod = 1000000007 ; const int mod1 = 998244353 ; const int NN = 2e5 + 10 ; mt19937 R(time(0)); map < int , int > ma , ma1 ; #include "tickets.h" // 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("WA\n"); // 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; // } struct stu{ ll val , i , j ; }; bool sortby( stu a , stu b ){ return a.val < b.val ; } long long find_maximum(int k, std::vector<std::vector<int>> d){ vector<std::vector<int>> pas ; if( k == 1 && d[ 0 ].size() == 1 ){ FOR( i , d.size() ){ vector < int > pas1 ; FOR( j , d[ i ].size() ) pas1.pb( 0 ) ; pas.pb( pas1 ) ; } ll ans = 0 ; vector < int > v ; for( auto x : d ) v.pb( x[ 0 ] ) ; sort( v.begin() , v.end() ) ; for( int j = 0 ; j < v.size() / 2 ; j ++ ) ans = ans + v[ v.size() - j - 1 ] - v[ j ] ; allocate_tickets( pas ) ; return ans ; } ll ans = 0 ; // fill with -1 and find the max/min pairs int n = d.size() ; pair < int , int > p[ n ] ; FOR( i , d.size() ){ vector < int > pas1 ; FOR( j , d[ i ].size() ){ pas1.pb( -1 ) ; } pas.pb( pas1 ) ; } vector < stu > cur ; int m = d[ 0 ].size() ; FOR( i , n ){ FOR( j , k ){ cur.pb( { d[ i ][ j ] + d[ i ][ m - k + j ] , i , j } ) ; ans = ans + d[ i ][ m - k + j ] ; } } int col[ n ] ; FOR( i , n ) col[ i ] = 0 ; sort( cur.begin() , cur.end() , sortby ) ; int cnt[ n ] , tt[ n ] ; FOR( i , n ) cnt[ i ] = tt[ i ] = 0 ; FOR( pp , n * k / 2 ){ stu a = cur[ pp ] ; ans = ans - a.val ; cnt[ a.i ] ++ ; } set < pair < int , int > > se1 , se2 ; FOR( i ,n ) se1.insert( { cnt[ i ] , i } ) ; set < int > cols[ n ] ; int cl = 0 ; FOR( i , n ) FOR( j , k ) cols[ i ].insert( j ) ; FOR( i , k ){ FOR( j , n / 2){ pair < int , int > p ; p = *( --se1.end() ) ; se1.erase( --se1.end() ) ; pas[ p.s ][ tt[ p.s ] ] = cl ; tt[ p.s ] ++ ; cols[ p.s ].erase( cols[ p.s ].find( cl ) ) ; p.f -- ; se2.insert( p ) ; } for( auto x : se2 ) se1.insert( x ) ; se2.clear(); cl ++ ; } FOR( i , n ){ for( int j = d[ i ].size() - 1 ; j >= 0 ; j -- ){ if( cols[ i ].size() == 0 ) break ; if( pas[ i ][ j ] != -1 ) continue ; pas[ i ][ j ] = *cols[ i ].begin() ; cols[ i ].erase( cols[ i ].begin() ) ; } } allocate_tickets( pas ) ; return ans ; } // 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); // check(called, "failure to call allocate_tickets"); // printf("OK\n"); // 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; // }

Compilation message (stderr)

tickets.cpp: In function 'long long int find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:12:41: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   12 | #define FOR( i , n ) for( int i = 0 ; i < n ; i ++ )
......
   71 |      FOR( i , d.size() ){
      |           ~~~~~~~~~~~~                   
tickets.cpp:71:6: note: in expansion of macro 'FOR'
   71 |      FOR( i , d.size() ){
      |      ^~~
tickets.cpp:12:41: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   12 | #define FOR( i , n ) for( int i = 0 ; i < n ; i ++ )
......
   73 |         FOR( j , d[ i ].size() ) pas1.pb( 0 ) ;
      |              ~~~~~~~~~~~~~~~~~           
tickets.cpp:73:9: note: in expansion of macro 'FOR'
   73 |         FOR( j , d[ i ].size() ) pas1.pb( 0 ) ;
      |         ^~~
tickets.cpp:80:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |      for( int j = 0 ; j < v.size() / 2 ; j ++ ) ans = ans + v[ v.size() - j - 1 ] - v[ j ] ;
      |                       ~~^~~~~~~~~~~~~~
tickets.cpp:12:41: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   12 | #define FOR( i , n ) for( int i = 0 ; i < n ; i ++ )
......
   88 |        FOR( i , d.size() ){
      |             ~~~~~~~~~~~~                 
tickets.cpp:88:8: note: in expansion of macro 'FOR'
   88 |        FOR( i , d.size() ){
      |        ^~~
tickets.cpp:12:41: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   12 | #define FOR( i , n ) for( int i = 0 ; i < n ; i ++ )
......
   90 |         FOR( j , d[ i ].size() ){
      |              ~~~~~~~~~~~~~~~~~           
tickets.cpp:90:9: note: in expansion of macro 'FOR'
   90 |         FOR( j , d[ i ].size() ){
      |         ^~~
tickets.cpp:87:25: warning: unused variable 'p' [-Wunused-variable]
   87 |      pair < int , int > p[ n ] ;
      |                         ^
tickets.cpp:103:10: warning: variable 'col' set but not used [-Wunused-but-set-variable]
  103 |      int col[ n ] ;
      |          ^~~
#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...