結果
| 問題 |
No.631 Noelちゃんと電車旅行
|
| コンテスト | |
| ユーザー |
Ryu
|
| 提出日時 | 2018-07-02 18:02:31 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 280 ms / 2,000 ms |
| コード長 | 3,085 bytes |
| コンパイル時間 | 1,152 ms |
| コンパイル使用メモリ | 93,488 KB |
| 実行使用メモリ | 11,264 KB |
| 最終ジャッジ日時 | 2024-10-02 09:37:40 |
| 合計ジャッジ時間 | 6,359 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <string>
#include <cmath>
#include <map>
#include <cstring>
#include <queue>
#define REP(i, n) for (int i = 0; i < (n); i++)
#define FOR(i, init, n) for (int i = init; i < (n); i++)
#define ALL(obj) (obj).begin(), (obj).end()
#define RALL(obj) (obj).rbegin(), (obj).rend()
#define Cout(obj) cout << obj << endl
#define Size(obj) (int)(obj).size()
#define fcout cout << fixed << setprecision(10)
#define fi first
#define se second
using namespace std;
using ll = long long int;
using P = pair<int, int>;
using T = tuple<int, int, int>;
using edge = struct
{
int to, cost;
};
const int MOD = 1e9 + 7;
const int iINF = 1e9;
const long long int llINF = 1e18;
const double PI = acos(-1.0);
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};
template <typename T>
struct LazzySegTreeMax
{
private:
ll N = 1;
vector<T> node, lazy;
public:
LazzySegTreeMax(vector<T> vec)
{
ll size = Size(vec);
while (N < size)
{
N *= 2;
}
node.resize(2 * N - 1);
lazy.resize(2 * N - 1, 0);
REP(i, size)
{
node[i + N - 1] = vec[i] + (size - i) * 3;
}
for (int i = N - 2; 0 <= i; i--)
{
node[i] = max(node[2 * i + 1], node[2 * i + 2]);
}
}
void eval(int k, int l, int r)
{
if (lazy[k] != 0)
{
node[k] += lazy[k];
if (r - l > 1)
{
lazy[2 * k + 1] += lazy[k];
lazy[2 * k + 2] += lazy[k];
}
lazy[k] = 0;
}
}
void add(int a, int b, T value, int k = 0, int l = 0, int r = -1)
{
if (r < 0)
r = N;
eval(k, l, r);
if (r <= a || b <= l)
return;
if (a <= l && r <= b)
{
lazy[k] += value;
eval(k, l, r);
}
else
{
add(a, b, value, 2 * k + 1, l, (l + r) / 2);
add(a, b, value, 2 * k + 2, (l + r) / 2, r);
node[k] = max(node[2 * k + 1], node[2 * k + 2]);
}
}
T getMax(int a, int b, int k = 0, int l = 0, int r = -1)
{
if (r < 0)
{
r = N;
}
eval(k, l, r);
if (r <= a || b <= l)
{
return -iINF;
}
if (a <= l && r <= b)
{
return node[k];
}
T vl = getMax(a, b, 2 * k + 1, l, (l + r) / 2);
T vr = getMax(a, b, 2 * k + 2, (l + r) / 2, r);
return max(vl, vr);
}
};
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
int N;
cin >> N;
vector<ll> T(N - 1);
REP(i, N - 1)
{
cin >> T[i];
}
int M;
cin >> M;
vector<ll> L(M), R(M), D(M);
REP(i, M)
{
cin >> L[i] >> R[i] >> D[i];
}
LazzySegTreeMax<ll> seg(T);
REP(i, M)
{
seg.add(L[i] - 1, R[i], D[i]);
Cout(seg.getMax(0, N));
}
return 0;
}
Ryu