Submission #106548

#TimeUsernameProblemLanguageResultExecution timeMemory
106548wilwxkSalesman (IOI09_salesman)C++11
57 / 100
1076 ms32380 KiB
#include <bits/stdc++.h> using namespace std; struct cara { int x, val, id; bool operator<(cara outro) const { if(id==outro.id) return x<outro.x; return id<outro.id; } }; const int MAXN=5e5+5; const int INF=2e9+5; cara v[MAXN]; vector<int> aux; int seg[4*MAXN][2]; int lz[4*MAXN][2]; int dp[MAXN]; int n, xx, yy, ori; void refresh(int sind, int ini, int fim, int k) { seg[sind][k]+=lz[sind][k]; if(ini==fim) { lz[sind][k]=0; return; } int m=(ini+fim)/2; int e=sind*2; int d=e+1; lz[e][k]+=lz[sind][k]; lz[d][k]+=lz[sind][k]; lz[sind][k]=0; } void update(int sind, int ini, int fim, int qini, int qfim, int val, int k, int k2) { refresh(sind, ini, fim, k); if(qfim<ini||qini>fim) return; if(qini<=ini&&qfim>=fim) { if(!k2) seg[sind][k]=val; else lz[sind][k]+=val, refresh(sind, ini, fim, k); return; } int m=(ini+fim)/2; int e=sind*2; int d=e+1; update(e, ini, m, qini, qfim, val, k, k2); update(d, m+1, fim, qini, qfim, val, k, k2); seg[sind][k]=max(seg[e][k], seg[d][k]); } int query(int sind, int ini, int fim, int qini, int qfim, int k) { refresh(sind, ini, fim, k); if(qfim<qini||qini>fim||qfim<ini) return -INF; if(qini<=ini&&qfim>=fim) return seg[sind][k]; int m=(ini+fim)/2; int e=sind*2; int d=e+1; return max( query(e, ini, m, qini, qfim, k), query(d, m+1, fim, qini, qfim, k) ); } void build(int sind, int ini, int fim) { if(ini==fim) { seg[sind][0]=-INF; seg[sind][1]=-INF; return; } int m=(ini+fim)/2; int e=sind*2; int d=e+1; build(e, ini, m); build(d, m+1, fim); seg[sind][0]=seg[e][0]; seg[sind][1]=seg[e][1]; } void solve() { for(auto cur : aux) { int aa=query(1, 1, MAXN-2, 1, v[cur].x-1, 0); int bb=query(1, 1, MAXN-2, v[cur].x+1, MAXN-2, 1); dp[cur]=max(aa-v[cur].x*yy, bb+v[cur].x*xx); } for(auto cur : aux) { update(1, 1, MAXN-2, v[cur].x, v[cur].x, dp[cur]+v[cur].x*yy, 0, 0); update(1, 1, MAXN-2, v[cur].x, v[cur].x, dp[cur]-v[cur].x*xx, 1, 0); } for(auto cur : aux) { if(cur==aux[0]) continue; update(1, 1, MAXN-2, v[cur].x, MAXN-2, v[cur].val, 1, 1); } for(int i=0; i<aux.size(); i++) { int cur=aux[i]; int aa=query(1, 1, MAXN-2, 1, v[cur].x-1, 0); int bb=query(1, 1, MAXN-2, v[cur].x+1, MAXN-2, 1); dp[cur]=max(aa-v[cur].x*yy, bb+v[cur].x*xx); dp[cur]+=v[cur].val; if(i!=aux.size()-1) update(1, 1, MAXN-2, 1, v[cur].x, v[cur].val, 0, 1); if(i!=aux.size()-1) update(1, 1, MAXN-2, v[aux[i+1]].x, MAXN-2, -v[aux[i+1]].val, 1, 1); } for(auto cur : aux) { if(cur==aux.back()) continue; update(1, 1, MAXN-2, 1, v[cur].x, -v[cur].val, 0, 1); } for(auto cur : aux) { update(1, 1, MAXN-2, v[cur].x, v[cur].x, dp[cur]+v[cur].x*yy, 0, 0); update(1, 1, MAXN-2, v[cur].x, v[cur].x, dp[cur]-v[cur].x*xx, 1, 0); } } int main() { scanf("%d %d %d %d", &n, &xx, &yy, &ori); for(int i=1; i<=n; i++) scanf("%d %d %d", &v[i].id, &v[i].x, &v[i].val); sort(v+1, v+1+n); build(1, 1, MAXN-2); dp[0]=0; update(1, 1, MAXN-2, ori, ori, ori*yy, 0, 0); update(1, 1, MAXN-2, ori, ori, -ori*xx, 1, 0); for(int i=1; i<=n; i++) { int prox=i; while(prox<=n&&v[prox].id==v[i].id) aux.push_back(prox++); solve(); aux.clear(); i=prox-1; } int aa=query(1, 1, MAXN-2, 1, ori-1, 0); int bb=query(1, 1, MAXN-2, ori+1, MAXN-2, 1); int respf=max(aa-ori*yy, bb+ori*xx); respf=max(respf, 0); printf("%d\n", respf); }

Compilation message (stderr)

salesman.cpp: In function 'void refresh(int, int, int, int)':
salesman.cpp:26:6: warning: unused variable 'm' [-Wunused-variable]
  int m=(ini+fim)/2; int e=sind*2; int d=e+1;
      ^
salesman.cpp: In function 'void solve()':
salesman.cpp:82:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<aux.size(); i++) {
               ~^~~~~~~~~~~
salesman.cpp:90:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if(i!=aux.size()-1) update(1, 1, MAXN-2, 1, v[cur].x, v[cur].val, 0, 1);
       ~^~~~~~~~~~~~~~
salesman.cpp:91:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if(i!=aux.size()-1) update(1, 1, MAXN-2, v[aux[i+1]].x, MAXN-2, -v[aux[i+1]].val, 1, 1);
       ~^~~~~~~~~~~~~~
salesman.cpp: In function 'int main()':
salesman.cpp:106:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %d %d", &n, &xx, &yy, &ori);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
salesman.cpp:107:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1; i<=n; i++) scanf("%d %d %d", &v[i].id, &v[i].x, &v[i].val);
                          ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...