AT dp W

news/2024/9/19 17:20:08/文章来源:https://www.cnblogs.com/yaosicheng124/p/18416435

题目描述

定义一个长度为 \(N\)\(01\)\(S\) 的得分为:

  • 对于每个 \(1\le i\le M\),如果存在 \(l_i\le j\le r_i 且 S_j=1\),则将 \(a_i\) 添加到得分中。(\(a_i\) 可能为负数)

找到字符串的最大可能得分。

思路

我们试着将问题反过来:只有在 \([l_i,r_i]\) 中全是 \(0\),那么你将会失去 \(a_i\) 分。

\(dp_i\) 表示最后一个 \(1\)\(i\) 时的最大分数。

如果说某个从 \(i\rightarrow j\) 的转移满足 \(i<l_k 且 j>r_k\),那么你将会失去 \(a_k\) 分,因为在 \([i+1,j-1]\) 中全都是 \(0\)

可以考虑用线段树维护。我们对每个 \(i\)\(r_i+1\) 处记录区间 \(i\)。那么当你在求 \(dp_j\) 时,就可以将所有该位置记录的 \([1,l_i-1]\)\(dp\) 值减 \(a_i\)。因为这种转移符合上面的条件,应该减去。

空间复杂度 \(O(N+M)\),时间复杂度 \(O((N+M)\log N)\)

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
using ll = long long;
using pii = pair<int, int>;const int MAXN = 200005;struct Segment_Tree {int l[MAXN << 2], r[MAXN << 2];ll Max[MAXN << 2], lazy[MAXN << 2];void build(int u, int s, int t) {l[u] = s, r[u] = t, Max[u] = lazy[u] = 0;if(s == t) {return;}int mid = (s + t) >> 1;build(u << 1, s, mid), build((u << 1) | 1, mid + 1, t);}void tag(int u, ll x) {Max[u] += x, lazy[u] += x;}void pushdown(int u) {tag(u << 1, lazy[u]), tag((u << 1) | 1, lazy[u]), lazy[u] = 0;}void update(int u, int s, int t, ll x) {if(l[u] >= s && r[u] <= t) {tag(u, x);return;}pushdown(u);if(s <= r[u << 1]) {update(u << 1, s, t, x);}if(t >= l[(u << 1) | 1]) {update((u << 1) | 1, s, t, x);}Max[u] = max(Max[u << 1], Max[(u << 1) | 1]);}ll Getmax(int u, int s, int t) {if(s > t) {return 0;}if(l[u] >= s && r[u] <= t) {return Max[u];}ll x = -(ll)(1e18);if(s <= r[u << 1]) {x = max(x, Getmax(u << 1, s, t));}if(t >= l[(u << 1) | 1]) {x = max(x, Getmax((u << 1) | 1, s, t));}return x;}
}tr;int n, m;
ll dp[MAXN], sum, Max;
vector<pii> ve[MAXN];signed main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n >> m;for(int i = 1, l, r, x; i <= m; ++i) {cin >> l >> r >> x;ve[r + 1].push_back({l, -x});sum += x;}tr.build(1, 1, n + 1);for(int i = 1; i <= n + 1; ++i) {for(auto [l, x] : ve[i]) {tr.update(1, 1, l, x);}dp[i] = tr.Getmax(1, 1, i);if(i <= n) {tr.update(1, i + 1, i + 1, dp[i]);}Max = max(Max, dp[i]);}cout << sum + Max;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/798129.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用户验收测试指南0简介

0 简介 这是一本关于多种形式的用户验收测试(UAT)及其用途的。它汇集了有关测试、项目管理、质量管理、团队行为和完整的用户验收测试经验的其他相关材料,并将它们编织成一条牢固可靠的生命线,供用户验收测试新手指南或利益相关者参考。 本书是为满足三类不同人群的需求而编…

以太网PHY芯片详解

以太网PHY芯片详解 什么是phy phy的基本作用 收到MAC过来的数据(PHY没有帧的概念,都是数据而不管什么地址数据还是CRC),进行处理,然后把并行数据转化为串行流数据,再按照物理层的编码规则把数据编码,再变为模拟信号把数据送出去。 实现CSMA/CD(多点接入载波监听/冲突检…

pwnos1

文件泄露 80端口下存在文件读取 尝试读取用户列表 http://192.168.1.110/index1.php?help=true&connect=../../../../../../../etc/passwdroot:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh…

pwnos2

这台靶机要自行配置攻击机在10.10.10.0/24网段下 sql注入 80端口login处发现可以注入的地方,sqlmap能梭出来很多东西,但是好像都登录不了,--os-shell也是没回显的 sqlmap -u http://10.10.10.100/login.php --data="email=1&pass=1&submit=Login&submitted…

urllib自定义opener对象设置代理IP

urllib.request.urlopen()源代码——urlopen()在干什么返回opener.open(url, data, timeout)方法的结果_opener = None # _opener被赋值为None def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,*, cafile=None, capath=None, cadefault=False, context=N…

成功塑造孩子的人生,这一步很关键!

塑造孩子行为极为重要 思维决定行为,行为决定习惯,这一理念在家庭教育中尤为重要。明智的家长如同经验丰富的指导者,细心关注并引领孩子塑造正确的行为。他们深知每个孩子都是独一无二的,拥有独特的性格与潜力,不可简单复制或预设。当孩子遭遇困难时,应及时给予支持引导其…

CSP 初赛要点复习

位运算 逻辑与、按位与之类的东西是不同的!“逻辑”的是判断两个数都不为 \(0\),“按位”的是判断两个数的每一个二进制位与的结果,是不同的。其他运算也类似。 运算符优先级如图所示:注意,~ 和 ! 是同级的。 加法位运算表示:a+b=(a^b)+((a&b)<<1)。

7、队列

1、链队#include<stdio.h> #include<malloc.h> #include<assert.h>#define ElemType inttypedef struct QueueNode{ElemType data;struct QueueNode* next; }QueueNode; typedef struct LinkQueue{QueueNode* front;//队头QueueNode* tail;//队尾 }LinkQueu…

内存对齐和缓冲区溢出攻击

.一、问候语 欢迎你来到我的博客! 二、什么是内存对齐计算机中内存空间都是按照字节(byte)进行划分的,所以从理论上讲对于任何类型的变量访问都可以从任意地址开始,但是在实际情况中,在访问特定类型变量的时候经常在特定的内存地址访问,所以这就需要把各种类型数据按照一定…

ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)

名词缩写ASID:Address Space ID 地址空间标识符 CD:Context Descriptor; 上下文描述符; CTP:Context-table pointer 上下文表指针 EPT:Extended Page Table 扩展页表 GPA:Guest Phyical Address 客人的实际地址 GVA:Guest Virtual Address 访客虚拟地址 HPA:Host…

博客园评论区头像换页更新解决方案

使用 MutationObserver 解决了评论区头像换页无法更新的问题。前言 博客园博客正文的评论区的每一条评论其实都是带用户头像链接的,因此有些博客主题利用这个链接,对评论新增了头像显示功能。 但是这部分功能只能在第一次加载页面时有效,一旦出现评论翻页、排序等操作,头像…