Intervals

题目大意

给定 \(m\) 条形如 \((l_i,r_i,a_i)\) 的规则,你需要求出一个长为 \(n\) 的分数最大的 01 串的分数,其中一个 01 串 \(A\) 的分数被定义为

\[\sum_{i=1}^ma_i[\sum_{j=l_i}^{r_i}A_j\ge 1]
\]

思路分析

考虑 DP。

设 \(f_{i,j}\) 表示考虑 01 串的前 \(i\) 个数,最后一个 \(1\) 放在 \(j\) 时的最大分数,首先有一个特殊的转移:

\[f_{i,i}=\max_{j<i}(f_{i-1,j})
\]

也就是枚举前 \(i-1\) 个数中上一个 \(1\) 放在哪个位置,对所有可能的情况取 \(\max\)。

考虑一般情况:

从 \(i-1\) 转移到 \(i\),新的贡献只从所有右端点为 \(i\) 的区间产生,考虑到产生贡献的条件是至少包含一个 \(1\),而最后的 \(1\) 位于 \(j\),故只有这个区间包含 \(j\) 的时候才会产生贡献,故有状态转移方程:

\[f_{i,j}=f_{i-1,j}+\sum_{k=1}^m[l_k\le j][r_k=i]a_k
\]

直接转移的时间复杂度是 \(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 题解的更多相关文章

  1. 【LeetCode】Merge Intervals 题解 利用Comparator进行排序

    题目链接Merge Intervals /** * Definition for an interval. * public class Interval { * int start; * int e ...

  2. HDOJ1384 Intervals 题解

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1384 大意:有 \(n\) 个区间 \([a_i,b_i]\),每个区间有个权值 \(c_i\),找到 ...

  3. POJ1375:Intervals——题解

    http://poj.org/problem?id=1375 题目大意:有一盏灯,求每段被圆的投影所覆盖的区间. —————————————————————— 神题,卡精度,尝试用各种方法绕过精度都不 ...

  4. [Leetcode Week2]Merge Intervals

    Merge Intervals题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/merge-intervals/description/ Descript ...

  5. 算法与数据结构基础 - 排序(Sort)

    排序基础 排序方法分两大类,一类是比较排序,快速排序(Quick Sort).归并排序(Merge Sort).插入排序(Insertion Sort).选择排序(Selection Sort).希尔 ...

  6. 算法与数据结构基础 - 贪心(Greedy)

    贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...

  7. [LeetCode]题解(python):056-Merge Intervals

    题目来源 https://leetcode.com/problems/merge-intervals/ Given a collection of intervals, merge all overl ...

  8. 【题解】【区间】【二分查找】【Leetcode】Insert Interval & Merge Intervals

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  9. LeetCode 题解 56. Merge Intervals

    题目大意:给出一组区间,合并他们. 首先是排序,首先看start,start小的在前面.start相同的话,end小的在前面. 排序以后,要合并了. 我自己的笨方法,说实在的问题真的很多.提交了好几次 ...

  10. leetcode个人题解——#56 Merge Intervals

    思路,先按照结构体中start进行排序,然后遍历比较前后项是否有重合. 第一次用到三参数形式的sort(),第三个参数的bool函数要写到类外才通过. /** * Definition for an ...

随机推荐

  1. asp.net程序通过Microsoft Azure令牌授予流获取UserInfo终结点实现单点登录--隐式授予流(OIDC协议)

    1. Microsoft Azure令牌授予流 令牌授予流种类如下: 本章节采用: 隐式授予流: 2. 隐式授予流的实现 流程:重定向到authorize--->拿到access_token-- ...

  2. ABP - 本地事件总线

    1. 事件总线 在我们的一个应用中,经常会出现一个逻辑执行之后要跟随执行另一个逻辑的情况,例如一个用户创建了后续还需要发送邮件进行通知,或者需要初始化相应的权限等.面对这样的情况,我们当然可以顺序进行 ...

  3. AI-3线性回归

    3.1笔记 线性回归假设y与多个x之间的关系是线性的,且噪声符合正态分布. 线性模型则是对输入特征做仿射变换Y^ = W * X+b,其中Y^为预测值,我们希望预测值与真实值Y的误差最小.那如何衡量这 ...

  4. 详解共识算法的Raft算法模拟数

    摘要:Raft算法是一种分布式共识算法,用于解决分布式系统中的一致性问题. 本文分享自华为云社区<共识算法之Raft算法模拟数>,作者: TiAmoZhang . 01.Leader选举 ...

  5. Web网页音视频通话之基于Sipjs

    简述 本文是以FreeSwitch作为信令服务器,通过sipjs(基于webRtc) 进行媒体协商,网络协商后,进行P2P媒体传输. 参考知识: sip.js https://sipjs.com/ w ...

  6. 学习jQuery核心内容这一篇就够了

    jQuery 1. 介绍 jQuery是JavaScript的工具库,对原生JavaScript中的DOM操作.事件处理.数据处理等进行封装,提供更便捷的方法. 让我们用更少的代码完成我们的js操作 ...

  7. 图像处理_ISP_坏点矫正

    1 坏点介绍 图像坏点(Bad pixel) : 图像传感器上光线采集点(像素点)所形成的阵列存在工艺上的缺陷,或光信号进行转化为电信号的过程中出现错误,从而会造成图像上像素信息错误,导致图像中的像素 ...

  8. 用 perfcollect 洞察 Linux 上.NET程序 CPU爆高

    一:背景 1. 讲故事 如果要分析 Linux上的 .NET程序 CPU 爆高,按以往的个性我肯定是抓个 dump 下来做事后分析,这种分析模式虽然不重但也不轻,还需要一定的底层知识,那有没有傻瓜式的 ...

  9. 数据标注工具 Label-Studio

    文档抽取任务Label Studio使用指南 目录 1. 安装 2. 文档抽取任务标注 2.1 项目创建 2.2 数据上传 2.3 标签构建 2.4 任务标注 2.5 数据导出 2.6 数据转换 2. ...

  10. PaddleSharp:跨越一年的版本更新与亮点

    PaddleSharp:跨越一年的版本更新与亮点 我始终坚信,开源社区是技术进步的重要推动力,也是我抽出我业余时间,投入到PaddleSharp这个项目的原因,这个项目充分展现了.NET在复杂计算领域 ...