Intervals 题解
题目大意
给定 \(m\) 条形如 \((l_i,r_i,a_i)\) 的规则,你需要求出一个长为 \(n\) 的分数最大的 01 串的分数,其中一个 01 串 \(A\) 的分数被定义为
\]
思路分析
考虑 DP。
设 \(f_{i,j}\) 表示考虑 01 串的前 \(i\) 个数,最后一个 \(1\) 放在 \(j\) 时的最大分数,首先有一个特殊的转移:
\]
也就是枚举前 \(i-1\) 个数中上一个 \(1\) 放在哪个位置,对所有可能的情况取 \(\max\)。
考虑一般情况:
从 \(i-1\) 转移到 \(i\),新的贡献只从所有右端点为 \(i\) 的区间产生,考虑到产生贡献的条件是至少包含一个 \(1\),而最后的 \(1\) 位于 \(j\),故只有这个区间包含 \(j\) 的时候才会产生贡献,故有状态转移方程:
\]
直接转移的时间复杂度是 \(O(n^3)\) 的,不过可以通过将区间排序加双指针做到均摊 \(O(n^2)\),但依然无法通过,考虑优化。
首先发现转移只与上一维有关,可以直接优化掉 \(i\),使空间复杂度降为 \(O(n)\)。
考虑哪些区间对 \(f\) 产生贡献,不难发现,只要区间包含 \(f\) 的端点,它就对 \(f\) 有贡献,那么我们就可以把 \(f\) 丢到线段树上,对于每一个区间进行一次线段树上的区间加操作,维护区间的最大值即可。
注意 01 串全为 \(0\) 时其分数为 \(0\),故不可能产生负分数,所有的分数需要和 \(0\) 取 \(\max\)。
代码
#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;
}
Intervals 题解的更多相关文章
- 【LeetCode】Merge Intervals 题解 利用Comparator进行排序
题目链接Merge Intervals /** * Definition for an interval. * public class Interval { * int start; * int e ...
- HDOJ1384 Intervals 题解
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1384 大意:有 \(n\) 个区间 \([a_i,b_i]\),每个区间有个权值 \(c_i\),找到 ...
- POJ1375:Intervals——题解
http://poj.org/problem?id=1375 题目大意:有一盏灯,求每段被圆的投影所覆盖的区间. —————————————————————— 神题,卡精度,尝试用各种方法绕过精度都不 ...
- [Leetcode Week2]Merge Intervals
Merge Intervals题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/merge-intervals/description/ Descript ...
- 算法与数据结构基础 - 排序(Sort)
排序基础 排序方法分两大类,一类是比较排序,快速排序(Quick Sort).归并排序(Merge Sort).插入排序(Insertion Sort).选择排序(Selection Sort).希尔 ...
- 算法与数据结构基础 - 贪心(Greedy)
贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...
- [LeetCode]题解(python):056-Merge Intervals
题目来源 https://leetcode.com/problems/merge-intervals/ Given a collection of intervals, merge all overl ...
- 【题解】【区间】【二分查找】【Leetcode】Insert Interval & Merge Intervals
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- LeetCode 题解 56. Merge Intervals
题目大意:给出一组区间,合并他们. 首先是排序,首先看start,start小的在前面.start相同的话,end小的在前面. 排序以后,要合并了. 我自己的笨方法,说实在的问题真的很多.提交了好几次 ...
- leetcode个人题解——#56 Merge Intervals
思路,先按照结构体中start进行排序,然后遍历比较前后项是否有重合. 第一次用到三参数形式的sort(),第三个参数的bool函数要写到类外才通过. /** * Definition for an ...
随机推荐
- SQL Server中的NULL值处理:判断与解决方案
摘要: 在SQL Server数据库中,NULL是表示缺少数据或未知值的特殊标记.处理NULL值是SQL开发人员经常遇到的问题之一.本文将介绍SQL Server中判断和处理NULL值的不同方法,以及 ...
- 在Linux环境下通过命令行执行JMeter脚本后查看响应结果的配置
在Linux环境中进行性能测试时,我们可能会遇到一定程度的报错.如果无法打开JMeter的GUI界面,但又需要查看响应结果,可以按照以下步骤进行配置: 1. 打开JMeter的安装目录,在`bin/` ...
- Visual Studio C# 多环境配置 Web.config
目录 添加解决方案配置 添加配置转换 添加应对的配置 Visual Studio 为多环境配置 Web.config 不同的环境,存在不同的配置,如:数据库连接字符串,通过多配置,方便做环境切换,配置 ...
- python移动文件
#移动文件(目录) shutil.move("oldpos","newpos") shutil.move("D:/知乎日报/latest/一张优惠券, ...
- Django日志输出
# 自定义日志输出信息 LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'formatters': { 'standard': ...
- [Go笔记] 基础-01: Golang发展简史、著名项目及基本使用
引言 Golang,又称Go语言,是一门开源的静态类型编译型编程语言.自从2007年由谷歌的罗伯特·格里泽默(Robert Griesemer).罗布·派克(Rob Pike)和肯·汤普森(Ken T ...
- python将print的打印内容保存到日志
将python程序中的所有打印内容都输出到日志文件中,在程序执行完成后,方便查询程序运行过程是否出现异常. 1. 将打印内容输出到日志文件 1.1 代码实现: sys.stdout = open('s ...
- 文心一言 VS 讯飞星火 VS chatgpt (76)-- 算法导论7.3 1题
一.如果用go语言,为什么我们分析随机化算法的期望运行时间,而不是其最坏运行时间呢? 文心一言: 在分析算法的性能时,期望运行时间是一个重要的指标,它描述了算法在平均情况下的表现.期望运行时间考虑了所 ...
- AI绘画StableDiffusion美女实操教程:斗破苍穹-小医仙
之前分享过StableDiffusion的入门到精通教程:AI绘画:Stable Diffusion 终极炼丹宝典:从入门到精通 但是还有人就问:安装是安装好了,可是为什么生成的图片和你生成的图片差距 ...
- Redis的五大数据类型的数据结构
概述 Redis底层有六种数据类型包括:简单动态字符串.双向链表.压缩列表.哈希表.跳表和整数数组.这六种数据结构五大数据类型关系如下: String:简单动态字符串 List:双向链表.压缩列表 ...