Submission #1088833

#TimeUsernameProblemLanguageResultExecution timeMemory
1088833salmonHiring (IOI09_hiring)C++14
100 / 100
406 ms34724 KiB
#include <bits/stdc++.h>
using namespace std;

int N;
vector<pair<pair<long long int,long long int>,int>> v;
long long int W;
long long int h1,h2;
priority_queue<pair<long long int,int>,vector<pair<long long int,int>>,greater<pair<long long int,int>>> satprime;
priority_queue<pair<long long int,int>> sat;
vector<pair<pair<long long int, long long int>,int>> nov;

bool c(pair<pair<long long int, long long int>,int> ii1, pair<pair<long long int, long long int>,int> ii2){
    return ii1.first.first * ii2.first.second < ii2.first.first * ii1.first.second;
}

int main(){

    scanf(" %d",&N);
    scanf(" %lld",&W);

    for(int i = 0; i < N; i++){
        scanf(" %lld",&h1);
        scanf(" %lld",&h2);

        v.push_back({{h1,h2},i});
    }

    sort(v.begin(),v.end(),c);

    long long int sum = 0;
    int ans = 0;

    for(int i = 0; i < N; i++){
        if( (sum + v[i].first.second) * v[i].first.first <= W * v[i].first.second){
            while(!satprime.empty() && (satprime.top().first + sum + v[i].first.second) * v[i].first.first <= W * v[i].first.second ){
                sum += satprime.top().first;
                sat.push(satprime.top());
                satprime.pop();
            }
            if(ans == sat.size() + 1){
                nov.push_back({{ (sum + v[i].first.second) * v[i].first.first,v[i].first.second }, i});
            }
            else{
                nov.clear();
                nov.push_back({{ (sum + v[i].first.second) * v[i].first.first,v[i].first.second },i});
            }
            ans = sat.size() + 1;
            //printf("%d %d\n",i,sum+v[i].first.second);
        }

        if(!sat.empty() && v[i].first.second < sat.top().first){
            pair<long long int,int> h = sat.top();
            satprime.push(h);
            sat.pop();
            sat.push({v[i].first.second,v[i].second});

            sum -= h.first;
            sum += v[i].first.second;
        }
        else{
            satprime.push({v[i].first.second,v[i].second});
        }
    }

    printf("%d\n",ans);

    sort(nov.begin(),nov.end(),c);

    int j = nov[0].second;

    while(!sat.empty()){
        sat.pop();
    }
    while(!satprime.empty()){
        satprime.pop();
    }

    sum = 0;

    for(int i = 0; i < N; i++){
        if( (sum + v[i].first.second) * v[i].first.first <= W * v[i].first.second){
            while(!satprime.empty() && (satprime.top().first + sum + v[i].first.second) * v[i].first.first <= W * v[i].first.second ){
                sum += satprime.top().first;
                sat.push(satprime.top());
                satprime.pop();
            }
        }

        if(i == j){
            sat.push({v[i].first.second,v[i].second});
            break;
        }

        if(!sat.empty() && v[i].first.second < sat.top().first){
            pair<long long int,int> h = sat.top();
            satprime.push(h);
            sat.push({v[i].first.second,v[i].second});
            sat.pop();

            sum -= h.first;
            sum += v[i].first.second;
        }
        else{
            satprime.push({v[i].first.second,v[i].second});
        }
    }

    while(!sat.empty()){
        printf("%d\n",sat.top().second + 1);
        sat.pop();
    }
}

Compilation message (stderr)

hiring.cpp: In function 'int main()':
hiring.cpp:40:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::priority_queue<std::pair<long long int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |             if(ans == sat.size() + 1){
      |                ~~~~^~~~~~~~~~~~~~~~~
hiring.cpp:18:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |     scanf(" %d",&N);
      |     ~~~~~^~~~~~~~~~
hiring.cpp:19:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |     scanf(" %lld",&W);
      |     ~~~~~^~~~~~~~~~~~
hiring.cpp:22:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   22 |         scanf(" %lld",&h1);
      |         ~~~~~^~~~~~~~~~~~~
hiring.cpp:23:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   23 |         scanf(" %lld",&h2);
      |         ~~~~~^~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...