Submission #95242

#TimeUsernameProblemLanguageResultExecution timeMemory
95242updown1Salesman (IOI09_salesman)C++17
70 / 100
1085 ms49828 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define For(i, a, b) for(int i=a; i<b; i++) #define ffi For(i, 0, N) #define ffj For(j, 0, N) #define ffa ffi ffj #define s <<" "<< #define c <<" : "<< #define w cout #define e endl//"\n" #define pb push_back #define mp make_pair #define a first #define b second //#define int ll //500,000,000 operations const int MAXN = 500003, INF = 2*1e9; //Global Variables int N, U, D, S, dp[MAXN], t0D[4*MAXN+1], t0U[4*MAXN+1], dpU[4*MAXN+1], dpD[4*MAXN+1], pre[MAXN]; pair<int, pair<int, int> > fairs[MAXN]; /// (day, (location, profit) ) void updatedpU(int ind, int L, int R, int x, int v) { if (x < L || R < x) return; if (L == R) { dpU[ind] = v; return; } updatedpU(ind*2, L, (L+R)/2, x, v); updatedpU(ind*2+1, (L+R)/2+1, R, x, v); dpU[ind] = max(dpU[ind*2], dpU[ind*2+1]); } void updatedpD(int ind, int L, int R, int x, int v) { if (x < L || R < x) return; if (L == R) { dpD[ind] = v; return; } updatedpD(ind*2, L, (L+R)/2, x, v); updatedpD(ind*2+1, (L+R)/2+1, R, x, v); dpD[ind] = max(dpD[ind*2], dpD[ind*2+1]); } void updatet0D(int ind, int L, int R, int x, int v) { if (x < L || R < x) return; if (L == R) { t0D[ind] = v; return; } updatet0D(ind*2, L, (L+R)/2, x, v); updatet0D(ind*2+1, (L+R)/2+1, R, x, v); t0D[ind] = max(t0D[ind*2], t0D[ind*2+1]); } void updatet0U(int ind, int L, int R, int x, int v) { if (x < L || R < x) return; if (L == R) { t0U[ind] = v; return; } updatet0U(ind*2, L, (L+R)/2, x, v); updatet0U(ind*2+1, (L+R)/2+1, R, x, v); t0U[ind] = max(t0U[ind*2], t0U[ind*2+1]); } int querydpU(int ind, int L, int R, int oL, int oR) { if (oR < L || R < oL) return -INF; if (oL == 6 && oR == 6) w<< ind s L s R c dpU[ind]<<e; if (oL <= L && R <= oR) return dpU[ind]; return max(querydpU(ind*2, L, (L+R)/2, oL, oR), querydpU(ind*2+1, (L+R)/2+1, R, oL, oR)); } int querydpD(int ind, int L, int R, int oL, int oR) { if (oR < L || R < oL) return -INF; if (oL <= L && R <= oR) return dpD[ind]; return max(querydpD(ind*2, L, (L+R)/2, oL, oR), querydpD(ind*2+1, (L+R)/2+1, R, oL, oR)); } int queryt0U(int ind, int L, int R, int oL, int oR) { if (oR < L || R < oL) return -INF; if (oL <= L && R <= oR) return t0U[ind]; return max(queryt0U(ind*2, L, (L+R)/2, oL, oR), queryt0U(ind*2+1, (L+R)/2+1, R, oL, oR)); } int queryt0D(int ind, int L, int R, int oL, int oR) { if (oR < L || R < oL) return -INF; if (oL <= L && R <= oR) return t0D[ind]; return max(queryt0D(ind*2, L, (L+R)/2, oL, oR), queryt0D(ind*2+1, (L+R)/2+1, R, oL, oR)); } main() { //ifstream cin("test.in"); ios_base::sync_with_stdio(0); cin.tie(0); cin >> N >> U >> D >> S; ffi cin >> fairs[i].a >> fairs[i].b.a >> fairs[i].b.b; fairs[N] = mp(MAXN, mp(S, 0)); N++; sort(fairs, fairs+N); For (i, 0, MAXN) dp[i] = -INF; For (i, 0, 4*MAXN+1) t0D[i] = t0U[i] = dpU[i] = dpD[i] = -INF; dp[S] = 0; updatedpU(1, 0, MAXN-1, S, -U*S); updatedpD(1, 0, MAXN-1, S, D*S); //w<< querydpU(1, 0, MAXN-1, 0, MAXN-1)<<e; int i=0; while (i < N) { int k = i; while (k+1 < N && fairs[k+1].a == fairs[i].a) k++; /// fairs with the same day are i to k /// update with pre values if (i != 0) pre[i-1] = 0; pre[i] = fairs[i].b.b; For (l, i+1, k+1) pre[l] = pre[l-1] + fairs[l].b.b; For (l, i, k+1) { int loc = fairs[l].b.a; int prel1 = 0; if (l != 0) prel1 = pre[l-1]; int tdp0 = max(querydpU(1, 0, MAXN-1, loc, MAXN-1) + U*loc, querydpD(1, 0, MAXN-1, 0, loc) - D*loc); //w<< loc s tdp0 c tdp0 + D*loc-prel1 s tdp0 - U*loc + pre[l]<<e; //if (loc == S) w<<"at S" s querydpU(1, 0, MAXN-1, 6, 6) s tdp0<<e; updatet0D(1, 0, MAXN-1, loc, tdp0 + D*loc-prel1); updatet0U(1, 0, MAXN-1, loc, tdp0 - U*loc + pre[l]); } For (l, i, k+1) { int loc = fairs[l].b.a; int prel1 = 0; if (l != 0) prel1 = pre[l-1]; dp[loc] = max(queryt0D(1, 0, MAXN-1, 0, loc) + pre[l] - D*loc, queryt0U(1, 0, MAXN-1, loc, MAXN-1) - prel1+ U*loc); //w<< "dp" s loc s dp[loc] c queryt0D(1, 0, MAXN-1, 0, loc)<<e; //if (loc == 6) w<< dp[loc]<<e; updatedpU(1, 0, MAXN-1, loc, dp[loc]-U*loc); //if (loc == 6) w<< dp[loc] s querydpU(1, 0, MAXN-1, S, MAXN-1)<<e; updatedpD(1, 0, MAXN-1, loc, dp[loc]+D*loc); } /// reset values For (l, i, k+1) { int loc = fairs[l].b.a; updatet0D(1, 0, MAXN-1, loc, -INF); updatet0U(1, 0, MAXN-1, loc, -INF); } i = k+1; } //For (i, 0, MAXN) if (dp[i] != -INF) w<< i c dp[i]<<e; w << dp[S]<<e; }

Compilation message (stderr)

salesman.cpp:86:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main() {
      ^
#Verdict Execution timeMemoryGrader output
Fetching results...