Submission #112384

#TimeUsernameProblemLanguageResultExecution timeMemory
112384evpipisSalesman (IOI09_salesman)C++17
40 / 100
1084 ms15608 KiB
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef pair<int, int> ii;

const int len = 5e5+5;
const ll inf = 1e17;
pair<ii, int> arr[len];
ll dp[len][2];

int main(){
    int n, u, d, s;
    scanf("%d %d %d %d", &n, &u, &d, &s);
    for (int i = 1; i <= n; i++)
        scanf("%d %d %d", &arr[i].fi.fi, &arr[i].fi.se, &arr[i].se);
    arr[0] = mp(mp(0, s), 0);
    arr[n+1] = mp(mp(len, s), 0);

    sort(arr+1, arr+n+1);

    //for (int i = 0; i <= n+1; i++)
      //  printf("i = %d, arr = (%d, %d, %d)\n", i, arr[i].fi.fi, arr[i].fi.se, arr[i].se);

    for (int i = n, j = n+1; i >= 0; i--, j--){
        while (i-1 >= 0 && arr[i-1].fi.fi == arr[i].fi.fi)
            i--;
        while (j-1 >= 0 && arr[j-1].fi.fi == arr[j].fi.fi)
            j--;

        //printf("i = %d, j = %d\n", i, j);

        for (int k = i; k < j; k++){
            dp[k][0] = -inf;
            if (k != i)
                dp[k][0] = dp[k-1][0] - (arr[k].fi.se-arr[k-1].fi.se)*u + arr[k-1].se;

            for (int l = j; l <= n+1; l++){
                int temp = (arr[l].fi.se-arr[k].fi.se)*d;
                if (arr[l].fi.se < arr[k].fi.se)
                    temp = (arr[k].fi.se-arr[l].fi.se)*u;
                dp[k][0] = max(dp[k][0], max(dp[l][0], dp[l][1]) - temp + arr[l].se);
            }

            //printf("dp[%d][%d] = %lld\n", k, 0, dp[k][0]);
        }

        for (int k = j-1; k >= i; k--){
            dp[k][1] = -inf;
            if (k != j-1)
                dp[k][1] = dp[k+1][1] - (arr[k+1].fi.se-arr[k].fi.se)*d + arr[k+1].se;

            for (int l = j; l <= n+1; l++){
                int temp = (arr[l].fi.se-arr[k].fi.se)*d;
                if (arr[l].fi.se < arr[k].fi.se)
                    temp = (arr[k].fi.se-arr[l].fi.se)*u;
                dp[k][1] = max(dp[k][1], max(dp[l][0], dp[l][1]) - temp + arr[l].se);
            }

            //printf("dp[%d][%d] = %lld\n", k, 1, dp[k][1]);
        }
    }

    printf("%lld\n", dp[0][0]);
    return 0;
}

Compilation message (stderr)

salesman.cpp: In function 'int main()':
salesman.cpp:18:10: 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:20:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d %d", &arr[i].fi.fi, &arr[i].fi.se, &arr[i].se);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...