제출 #659196

#제출 시각아이디문제언어결과실행 시간메모리
659196eltu0815Salesman (IOI09_salesman)C++14
100 / 100
1076 ms26572 KiB
#include <bits/stdc++.h>
#define MAX 500005
#define MOD (ll)(1e9+7)
#define INF 2100000000

using namespace std;
//typedef long long ll;
typedef complex<double> cpx;

int N, M, Q, U, D, S;
int dp[MAX][2];
int seg[4 * MAX][4];

struct Market {
    int t, l, c;
    bool operator < (Market& m) {
        if(t != m.t) return t < m.t;
        return l < m.l;
    }
} arr[MAX];

void init(int str, int ed, int node) {
    if(str == ed) {
        seg[node][0] = seg[node][1] = seg[node][2] = seg[node][3] = -INF;
        return;
    }
    
    int mid = str + ed >> 1;
    init(str, mid, node << 1); init(mid + 1, ed, node << 1 | 1);
    seg[node][0] = seg[node][1] = seg[node][2] = seg[node][3] = -INF;
}

void update(int str, int ed, int idx, int type, int node) {
    if(str == ed) {
        if(type == 0) {
            seg[node][0] = dp[idx][0] + D * idx;
            seg[node][1] = dp[idx][0] - U * idx;
        }
        else {
            seg[node][2] = dp[idx][1] + D * idx;
            seg[node][3] = dp[idx][1] - U * idx;
        }
        return;
    }
    
    int mid = str + ed >> 1;
    if(idx <= mid) update(str, mid, idx, type, node << 1);
    else update(mid + 1, ed, idx, type, node << 1 | 1);
    seg[node][0] = max(seg[node << 1][0], seg[node << 1 | 1][0]);
    seg[node][1] = max(seg[node << 1][1], seg[node << 1 | 1][1]);
    seg[node][2] = max(seg[node << 1][2], seg[node << 1 | 1][2]);
    seg[node][3] = max(seg[node << 1][3], seg[node << 1 | 1][3]);
}

int query(int str, int ed, int left, int right, int type, int node) {
    if(str > right || ed < left) return -INF;
    if(left <= str && ed <= right) return seg[node][type];
    
    int mid = str + ed >> 1;
    return max(query(str, mid, left, right, type, node << 1), query(mid + 1, ed, left, right, type, node << 1 | 1));
}

void solve() {
    dp[S][0] = dp[S][1] = 0;
    
    init(1, M, 1);
    update(1, M, S, 0, 1);
    update(1, M, S, 1, 1);
    int prv = 1;
    for(int i = 1; i <= N; ++i) {
        int j = arr[i].l;
        dp[j][0] = max(dp[j][0], arr[i].c - D * arr[i].l + query(1, M, 1, arr[i].l, 0, 1));
        dp[j][0] = max(dp[j][0], arr[i].c + U * arr[i].l + query(1, M, arr[i].l, M, 1, 1));
        update(1, M, arr[i].l, 0, 1);
        
        if(i == N || arr[i + 1].t == arr[i].t) continue;
        for(int k = i; k >= prv; --k) {
            j = arr[k].l;
            dp[j][1] = max(dp[j][1], arr[k].c - D * arr[k].l + query(1, M, 1, arr[k].l, 2, 1));
            dp[j][1] = max(dp[j][1], arr[k].c + U * arr[k].l + query(1, M, arr[k].l, M, 3, 1));
            update(1, M, arr[k].l, 1, 1);
        }
        for(int k = prv; k <= i; ++k) {
            j = arr[k].l;
            dp[j][0] = dp[j][1] = max(dp[j][0], dp[j][1]);
            update(1, M, arr[k].l, 0, 1);
            update(1, M, arr[k].l, 1, 1);
        }
        prv = i + 1;
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    
    cin >> N >> U >> D >> S; M = S;
    for(int i = 1; i <= N; ++i) {
        cin >> arr[i].t >> arr[i].l >> arr[i].c;
        M = max(M, arr[i].l); 
    }
    arr[0] = {-1, S, 0}; arr[++N] = {INF, S, 0};
    
    for(int i = 0; i < N; ++i) dp[arr[i].l][0] = dp[arr[i].l][1] = -INF;
    sort(arr, arr + N + 1); solve();
//    for(int i = 0; i <= N; ++i) {
//        cout << arr[i].l << ' ' << dp[arr[i].l][0] << ' ' << dp[arr[i].l][1] << endl;
//    }
    cout << max(dp[S][0], dp[S][1]);
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

salesman.cpp: In function 'void init(int, int, int)':
salesman.cpp:28:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   28 |     int mid = str + ed >> 1;
      |               ~~~~^~~~
salesman.cpp: In function 'void update(int, int, int, int, int)':
salesman.cpp:46:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   46 |     int mid = str + ed >> 1;
      |               ~~~~^~~~
salesman.cpp: In function 'int query(int, int, int, int, int, int)':
salesman.cpp:59:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   59 |     int mid = str + ed >> 1;
      |               ~~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...