Submission #133606

#TimeUsernameProblemLanguageResultExecution timeMemory
133606figter001Salesman (IOI09_salesman)C++17
60 / 100
958 ms37784 KiB
#include <bits/stdc++.h> using namespace std; #define debug(x) '[' << #x << " is: " << x << "] " typedef long long ll; typedef long double ld; typedef unsigned long long ull; const int nax = 5e5 + 100; int d[nax],l[nax],m[nax]; int n,U,D,s,len; ll up[4*nax],dn[4*nax]; ll dp[nax]; void build(int n,int s,int e){ if(s == e){ up[n] = dp[s] + s * U; dn[n] = dp[s] - s * D; return; } build(n*2,s,(s+e)/2); build(n*2+1,(s+e)/2+1,e); up[n] = max(up[n*2] , up[n*2+1]); dn[n] = max(dn[n*2] , dn[n*2+1]); } void update(int n,int s,int e,int at){ if(s > at || e < at)return; if(s == e){ up[n] = dp[s] - s * U; dn[n] = dp[s] + s * D; return; } update(n*2,s,(s+e)/2,at); update(n*2+1,(s+e)/2+1,e,at); up[n] = max(up[n*2] , up[n*2+1]); dn[n] = max(dn[n*2] , dn[n*2+1]); } ll get(int n,int s,int e,int l,int r,int t){ if(s > r || e < l)return -1e18; if(s >= l && e <= r){ if(t == 0)return up[n]; else if(t == 1)return dn[n]; } return max( get(n*2,s,(s+e)/2,l,r,t) , get(n*2+1,(s+e)/2+1,e,l,r,t) ); } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.precision(10); cout << fixed; cin>>n>>U>>D>>s; n+=2; d[0] = -1;l[0] = s; d[n-1] = nax + 1;l[n-1] = s; len = s; for(int i=1;i<n;i++){ cin>>d[i]>>l[i]>>m[i]; len = max(len,l[i]); } len++; vector<int> idx; for(int i=0;i<n;i++)idx.push_back(i); sort(idx.begin(),idx.end(), [&] (int a,int b) { return d[a] < d[b]; }); for(int i=1;i<=len;i++)dp[i] = -1e10; dp[s] = 0; build(1,1,len); for(int i : idx){ ll cur = -1e18; if(i != 0){ cur = max(cur, get(1,1,len,1,l[i],1) + m[i] - D*l[i]); cur = max(cur, get(1,1,len,l[i],len,0) + m[i] + U*l[i]); } dp[l[i]] = max(dp[l[i]],cur); update(1,1,len,l[i]); } cout << dp[s] << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...