IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【线段树】Serious Business(CF1648D) -> 正文阅读

[数据结构与算法]【线段树】Serious Business(CF1648D)

正题

luogu
CF1648D


题目大意

有一个 3*n 的矩阵,1,3行没有行走限制,对于第2行,有m个区间,覆盖第 i 个区间有 k i k_i ki? 的代价,只有覆盖的位置才能走,让你从 (1,1) 走到 (3,n)(只能向下和向右走) ,答案为经过的每个点的权值之和减去代价之和,问你答案最大值


解题思路

可以把第2行的权值用前缀和计算,令 A i = ∑ j = 1 i s 1 , j ? ∑ j = 1 i ? 1 s 2 , j , B i = ∑ j = i n s 3 , j + ∑ j = 1 i s 2 , j A_i=\sum_{j=1}^i s_{1,j}-\sum_{j=1}^{i-1} s_{2,j},B_i=\sum_{j=i}^n s_{3,j}+\sum_{j=1}^{i} s_{2,j} Ai?=j=1i?s1,j??j=1i?1?s2,j?,Bi?=j=in?s3,j?+j=1i?s2,j?

答案就转化为了在第二行走一段路答案为 A b g + B e d A_{bg}+B_{ed} Abg?+Bed?,这个可以先按区间的左端点排序,然后再线段树上依次往后贡献即可


code

#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 500500
using namespace std;
ll n,m,sum,ans,X[N],Y[N],Z[N],a[4][N],b[N];
vector<ll>l[N];
const ll inf=1e18;
struct Tree
{
	#define ls x*2
	#define rs x*2+1
	ll s[N<<2],v[N<<2],lazy[N<<2],lazyy[N<<2];
	void push_up(ll x)
	{
		s[x]=max(s[ls],s[rs]);
		v[x]=max(v[ls],v[rs]);
		return;
	}
	void get(ll x,ll ad,ll an)
	{
		s[x]=max(s[x],max(v[x]-ad,an));
		lazy[x]=min(lazy[x],ad);
		lazyy[x]=max(lazyy[x],an);
		return;
	}
	void push_down(ll x)
	{
		get(ls,lazy[x],lazyy[x]);
		get(rs,lazy[x],max(lazyy[x],max(v[ls],s[ls])-lazy[x]));
		lazy[x]=inf;
		lazyy[x]=-inf;
		return;
	}
	void build(ll x,ll l,ll r)
	{
		s[x]=lazyy[x]=-inf;
		lazy[x]=inf;
		if(l==r){
			v[x]=b[l];
			return;
		}
		ll mid=l+r>>1;
		build(ls,l,mid);
		build(rs,mid+1,r);
		push_up(x);
		return;
	}
	ll change(ll x,ll L,ll R,ll l,ll r,ll ad,ll an)
	{
		if(L==l&&R==r){
			get(x,ad,an);
			return max(v[x],s[x]);
		}
		push_down(x);
		ll mid=L+R>>1,g;
		if(r<=mid)g=change(ls,L,mid,l,r,ad,an);
		else if(l>mid)g=change(rs,mid+1,R,l,r,ad,an);
		else{
			g=change(ls,L,mid,l,mid,ad,an);
			g=max(g,change(rs,mid+1,R,mid+1,r,ad,max(an,g-ad)));
		}
		push_up(x);
		return g;
	}
	ll ask(ll x,ll l,ll r,ll y)
	{
		if(l==r)return s[x];
		push_down(x);
		ll mid=l+r>>1;
		if(y<=mid)return ask(ls,l,mid,y);
		else return ask(rs,mid+1,r,y);
	}
}T;
int main()
{
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=3;++i)
		for(ll j=1;j<=n;++j)
			scanf("%lld",&a[i][j]);
	for(ll i=1;i<=n;++i)
		b[i]=b[i-1]+a[1][i]-a[2][i-1];
	for(ll i=1;i<=m;++i){
		scanf("%lld%lld%lld",&X[i],&Y[i],&Z[i]);
		l[X[i]].push_back(i);
	}
	T.build(1,1,n);
	for(ll i=1;i<=n;++i)
		for(ll j=0;j<l[i].size();++j)
			T.change(1,1,n,i,Y[l[i][j]],Z[l[i][j]],(i>1?T.ask(1,1,n,i-1)-Z[l[i][j]]:-inf));
	for(ll i=1;i<=n;++i)
		sum+=a[3][i];
	ans=-inf;
	for(ll i=1;i<=n;++i){
		b[i]=b[i-1]+a[2][i]-a[3][i-1];
		ans=max(ans,sum+b[i]+T.ask(1,1,n,i));
	}
	printf("%lld",ans);
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:50:27  更:2022-03-15 22:53:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:36:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码