[CF115E] Linear Kingdom Races
[CF115E] Linear Kingdom Races
Description
有
Solution
我们考虑朴素的
复杂度
我们考虑线段树优化,我们维护对于每一个
而后我们考虑每次枚举新的
- 将线段树上
减去 ,因为强制 修好。 - 对于每个右端点为
的比赛,将线段树上 的值都 ,因为我们考虑 后面的路都已经修好,可以使得这些比赛价值叠加。 - 更新状态
。 - 更新线段树上的值。
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls (k<<1)
#define rs (k<<1|1)
#define mid ((l+r)>>1)
const int N=5e6+7;
int a[N],n,m;
struct node{
int x,v;
node(int a,int b){x=a,v=b;}
};
vector<node> vec[N];
int f[N];
namespace T{
int maxx[N],tag[N];
void upd(int k,int val){
maxx[k]+=val;
tag[k]+=val;
}
void pushdown(int k){
if(!tag[k]) return;
upd(ls,tag[k]),upd(rs,tag[k]);
tag[k]=0;
}
void pushup(int k){maxx[k]=max(maxx[ls],maxx[rs]);}
void modify(int k,int l,int r,int x,int y,int val){
if(x<=l&&y>=r) return upd(k,val);
pushdown(k);
if(x<=mid) modify(ls,l,mid,x,y,val);
if(y>=mid+1) modify(rs,mid+1,r,x,y,val);
pushup(k);
}
int query(int k,int l,int r,int x,int y){
if(x<=l&&y>=r) return maxx[k];
pushdown(k);
int res=-0x3f3f3f3f;
if(x<=mid) res=max(res,query(ls,l,mid,x,y));
if(y>=mid+1) res=max(res,query(rs,mid+1,r,x,y));
return res;
}
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=m;i++){
int x,y,v;scanf("%lld%lld%lld",&x,&y,&v);
vec[y].push_back(node(x,v));
}
for(int i=1;i<=n;i++){
T::modify(1,0,n,0,i-1,-a[i]);
for(auto [l,v]:vec[i]){
T::modify(1,0,n,0,l-1,v);
}
f[i]=max(f[i-1],T::query(1,0,n,0,i-1));
T::modify(1,0,n,i,i,f[i]);
}
printf("%lld",f[n]);return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!