結果
| 問題 |
No.2697 Range LIS Query
|
| コンテスト | |
| ユーザー |
srjywrdnprkt
|
| 提出日時 | 2024-03-22 23:16:48 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 5,089 ms / 10,000 ms |
| コード長 | 3,998 bytes |
| コンパイル時間 | 2,148 ms |
| コンパイル使用メモリ | 215,344 KB |
| 最終ジャッジ日時 | 2025-02-20 12:32:23 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 15 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template<class S, S (*op)(S, S), S (*e)(),
class F, S (*mapping)(F, S), F (*composition)(F, F), F (*id)()>struct LazySegTree {
private:
vector<S> seg; vector<F> lazy; int N = 1;
void eval (int idx, int bitl, int bitr){
if (lazy[idx] != id()){
seg[idx] = mapping(lazy[idx], seg[idx]);
if (bitl != bitr){
lazy[2*idx+1] = composition(lazy[idx], lazy[2*idx+1]);
lazy[2*idx+2] = composition(lazy[idx], lazy[2*idx+2]);
}
lazy[idx] = id();
}
}
void _set (int l, int r, F val, int idx, int bitl, int bitr){
eval(idx, bitl, bitr);
if (r < bitl || l > bitr) return;
if (l <= bitl && bitr <= r){
lazy[idx] = composition(lazy[idx], val);
eval(idx, bitl, bitr);
}
else{
int bitm = (bitl+bitr)/2;
_set(l, r, val, idx*2+1, bitl, bitm);
_set(l, r, val, idx*2+2, bitm+1, bitr);
seg[idx] = op(seg[idx*2+1], seg[idx*2+2]);
}
}
S _prod (int l, int r, int idx, int bitl, int bitr) {
if (r < bitl || l > bitr) return e();
eval(idx, bitl, bitr);
if (l <= bitl && bitr <= r) return seg[idx];
int bitm = (bitl+bitr)/2;
return op(_prod(l, r, idx*2+1, bitl, bitm), _prod(l, r, idx*2+2, bitm+1, bitr));
}
public:
LazySegTree (int n) : LazySegTree(vector<S>(n, e())) {}
LazySegTree (const vector<S> &v){
int n = v.size(); while (N < n) N *= 2; seg.resize(N*2-1, e()); lazy.resize(N*2-1, id());
for (int i=0; i<n; i++) seg[i+N-1] = v[i];
for (int i=N-2; i>=0; i--) seg[i] = op(seg[i*2+1], seg[i*2+2]);
}
//a[i] -> f(a[i]) for l<=i<=r
void set (int l, int r, F val){_set(l, r, val, 0, 0, N-1);}
//op(a[l], ..., a[r])
S prod (int l, int r) {return _prod(l, r, 0, 0, N-1);}
S all_prod() const{return seg[0];}
S get (int i) {return prod(i, i);}
void show() const{
for (int i=0; i<N*2-1; i++) cout << seg[i] << " ";
for (int i=0; i<N*2-1; i++) cout << lazy[i] << " ";
}
};
using S = pair<int, vector<vector<int>>>;
using F = int;
F ID = -1;
S op(S a, S b){
vector res(4, vector<int>(4, 0));
for (int i=0; i<4; i++){
for (int j=0; j<4; j++){
for (int k=i; k<=j; k++){
res[i][j] = max(res[i][j], a.second[i][k] + b.second[k][j]);
}
}
}
return {a.first + b.first, res};
}
S e() {return {0, vector(4, vector<int>(4, 0))};}
S mapping(F f, S x){
if (f == ID) return x;
vector res(4, vector<int>(4, 0));
for (int i=0; i<4; i++){
for (int j=0; j<4; j++){
if (i <= f && f <= j) res[i][j] = x.first;
else res[i][j] = 0;
}
}
return {x.first, res};
}
F composition(F f, F g){
if (f == ID) return g;
else return f;
}
F id() {return ID;}
int main(){
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
int N, Q, t, l, r, x, A;
cin >> N;
vector<S> v(N);
for (int i=0; i<N; i++){
cin >> A; A--;
vector res(4, vector<int>(4, 0));
for (int j=0; j<4; j++){
for (int k=0; k<4; k++){
if (j <= A && A <= k) res[j][k] = 1;
else res[j][k] = 0;
}
}
v[i] = {1, res};
}
cin >> Q;
LazySegTree<S, op, e, F, mapping, composition, id> tree(v);
for (int i=0; i<Q; i++){
cin >> t;
if (t == 1){
cin >> l >> r; l--; r--;
cout << tree.prod(l, r).second[0][3] << endl;
}
else{
cin >> l >> r >> x; x--; l--; r--;
tree.set(l, r, x);
}
}
return 0;
}
srjywrdnprkt