結果
| 問題 |
No.1234 典型RMQ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-09-18 22:13:50 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
CE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 3,235 bytes |
| コンパイル時間 | 792 ms |
| コンパイル使用メモリ | 92,016 KB |
| 最終ジャッジ日時 | 2025-01-14 17:17:55 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
main.cpp:97:18: error: ‘a’ has incomplete type
97 | static T f(T a, T b) { return {a[0]+b[0], min(a[1], b[1]+a[0])}; }
| ~~^
In file included from /usr/include/c++/13/bits/memory_resource.h:47,
from /usr/include/c++/13/string:58,
from /usr/include/c++/13/bits/locale_classes.h:40,
from /usr/include/c++/13/bits/ios_base.h:41,
from /usr/include/c++/13/ios:44,
from /usr/include/c++/13/ostream:40,
from /usr/include/c++/13/iostream:41,
from main.cpp:1:
/usr/include/c++/13/tuple:2019:45: note: declaration of ‘using Monoid::T = struct std::array<long long int, 2>’ {aka ‘struct std::array<long long int, 2>’}
2019 | template<typename _Tp, size_t _Nm> struct array;
| ^~~~~
main.cpp:97:23: error: ‘b’ has incomplete type
97 | static T f(T a, T b) { return {a[0]+b[0], min(a[1], b[1]+a[0])}; }
| ~~^
/usr/include/c++/13/tuple:2019:45: note: declaration of ‘using Monoid::T = struct std::array<long long int, 2>’ {aka ‘struct std::array<long long int, 2>’}
2019 | template<typename _Tp, size_t _Nm> struct array;
| ^~~~~
main.cpp:97:26: error: return type ‘using Monoid::T = struct std::array<long long int, 2>’ {aka ‘struct std::array<long long int, 2>’} is incomplete
97 | static T f(T a, T b) { return {a[0]+b[0], min(a[1], b[1]+a[0])}; }
| ^
main.cpp:98:18: error: return type ‘using Monoid::T = struct std::array<long long int, 2>’ {aka ‘struct std::array<long long int, 2>’} is incomplete
98 | static T e() { return {0, INF<ll>}; }
| ^
main.cpp: In function ‘int main()’:
main.cpp:113:16: error: cannot convert ‘<brace-enclosed initializer list>’ to ‘const SegmentTree<Monoid>::T&’ {aka ‘con
ソースコード
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <numeric>
#include <bitset>
#include <cmath>
static const int MOD = 1000000007;
using ll = long long;
using u32 = unsigned;
using u64 = unsigned long long;
using namespace std;
template<class T> constexpr T INF = ::numeric_limits<T>::max()/32*15+208;
template <class M>
struct SegmentTree{
using T = typename M::T;
int sz, n, height{};
vector<T> seg;
explicit SegmentTree(int n) {
sz = 1; while(sz < n) sz <<= 1, height++;
seg.assign(2*sz, M::e());
}
void set(int k, const T &x){ seg[k + sz] = x; }
void build(){
for (int i = sz-1; i > 0; --i) seg[i] = M::f(seg[2*i], seg[2*i+1]);
}
void update(int k, const T &x){
k += sz;
seg[k] = x;
while (k >>= 1) seg[k] = M::f(seg[2*k], seg[2*k+1]);
}
T query(int a, int b){
T l = M::e(), r = M::e();
for(a += sz, b += sz; a < b; a >>=1, b>>=1){
if(a & 1) l = M::f(l, seg[a++]);
if(b & 1) r = M::f(seg[--b], r);
}
return M::f(l, r);
}
template<class F>
int search_right(int l, F cond){
if(l == n) return n;
T val = M::e();
do {
while(!(l&1)) l >>= 1;
if(!cond(M::f(val, seg[l]))){
while(l < sz) {
l <<= 1;
if (cond(M::f(val, seg[l]))){
val = M::f(val, seg[l]);
l++;
}
}
return l - sz;
}
val = M::f(val, seg[l]);
l++;
} while((l & -l) != l);
return n;
}
template<class F>
int search_left(int r, F cond){
if(r == 0) return 0;
T val = M::e();
do {
while(r&1) r >>= 1;
if(!cond(M::f(val, seg[r]))){
while(r < sz) {
r = ((r << 1)|1);
if (cond(M::f(seg[r], val))){
val = M::f(seg[r], val);
r--;
}
}
return r + 1 - sz;
}
val = M::f(seg[r], val);
} while((r & -r) != r);
return 0;
}
T operator[](const int &k) const { return seg[k + sz]; }
};
struct Monoid{
using T = array<ll, 2>; // val, min
static T f(T a, T b) { return {a[0]+b[0], min(a[1], b[1]+a[0])}; }
static T e() { return {0, INF<ll>}; }
};
int main() {
int n;
cin >> n;
vector<ll> v(n);
for (auto &&i : v) scanf("%lld", &i);
for (int i = n-1; i > 0; --i) {
v[i] -= v[i-1];
}
SegmentTree<Monoid> seg(n);
for (int i = 0; i < n; ++i) {
seg.set(i, {v[i], v[i]});
}
seg.build();
int q;
cin >> q;
for (int i = 0; i < q; ++i) {
int k, l, r, c;
scanf("%d %d %d %d", &k, &l, &r, &c);
l--;
if(k == 1){
v[l] += c; seg.update(l, {v[l], v[l]});
if(r != n) v[r] -= c, seg.update(r, {v[r], v[r]});
}else {
printf("%lld\n", seg.query(0, l)[0]+seg.query(l, r)[1]);
}
}
return 0;
}