結果
問題 | No.2808 Concentration |
ユーザー |
|
提出日時 | 2024-07-14 05:10:58 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 448 ms / 2,000 ms |
コード長 | 2,724 bytes |
コンパイル時間 | 2,230 ms |
コンパイル使用メモリ | 204,320 KB |
最終ジャッジ日時 | 2025-02-22 06:35:04 |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 57 |
ソースコード
#include <bits/stdc++.h>using namespace std;using SS = long long;using FF = long long;class LazySegmentTree{public:int siz = 1;vector<SS> dat;vector<FF> lazy;FF ID = 0;SS op(SS a,SS b){return max(a,b);}SS mapping(FF f, SS x){return f+x;}FF composition(FF f, FF g){return f+g;}SS e(){return 0;}FF id(){return ID;}//op区間演算 mapping lazy→data composition lazy→lazy//e 単位元 id map(id,a)=avoid make(int N){while(siz < N) siz *= 2;dat.resize(siz*2,e());lazy.resize(siz*2,ID);}void make2(int N,vector<SS> &A){make(N);for(int i=0; i<N; i++){int pos = i+siz-1;dat.at(pos) = A.at(i);}for(int i=siz-2; i>=0; i--) dat.at(i) = op(dat.at(i*2+1),dat.at(i*2+2));}void eval(int u,int a,int b){if(id() != lazy.at(u)){dat.at(u) = mapping(lazy.at(u),dat.at(u));if(b-a > 1){lazy.at(u*2+1) = composition(lazy.at(u),lazy.at(u*2+1));lazy.at(u*2+2) = composition(lazy.at(u),lazy.at(u*2+2));}lazy.at(u) = id();}}void findadd(int L,int R,int a,int b,int u,FF x){eval(u,a,b);if(R <= a || b <= L) return;if(L <= a && b <= R){lazy.at(u) = composition(x,lazy.at(u));eval(u,a,b);}else{findadd(L,R,a,(a+b)/2,u*2+1,x);findadd(L,R,(a+b)/2,b,u*2+2,x);dat.at(u) = op(dat.at(u*2+1),dat.at(u*2+2));}}void update(int L,int R,FF x){findadd(L,R,0,siz,0,x);}SS findans(int L,int R,int a,int b,int u){if(R <= a || b <= L) return e();eval(u,a,b);if(L <= a && b <= R) return dat.at(u);return op(findans(L,R,a,(a+b)/2,u*2+1),findans(L,R,(a+b)/2,b,u*2+2));}SS get(int pos){return findans(pos,pos+1,0,siz,0);}SS rangeans(int l,int r){return findans(l,r,0,siz,0);}SS allrange(){return findans(0,siz,0,siz,0);}};int main() {ios_base::sync_with_stdio(false);cin.tie(nullptr);int N,S,H; cin >> N >> S >> H;vector<int> X(N),Y(N),Z(N);for(int i=0; i<N; i++) cin >> X.at(i) >> Y.at(i) >> Z.at(i);LazySegmentTree dp1,dp2;dp1.make(N),dp2.make(N);for(int i=0; i<N; i++){int r = lower_bound(Y.begin(),Y.end(),X.at(i)-H)-Y.begin();long long now = dp2.rangeans(0,r);dp1.update(i,i+1,now); dp1.update(0,i+1,Z.at(i));int l = lower_bound(X.begin(),X.end(),Y.at(i)-S)-X.begin();now = dp1.rangeans(l,i+1);dp2.update(i,i+1,now);}cout << dp2.allrange() << endl;}