Submission #131878

#TimeUsernameProblemLanguageResultExecution timeMemory
131878dragonslayeritSalesman (IOI09_salesman)C++14
60 / 100
900 ms53264 KiB
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #include <cassert>
     
    const long long INF=1e18+7;
     
    int ts[500005];
    int ls[500005];
    int ms[500005];
     
    long long dp[500005];
     
    std::vector<int> events[500005];
    int N;
     
    struct MaxSegTree{
      static const int SIZE=500005;
      long long st[SIZE*2];
      MaxSegTree(){
        std::fill(st,st+SIZE*2,-INF);
      }
      void pull(int i){
        st[i]=std::max(st[i<<1],st[i<<1|1]);
      }
      void set(int i,long long v){
        for(st[i+=SIZE]=v;i>1;i>>=1){
          pull(i>>1);
        }
      }
      long long query(int a,int b){
        long long res=-INF;
        for(a+=SIZE,b+=SIZE;a<b;a>>=1,b>>=1){
          if(a&1) res=std::max(res,st[a++]);
          if(b&1) res=std::max(res,st[--b]);
        }
        return res;
      }
    }up,down;
     
    int main(){
      int U,D,S;
      scanf("%d %d %d %d",&N,&U,&D,&S);
      ts[0]=0;
      ls[0]=S-1;
      ms[0]=0;
      for(int i=1;i<=N;i++){
        scanf("%d %d %d",&ts[i],&ls[i],&ms[i]);
        ls[i]--;
      }
      ts[N+1]=500001;
      ls[N+1]=S-1;
      ms[N+1]=0;
      for(int i=0;i<=N+1;i++){
        events[ts[i]].push_back(i);
      }
      for(int t=0;t<=500001;t++){
        //assert(events[t].size()<=1);
        for(int e:events[t]){
          int x=ls[e];
          dp[e]=ms[e]+std::max(down.query(0,x)-x*D,up.query(x,MaxSegTree::SIZE)+x*U);
          if(t==0) dp[e]=0;
          down.set(x,dp[e]+x*D);
          up.set(x,dp[e]-x*U);
          //printf("dp[%d]=%lld\n",e,dp[e]);
        }
      }
      printf("%lld\n",dp[N+1]);
      return 0;
    }

Compilation message (stderr)

salesman.cpp: In function 'int main()':
salesman.cpp:43:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       scanf("%d %d %d %d",&N,&U,&D,&S);
       ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
salesman.cpp:48:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d %d",&ts[i],&ls[i],&ms[i]);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...