제출 #226593

#제출 시각아이디문제언어결과실행 시간메모리
226593CaroLindaHiring (IOI09_hiring)C++14
45 / 100
1595 ms17904 KiB
#include <bits/stdc++.h> #define mkt make_tuple #define debug printf #define all(x) x.begin(),x.end() #define lp(i,a,b) for(int i = a ; i< b ; i++) #define ss second #define ff first #define ll long long #define pb push_back #define pii pair<int,int> #define mk make_pair const int MAXN = 5e5+10 ; using namespace std ; int N ; int S[MAXN] , Q[MAXN] , vet[MAXN] ; ll cur_soma ; set<pii> s ; ll W ; vector<int> ans ; inline void add(int x, int id) { s.insert( mk(x,id) ) ; cur_soma += 1LL*x ; } inline void _erase(int x, int id) { s.erase( s.find(mk(x,id)) ) ; cur_soma -= 1LL*x ; } bool test(int val, bool ok = false) { if( val == 0 ) return true ; s.clear() ; cur_soma = 0 ; // debug("Testando %d\n" , val ) ; for(int i = 1 ; i < val ; i++ ) add( Q[ vet[i] ] , vet[i] ) ; for(int i = val ; i <= N ; i++ ) { if( (cur_soma+1LL*Q[ vet[i] ])*1LL*S[ vet[i] ] <= W * 1LL*Q[ vet[i] ] ) { if( ok ) { for(auto p : s) ans.pb( p.ss ) ; ans.pb( vet[i] ) ; } return true ; } add( Q[ vet[i] ] , vet[i] ) ; pii p = *(prev(s.end()) ) ; _erase( p.ff , p.ss ) ; } return false ; } bool cmp(int i, int j) { int val1 = S[i] * Q[j] ; int val2 = S[j] * Q[i] ; if( val1 != val2 ) return val1 < val2 ; return Q[i] <= Q[j] ; } int main() { scanf("%d %lld", &N , &W ) ; lp(i,1,N+1) scanf("%d %d", &S[i] , &Q[i]) ; iota(vet+1, vet+1+N, 1 ) ; sort(vet+1, vet+1+N,cmp) ; int l = 0 , r = N , mid , best = 0; while( l <= r ) { mid = (l+r)>>1 ; if( test(mid) ) { best = mid ; l = mid + 1 ; } else r = mid - 1 ; } test(best, true) ; sort(all(ans)) ; printf("%lu\n", ans.size() ) ; for(int i : ans ) printf("%d\n" , i) ; }

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

hiring.cpp: In function 'int main()':
hiring.cpp:76:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %lld", &N , &W ) ;
     ~~~~~^~~~~~~~~~~~~~~~~~~~~
hiring.cpp:77:22: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     lp(i,1,N+1) scanf("%d %d", &S[i] , &Q[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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...