Intervals 题解
Intervals
题目大意
给定
思路分析
考虑 DP。
设
也就是枚举前
考虑一般情况:
从
直接转移的时间复杂度是
首先发现转移只与上一维有关,可以直接优化掉
考虑哪些区间对
注意 01 串全为
代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <cmath>
using namespace std;
const int N=200200;
#define int long long
#define mid ((l+r)>>1)
int n,m,in1,in2,in3;
struct Node{
int l,r,a;
}a[N];
vector<Node> v[N];
struct ST{
int maxn[N<<2],tag[N<<2];
void change_t(int p,int k){
maxn[p]+=k;tag[p]+=k;
}
void push_down(int p){
if(!tag[p]) return ;
change_t(p<<1,tag[p]);
change_t(p<<1|1,tag[p]);
tag[p]=0;
}
void change(int p,int l,int r,int x,int y,int k){
if(x<=l&&r<=y){change_t(p,k);return ;}
push_down(p);
if(x<=mid) change(p<<1,l,mid,x,y,k);
if(y>mid) change(p<<1|1,mid+1,r,x,y,k);
maxn[p]=max(maxn[p<<1],maxn[p<<1|1]);
}
}tree;
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++){
scanf("%lld%lld%lld",&in1,&in2,&in3);
a[i]=Node{in1,in2,in3};
v[in2].push_back(a[i]);
}
for(int i=1;i<=n;i++){
tree.change(1,1,n,i,i,max(tree.maxn[1],0ll));
for(auto it:v[i])
tree.change(1,1,n,it.l,i,it.a);
}
cout<<max(tree.maxn[1],0ll)<<'\n';
return 0;
}