제출 #771328

#제출 시각아이디문제언어결과실행 시간메모리
771328Ahmed57Salesman (IOI09_salesman)C++17
50 / 100
3083 ms35512 KiB
#include <bits/stdc++.h>

using namespace std;
#define int long long
//BIT Fenwick tree
struct fenwick{
long long bit[500001]={0} , n  = 500000;
void build(){
    for(int i = 0;i<=500000;i++)bit[i] = -1e13;
}
void add(int e,long long v){
    while(e<=n){
        bit[e]=max(bit[e],v);
        e+=e&-e;
    }
}
long long sum(int e){
    long long res = -1e13;
    while(e>=1){
        res=max(res,bit[e]);
        e -= e&-e;
    }
    return res;
}
};
fenwick s1,s2;
long long n,u,d,s;
void update(long long i,long long val){
    s1.add(i,val+d*i);
    s2.add(500001-i,val-u*i);
}long long get(long long i){
    return max(s2.sum(500001-i)+u*i,s1.sum(i)-d*i);
}
//end BIT
signed main(){
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    s1.build();s2.build();
    cin>>n>>u>>d>>s;
    vector<pair<long long,long long>> v[500001];
    for(int i = 0;i<n;i++){
        long long a,b,c;
        cin>>a>>b>>c;
        v[a].push_back({b,c});
    }
    update(s,0);
    for(long long i = 0;i<=500000;i++){
        if(v[i].empty())continue;
        sort(v[i].begin(),v[i].end());
        long long cur[v[i].size()] ;
        long long maxD[v[i].size()] ;
        long long maxU[v[i].size()];
        for(int j = 0;j<v[i].size();j++){
            cur[j] = -1e13 , maxD[j] =-1e13 , maxU[j] = -1e13;
            cur[j] = get(v[i][j].first)+v[i][j].second;
        }
        long long tempD = -1e13,tempU = -1e13;
        for(int j = 0;j<v[i].size();j++){
            maxD[j] = max(maxD[j],tempD-d*v[i][j].first+v[i][j].second);
            tempD = max(tempD,maxD[j]+d*v[i][j].first);
        }
        for(int j = v[i].size()-1;j>=0;j--){
            maxU[j] = max(maxU[j],tempU+u*v[i][j].first+v[i][j].second);
            tempU = max(tempU,maxU[j]-u*v[i][j].first);
        }
        for(int j = 0;j<v[i].size();j++){
            cur[j] = max({cur[j],maxD[j],maxU[j]});
            update(v[i][j].first,cur[j]);
        }
    }
    cout<<get(s)<<endl;
}

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

salesman.cpp: In function 'int main()':
salesman.cpp:52:24: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |         for(int j = 0;j<v[i].size();j++){
      |                       ~^~~~~~~~~~~~
salesman.cpp:57:24: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |         for(int j = 0;j<v[i].size();j++){
      |                       ~^~~~~~~~~~~~
salesman.cpp:65:24: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |         for(int j = 0;j<v[i].size();j++){
      |                       ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...