제출 #266844

#제출 시각아이디문제언어결과실행 시간메모리
266844REALITYNBFuel Station (NOI20_fuelstation)C++14
20 / 100
1082 ms61988 KiB
#include <bits/stdc++.h> 
#define pii pair<int,int> 
#define F first 
#define int long long 
#define S second 
#define mp make_pair
using namespace std; 
bool check(int s , vector<int>& d , vector<int>& f){
    int li = 0 , rest = s ; 
    for(int i=0;i<d.size();i++){
        if(d[i]-li>rest) return 0 ; 
        rest -= (d[i]-li) ;
        rest+=f[i] ; 
        li = d[i] ; 
    }
    return 1 ; 
}
int bs(int lw , int ur , int D , map<int,vector<pii>> s){
    int l =  lw , r = ur ; 
    vector<int> d , f ; 
    for(auto x : s){
        vector<pii> v = x.S ; 
        for(pii y : v) {
            d.push_back(y.F) ;  
            f.push_back(y.S) ; 
        }
    }
    d.push_back(D) ; 
    while(r-l-1){
        int md = (r+l)/2 ;
        if(check(md,d,f)){
            r= md ; 
        }
        else l = md  ; 
    }
    return r ; 
}
signed main(){
	int n ,D; 
	cin>>n>>D ;
	//a[i] -> how much fuel he can get in the ith station 
	//b[i] -> F <= b[i] condition 
	//d[i] -> distance from start 
	//d  -> finish line
	map<int,vector<pii>> s ; 
	for(int i=0;i<n;i++){
		int f , b,d ; 
		cin>>d>>f>>b ; 
		s[b].push_back(mp(d,f)) ;  
	}
	for(auto x : s){
		vector<pii> v = x.S  ;  
		sort(v.begin(),v.end()) ; 
		s[x.F]= v ; 
	}
	multiset<int> r ; 
	multiset<pii> ur ; 
	int rest = 0  , li =  0 ; 
	r.insert(0) ; 
	ur.insert(mp(D,0)) ; 
	for(auto x : s){
		int F = x.F ; 
		vector<pii> fs = x.S ; 
		for(pii y : fs) ur.insert(y) ; 
		rest+= F-li   ; 
		auto it = r.end() ; 
		it-- ; 
		int big = *it ; 
		while(big>=(*(ur.begin())).F){
			rest+=(*ur.begin()).S  ; 
			r.insert((*ur.begin()).F) ;  
			ur.erase(ur.begin()) ; 
		}
		while(ur.size()&&(*ur.begin()).F-big<=rest){
			r.insert((*ur.begin()).F) ; 
			rest+= (*ur.begin()).S ;
			rest-= ((*ur.begin()).F-big) ; 
		    big = (*ur.begin()).F ; 
			ur.erase(ur.begin()) ; 
		}
		if(ur.empty()){
			cout << bs(li,F,D,s) ; 
			return 0 ;  
		}	
		li = F ; 
	}
	cout << D  ; 
	return 0 ; 
}

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

FuelStation.cpp: In function 'bool check(long long int, std::vector<long long int>&, std::vector<long long int>&)':
FuelStation.cpp:10:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   10 |     for(int i=0;i<d.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...