結果
| 問題 | No.448 ゆきこーだーの雨と雪 (3) |
| コンテスト | |
| ユーザー |
monman53
|
| 提出日時 | 2018-02-07 13:26:58 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,779 bytes |
| コンパイル時間 | 1,477 ms |
| コンパイル使用メモリ | 171,416 KB |
| 実行使用メモリ | 8,708 KB |
| 最終ジャッジ日時 | 2024-09-14 15:58:15 |
| 合計ジャッジ時間 | 6,397 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 11 WA * 24 |
ソースコード
// header {{{
#include <bits/stdc++.h>
using namespace std;
// {U}{INT,LONG,LLONG}_{MAX,MIN}
#define INF INT_MAX/3
#define LLINF LLONG_MAX/3
#define MOD (1000000007LL)
#define MODA(a, b) a=((a)+(b))%MOD
#define MODP(a, b) a=((a)*(b))%MOD
#define inc(i, l, r) for(long long i=(l);i<(r);i++)
#define dec(i, l, r) for(long long i=(r)-1;i>=(l);i--)
#define pb push_back
#define se second
#define fi first
#define mset(a, b) memset(a, b, sizeof(a))
using LL = long long;
using G = vector<vector<int>>;
int di[] = {0, -1, 0, 1};
int dj[] = {1, 0, -1, 0};
// }}}
struct BIT {
vector<LL> bit;
int n;
BIT(int n) {
bit.resize(n+1, 0);
this->n = n;
}
LL query(int i) {
LL mmax = 0;
while(i > 0){
mmax = max(mmax, bit[i]);
// i & -i はiの最後の1のビット
i -= i & -i;
}
return mmax;
}
void set(int i, LL x) {
while(i <= n){
bit[i] = max(bit[i], x);
i += i & -i;
}
}
};
int main() {
std::ios::sync_with_stdio(false);
int n, k;cin >> n >> k;
vector<int> t(n), d(n), v;
priority_queue<pair<int, int>> pq;
LL sum = 0;
inc(i, 0, n){
cin >> t[i] >> d[i];
sum += d[i];
pq.push({d[i], i});
}
v = d;
int ansmax = 0;
while(!pq.empty()){
int i = pq.top().second;
pq.pop();
if(!d[i]) continue;
bool flag = false;
inc(j, i+1, n){
if(d[j] == 0 || t[j]-t[i] >= k) break;
if(d[j] == d[i]) flag = true;
}
dec(j, 0, i){
if(d[j] == 0 || t[i]-t[j] >= k) break;
if(d[j] == d[i]) flag = true;
}
if(flag) break;
//cout << d[i] << endl;
sum -= d[i];
d[i] = 0;
v[i] = 0;
inc(j, i+1, n){
if(d[j] == 0 || t[j]-t[i] >= k) break;
//ansmax = max(ansmax, d[j]);
d[j] = 0;
}
dec(j, 0, i){
if(d[j] == 0 || t[i]-t[j] >= k) break;
//ansmax = max(ansmax, d[j]);
d[j] = 0;
}
}
BIT bit(n);
LL ans = 0;
inc(i, 0, n){
int ng = i;
int ok = n;
while(ok-ng>1){
int m = (ng+ok)/2;
if(t[m]-t[i] >= k){
ok = m;
}else{
ng = m;
}
}
//cout << i << " " << d[i] << " " << ok << endl;
if(ok == n){
ans = max(ans, bit.query(i)+d[i]);
}else{
bit.set(ok, bit.query(i)+d[i]);
}
}
//cout << ans << endl;
cout << *max_element(v.begin(), v.end()) << endl;
cout << sum-ans << endl;
return 0;
}
monman53