제출 #1254912

#제출 시각아이디문제언어결과실행 시간메모리
1254912mngoc._.Salesman (IOI09_salesman)C++20
60 / 100
594 ms32472 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5 + 5;
const int INF = 1e12;
int dp[N];
int st[4 * N][2];
int n , u , d , s;
int mx;
struct Event{
	int t , l , m;
} event[N];

bool cmp(const Event& x , const Event& y){
    if(x.t != y.t) return x.t < y.t;
    if(x.m != y.m) return x.m < y.m;
    return x.l < y.l;
}

void build(int type , int idx , int l ,int r){
	if(l == r){
		st[idx][type] = -INF;
		return;
	}
	int mid = (l + r) / 2;
	build(type , 2 * idx , l , mid);
	build(type , 2 * idx + 1 , mid + 1 , r);
	st[idx][type] = max(st[2  * idx][type] , st[2 * idx + 1][type]);
}

int get(int type , int idx, int l , int r , int u , int v){
	if(l > v || r < u) return -INF;
	if(u <= l && r <= v) return st[idx][type];
	int mid = (l + r) / 2;
    return max(get(type , 2 * idx , l , mid , u , v) , get(type , 2 * idx + 1  , mid + 1 , r , u , v));
}

void update(int type , int idx , int l , int r , int pos , int v){
	if(l > pos || r < pos) return;
	if(l == r){
		st[idx][type] = max(st[idx][type] , v);
		return;
	}
	int mid = (l + r) / 2;
	update(type , 2 * idx , l , mid , pos , v);
	update(type , 2 * idx + 1 , mid + 1 , r , pos, v);
	st[idx][type] = max(st[2 * idx][type] , st[2 * idx + 1][type]);
}



void solve(void){
	cin >> n >> u >> d >> s;
	for(int i = 1 ; i <= n ; i++){
		cin >> event[i].t >> event[i].l >> event[i].m;
		mx = max(mx , event[i].l);
	}
	mx = max(mx , s);
	sort(event + 1 , event + n + 1 , cmp);
	event[n + 1].l = s;
	build(0 , 1 , 1 , mx);
	build(1 , 1 , 1 , mx);
    update(0 , 1 , 1 , mx , s , s * d);
	update(1 , 1 , 1 , mx , s ,  (-s) * u);
   
	for(int i = 1; i <= n + 1;  i++){
		int v1 = get(0 , 1 , 1 , mx , 1 , event[i].l);
		int v2 = get(1 , 1 , 1 , mx , event[i].l + 1 , mx);
		dp[i] = max(v1 - event[i].l * d + event[i].m , v2 + event[i].l * u + event[i].m);
	//	cout << "Debug" << " " << dp[i] << " " << event[i].t << " " << event[i].l << " " << event[i].m << " " << v1 << " "<< v2 << endl;
		update(0 , 1 , 1 , mx , event[i].l , dp[i] + event[i].l * d);
		update(1 , 1 , 1 , mx , event[i].l , dp[i] - event[i].l * u);
	}
	
	cout << dp[n + 1];
	
	
	
	
	
}

signed main(void){
	ios_base :: sync_with_stdio(false);
	cin.tie(NULL);
	solve();
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...