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. 龙芯电脑编译redis (loongarch)

    1.获取源码 源码地址:https://redis.io/download/#redis-downloads 最新版本是7.2,这里用redis5测试,最后一个版本是5.0.14 wget https ...

  2. zynq7000 emc启动及其加速

    背景需求 ZYNQ 7000系统在出场时需要将固件从eMMC启动,原因有2: FLASH存储空间小: SD卡容易脱落,不适合产品存放系统文件: 需要注意,ZYNQ7000 系列不支持eMMC作为BOO ...

  3. subprocess Python执行系统命令最优选模块

    简介 subprocess 是 Python 中执行操作系统级别的命令的模块,所谓系级级别的命令就是如ls /etc/user ifconfig 等和操作系统有关的命令. subprocess 创建子 ...

  4. 写一段python下载商品图片的代码

    以下是一个简单的Python代码示例,用于下载商品图片: import requests import os def download_image(url, save_path): response ...

  5. 常见的 NoSQL 数据库有哪些?

    前言 今天我们来介绍一下工作开发中常见的一些NoSQL数据库及其基本特点.欢迎在评论区留下文章中没有介绍且好用的​NOSQL数据库. 什么是NOSQL数据库 非关系型数据库又被称为 NoSQL(Not ...

  6. centos7安装weblogic

    前言 简介:weblogic是java应用服务器软件的一种,类似于tomcat,但功能更多,适用于大型应用场景. 版本: 系统:centos 7(最小化安装,无图形化界面) jdk: oraclejd ...

  7. SQL 注入学习手册【笔记】

    SQL 注入基础 [若本文有问题请指正] 有回显 回显正常 基本步骤 1. 判断注入类型 数字型 or 字符型 数字型[示例]:?id=1 字符型[示例]:?id=1' 这也是在尝试闭合原来的 sql ...

  8. c# .NET 高级编程 高并发必备技巧 - 锁

    锁 最为常见的应用就是 高并发的情况下,库存的控制.本次只做简单的单机锁介绍. 直接看代码: 每请求一次库存-1. 假如库存1000,在1000个人请求之后,库存将变为0. public int Re ...

  9. [Python3] 初识py, 一个简单练手的小玩意. 快递查询

    有图有真相 脚本代码 最近刚入门py, 准备写点小玩意练练手. 于是决定拿快递100开刀. 因为它的api很简单. # 快递100 API # 作者: 剑齿虎 # 邮箱: yuxiaobo64@gma ...

  10. Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法

    Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法 点击封面跳转下载页面 简介 Unity 性能优化Shader分析处理函数:Sha ...