题目描述

You are given $ n $ intervals and $ m $ points on the number line. The $ i $ -th intervals covers coordinates $ [l_i,r_i] $ and the $ i $ -th point is on coordinate $ i $ and has coefficient $ p_i $ .

Initially, all points are not activated. You should choose a subset of the $ m $ points to activate. For each of $ n $ interval, we define its cost as:

  • $ 0 $ , if there are no activated points in the interval;
  • the coefficient of the activated point with the largest coordinate within it, otherwise.

Your task is to maximize the sum of the costs of all intervals by choosing which points to activate.

$ 1 \le t \le 10^5,1 \le n \le 10^6, 1 \le m \le 10^6,1 \le l_i \le r_i \le m,0 \le p_i \le 10^9 $

\(\sum n,\sum m\le 10^6\)

一个非常显然的 dp,定义 \(dp_i\) 前 \(i\) 个数,选择了 \(i\) 的代价。那么枚举上一个数选在哪里,计算一下中间区间的贡献就行了。复杂度 \(O(n^2)\)

这个过程是可以用分块凸包维护,复杂度 \(O(n\sqrt n)\)

也可以用 KTT 维护,复杂度 \(O(log^3n)\)

然后讲官方做法。反过来,考虑一个 \(dp_i\) 对后面的 dp 的贡献。那么发现可以维护一个 \(h\),此时 \(dp_j=dp_i+h_jp_i\),同时要支持后缀加减 \(h\)。

考虑李超树,由于 \(h\) 单调不降,所以同时之前已经加入了李超树的线段不会改变。那么这些线段因为 \(h\) 改变了,线段也要改成 \(k(h+c)-b-k*c\),然后打标记下传就可以了。新增的线段直接按照 \(h\) 来加入。但是注意到要把所有跨过那个后缀的所有线段下传到两边,所以复杂度 \(O(nlog^2n)\)

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
typedef long long LL;
const LL INF=1e18;
int read()
{
char ch=getchar();
int s=0;
while(ch<'0'||ch>'9')
ch=getchar();
while(ch>='0'&&ch<='9')
s=s*10+ch-48,ch=getchar();
return s;
}
struct node{
int k;
LL b;
LL ask(int x)
{
return 1LL*k*x+b;
}
}tr[N<<2];
int tg[N<<2],hl[N<<2],hr[N<<2],c[N],l,r,n,m,p[N];
vector<int>g[N];
LL ans=0;
void merge(int o,int x)
{
int md=l+r>>1;
tg[o]+=x;
hl[o]+=x;
hr[o]+=x;
tr[o].b-=1LL*x*tr[o].k;
}
void pushdown(int o)
{
if(tg[o]&&(o<<1|1)<=4*m)
{
merge(o<<1,tg[o]);
merge(o<<1|1,tg[o]);
tg[o]=0;
}
}
void insert(int o,int l,int r,node x)
{
if(x.b<-1e17)
return;
pushdown(o);
int md=hl[o]==hr[o]? hl[o]:hr[o<<1];
if(x.ask(md)>tr[o].ask(md))
swap(tr[o],x);
if(x.ask(hl[o])>tr[o].ask(hl[o]))
insert(o<<1,l,md,x);
if(x.ask(hr[o])>tr[o].ask(hr[o]))
insert(o<<1|1,md+1,r,x);
}
void updtag(int o,int l,int r,int x,int y)
{
if(l>=x)
{
merge(o,y);
return;
}
int md=l+r>>1;
pushdown(o);
insert(o<<1,l,md,tr[o]);
insert(o<<1|1,md+1,r,tr[o]);
tr[o].k=0,tr[o].b=-INF;
if(md>=x)
updtag(o<<1,l,md,x,y);
updtag(o<<1|1,md+1,r,x,y);
hl[o]=hl[o<<1],hr[o]=hr[o<<1|1];
}
pair<int,LL> ask(int o,int l,int r,int x)
{
if(l==r)
return make_pair(hl[o],tr[o].ask(hl[o]));
pushdown(o);
int md=l+r>>1;
pair<int,LL>ret;
if(md>=x)
ret=ask(o<<1,l,md,x);
else
ret=ask(o<<1|1,md+1,r,x);
return make_pair(ret.first,max(ret.second,tr[o].ask(ret.first)));
}
int main()
{
int T=read();
while(T--)
{
n=read(),m=read();
p[++m]=0;
ans=0;
for(int i=1;i<=m;i++)
g[i].clear(),c[i]=0;
for(int i=1;i<=4*m;i++)
hl[i]=hr[i]=tg[i]=tr[i].k=0,tr[i].b=-INF;
for(int i=1;i<=n;i++)
{
l=read(),r=read();
g[l].push_back(r+1);
c[r+1]++;
}
for(int i=1;i<m;i++)
p[i]=read();
for(int i=1;i<=m;i++)
{
LL dp=max(0LL,ask(1,1,m,i).second);
for(int j=0;j<g[i].size();j++)
updtag(1,1,m,g[i][j],1);
updtag(1,1,m,i,-c[i]);
if(i==m)
printf("%lld\n",dp);
insert(1,1,m,(node){p[i],dp});
}
}
}

