답안 #376389

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
376389 2021-03-11T10:55:10 Z kimjg1119 여행하는 상인 (APIO17_merchant) C++17
0 / 100
26 ms 24704 KB
#include <bits/stdc++.h>

/*#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")*/

#define all(x) (x).begin(), (x).end()
#define endl "\n"
#define ends " "
#define pb(x) push_back(x)
#define fio() ios_base::sync_with_stdio(0); cin.tie(0)
#define fileio() ifstream file_in("input.txt");ofstream file_out("output.txt")
#define double long double

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef tuple<int, int, int> tpi;
typedef tuple<ll, ll, ll> tpl;
typedef pair<double, ll> pdl;
typedef unsigned long long ull;

const int MOD = 1000000007; // PLZ check
const ll LMOD = 1000000007;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const double pi = acos(-1);
const double eps = 1e-10;
const int dx[] = { 0, 1, 0, -1 };
const int dy[] = { 1, 0, -1, 0 };

struct SegmentTreeMax {
	int sz;
	vector<ll> a;

	SegmentTreeMax(int _sz) : sz(_sz), a(sz * 4 + 10, -LINF) {}

	void update(int nd, int s, int e, int x, ll v) {
		if (e < x || x < s) return;
		if (s == e && x == s) {
			a[nd] = max(a[nd], v);
			return;
		}
		int m = (s + e) >> 1;
		update(nd << 1, s, m, x, v);
		update(nd << 1 | 1, m + 1, e, x, v);
		a[nd] = max(a[nd << 1], a[nd << 1 | 1]);
	}

	void update(int x, ll v) { update(1, 0, sz - 1, x, v); }

	ll query(int nd, int s, int e, int l, int r) {
		if (e < l || r < s) return -LINF;
		if (l <= s && e <= r) return a[nd];
		int m = (s + e) >> 1;
		return max(query(nd << 1, s, m, l, r), query(nd << 1 | 1, m + 1, e, l, r));
	}

	ll query(int l, int r) { return query(1, 0, sz - 1, l, r); }
};

ll n, u, d, s;
vector<int> fair[505050];
ll pos[505050], score[505050];
ll dp[505050];

const int K = 500005;

int main() {
	fio();
	cin >> n >> u >> d >> s;
	for (int i = 0; i < n; i++) {
		int t1;
		cin >> t1 >> pos[i] >> score[i];
		fair[t1].push_back(i);
	}
	fair[K - 1].push_back(n);
	pos[n] = s;
	for (int i = 0; i <= K; i++) {
		sort(all(fair[i]), [&](int a, int b) {
			return pos[a] < pos[b];
			});
	}
	for (int i = 0; i <= K + 10; i++)
		dp[i] = -LINF;

	SegmentTreeMax segd(505050), segu(505050);
	for (int day = 0; day <= K; day++) {
		ll d1, d2;
		for (int h : fair[day]) {
			d1 = pos[h] < s ? (pos[h] - s) * u : (s - pos[h]) * d;
			d1 = max(d1, segd.query(0, pos[h] - 1) + (K - pos[h]) * d); // down
			d1 += score[h];
			dp[h] = max(dp[h], d1);
			segd.update(pos[h], d1 - (K - pos[h]) * d);
		}
		reverse(all(fair[day]));
		for (int h : fair[day]) {
			d2 = pos[h] < s ? (pos[h] - s) * u : (s - pos[h]) * d;
			d2 = max(d2, segu.query(pos[h] + 1, K) + pos[h] * u); // up
			d2 += score[h];
			dp[h] = max(dp[h], d2);
			segu.update(pos[h], d2 - pos[h] * u);
		}
		for (int h : fair[day]) {
			segd.update(pos[h], dp[h] - (K - pos[h]) * d);
			segu.update(pos[h], dp[h] - pos[h] * u);
		}
	}
	/*for (int i = 0; i <= n; i++) cout << dp[i] << ends;
	cout << endl;*/
	cout << dp[n];
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Runtime error 25 ms 24556 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 26 ms 24556 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 25 ms 24704 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 26 ms 24556 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -