結果
| 問題 |
No.1826 Fruits Collecting
|
| コンテスト | |
| ユーザー |
se1ka2
|
| 提出日時 | 2022-01-28 23:02:06 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,631 bytes |
| コンパイル時間 | 1,433 ms |
| コンパイル使用メモリ | 95,080 KB |
| 実行使用メモリ | 50,676 KB |
| 最終ジャッジ日時 | 2024-12-30 10:55:29 |
| 合計ジャッジ時間 | 43,069 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 33 TLE * 10 |
ソースコード
#include <atcoder/segtree>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
using namespace atcoder;
typedef long long ll;
typedef pair<ll, ll> P;
typedef pair<P, ll> PP;
const ll INF = 1000000000000000;
struct S{
ll x;
};
S mx(S a, S b){
return S{max(a.x, b.x)};
}
S e(){
return S{-INF};
}
ll l[200005], r[200005];
ll v[200005];
ll dp[200005];
P p[200005];
void divide_conquer(int a, int b){
if(b - a <= 10){
for(int i = a; i < b; i++){
for(int j = a; j < i; j++){
if(l[i] <= l[j] && r[i] >= r[j]) dp[i] = max(dp[i], dp[j] + v[i]);
}
}
return;
}
divide_conquer(a, (a + b) / 2);
map<ll, int> mp;
for(int i = a; i < b; i++) mp[l[i]]++;
int m = b - a, k = 0;
for(auto itr = mp.begin(); itr != mp.end(); itr++) mp[itr->first] = k++;
for(int e = 0; e < m; e++){
int i = a + e;
p[e] = P(r[i], i);
}
sort(p, p + m);
segtree<S, mx, e> seg(k);
for(int e = 0; e < m; e++){
int i = p[e].second;
if(i < (a + b) / 2) seg.set(mp[l[i]], mx(seg.get(mp[l[i]]), S{dp[i]}));
else dp[i] = max(dp[i], seg.prod(mp[l[i]], k).x + v[i]);
}
divide_conquer((a + b) / 2, b);
}
int main()
{
int n;
cin >> n;
PP q[200005];
q[0] = PP(P(0, 0), 0);
for(int i = 1; i <= n; i++){
ll t, x, v;
cin >> t >> x >> v;
q[i] = PP(P(t, x), v);
}
sort(q, q + n + 1);
for(int i = 0; i <= n; i++){
v[i] = q[i].second;
l[i] = q[i].first.second - q[i].first.first;
r[i] = q[i].first.second + q[i].first.first;
dp[i] = -INF;
}
dp[0] = 0;
divide_conquer(0, n + 1);
ll ans = 0;
for(int i = 1; i <= n; i++) ans = max(ans, dp[i]);
cout << ans << endl;
}
se1ka2