[CF1830F] The Third Grace的更多相关文章

  1. 微信小程序开发库grace vs wepy

    grace和wepy都是辅助小程序开发的开源库,本文对两者做个对比. 注:本文是作者本人的一些拙见,纯粹的技术讨论,不想引起技术信仰之争,欢迎积极.正向的讨论及建议. 如果你还不了解Grace, 请参 ...

  2. Style Lessons in Clarity and Grace (11th Edition)中文翻译

    Joseph, Williams. "Style: Lessons in Clarity and Grace." Pearson Schweiz Ag (2014). 下载地址:h ...

  3. Grace Huang 2017/1/12

    原文 Huang doesn't think of acting as pretending to be someone else.Rather,she considers it an opportu ...

  4. Grace Huang 2017/1/11

    原文 This actress becomes each character she plays Grace Huang has no interested in doing same thing y ...

  5. Grace Hopper

    葛丽丝·穆雷·霍普(英语:Grace Murray Hopper,1906年12月9日-1992年1月1日),本姓穆雷(Murray),霍普(Hopper)为夫姓,生于美国纽约州纽约市,美国海军准将及 ...

  6. Grace Hopper 葛丽丝 霍普

    Grace Murray Hopper(1906-1992), COBOL之母, Debug之母, A ship in port is safe, but that is not what ships ...

  7. ORACLE EXPIRED(GRACE)

    查询用户状态col username for a20col account_status for a20select username,account_status,LOCK_DATE,EXPIRY_ ...

  8. 编译器与Debug的传奇:Grace Murray Hopper小传

    摘要: 改变世界的程序员前辈. 来自:http://www.road2stat.com/cn/network_3c/grace_murray_hopper.html 这两天读<UNIX痛恨者手册 ...

  9. C#下IOC/依赖注入框架Grace介绍

    对依赖注入或控制反转不了解的童鞋请先自行学习一下这一设计,这里直接介绍项目和实现步骤. Grace是一个开源.轻巧.易用同时特性丰富.性能优秀的依赖注入容器框架.从这篇IOC容器评测文章找到的Grac ...

  10. Grace模式、Saint模式

    一.probe(后端探针) 探测后端,确定他们是否健康,返回的状态用req.backend.healthy核对 backend b1 { .host = "127.0.0.1"; ...

随机推荐

  1. CF1787E The Harmonization of XOR 题解

    CF1787E The Harmonization of XOR 题目大意 给定 \(n\) 个数 \([1, 2, 3, \cdots, n]\) 和两个正整数 \(k\) 和 \(x\). 将这些 ...

  2. Avalonia 实现聊天消息渲染、图文混排(支持Windows、Linux、信创国产OS)

       在实现即时通讯软件或聊天软件时,渲染文字表情.图文混排是一项非常繁琐的工作,再加上还要支持GIF动图.引用消息.撤回消息.名片等不同样式的消息渲染时,就更加麻烦了. 好在我们可以使用 ESFra ...

  3. 12 款最棒 Vue 开源 UI 库

    文章目录 Element Plus - 经典中的经典,全面支持 Vue 3 TDesign Vue - 鹅厂优质 UI 组件,配套工具完满,设计工整,文档清晰 ArcoDesign Vue- 字节优质 ...

  4. TIPTOP GP ERP二次开发规范说明

    TIPTOP GP ERP二次开发规范说明 TIPTOP ERP共分三大区:topstd(标准区) + toppord(正式区) + toptest(测试区) 标准区                  ...

  5. Nuxt.js 生成sitemap站点地图文件

    Nuxt.js 生成sitemap站点地图文件 背景介绍 ​ 使用nuxt框架生成静态文件支持SEO优化,打包之后需要生成一个 sitemap.xml 文件方便提交搜索引擎进行收录.官网有提供一个插件 ...

  6. 安装OpenStack的yum源

    # yum install https://buildlogs.centos.org/centos/7/cloud/x86_64/openstack-liberty/centos-release-op ...

  7. Lora升级!ReLoRa!最新论文 High-Rank Training Through Low-Rank Updates

    关注公众号TechLead,分享AI与云服务技术的全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专 ...

  8. 动态规划的状态设计 | bot 讲课の补题

    sto james1badcreeper orz. 好厉害的题,但是怎么有人补了三天才补完呢? CF1810G The Maximum Prefix 线性 dp,怎么有 bot 说题目难度在 *240 ...

  9. 探究-ping指令的使用

    简介: 背景:一直以来在项目上经常使用ping指令来测试网络通信,最近稍微研究了一下常用的指令,记录以作备忘.--MaQaQ 2023-11-1 ping (Packet Internet Grope ...

  10. [C++]vector的基本的用法

    [vector/容器/向量/动态数组]的基本的用法 容器的定义 向量/容器(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container). 跟任意其它类型容器一样,它能够存 ...