[CF1830F] The Third Grace
题目描述
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的更多相关文章
- 微信小程序开发库grace vs wepy
grace和wepy都是辅助小程序开发的开源库,本文对两者做个对比. 注:本文是作者本人的一些拙见,纯粹的技术讨论,不想引起技术信仰之争,欢迎积极.正向的讨论及建议. 如果你还不了解Grace, 请参 ...
- Style Lessons in Clarity and Grace (11th Edition)中文翻译
Joseph, Williams. "Style: Lessons in Clarity and Grace." Pearson Schweiz Ag (2014). 下载地址:h ...
- Grace Huang 2017/1/12
原文 Huang doesn't think of acting as pretending to be someone else.Rather,she considers it an opportu ...
- Grace Huang 2017/1/11
原文 This actress becomes each character she plays Grace Huang has no interested in doing same thing y ...
- Grace Hopper
葛丽丝·穆雷·霍普(英语:Grace Murray Hopper,1906年12月9日-1992年1月1日),本姓穆雷(Murray),霍普(Hopper)为夫姓,生于美国纽约州纽约市,美国海军准将及 ...
- Grace Hopper 葛丽丝 霍普
Grace Murray Hopper(1906-1992), COBOL之母, Debug之母, A ship in port is safe, but that is not what ships ...
- ORACLE EXPIRED(GRACE)
查询用户状态col username for a20col account_status for a20select username,account_status,LOCK_DATE,EXPIRY_ ...
- 编译器与Debug的传奇:Grace Murray Hopper小传
摘要: 改变世界的程序员前辈. 来自:http://www.road2stat.com/cn/network_3c/grace_murray_hopper.html 这两天读<UNIX痛恨者手册 ...
- C#下IOC/依赖注入框架Grace介绍
对依赖注入或控制反转不了解的童鞋请先自行学习一下这一设计,这里直接介绍项目和实现步骤. Grace是一个开源.轻巧.易用同时特性丰富.性能优秀的依赖注入容器框架.从这篇IOC容器评测文章找到的Grac ...
- Grace模式、Saint模式
一.probe(后端探针) 探测后端,确定他们是否健康,返回的状态用req.backend.healthy核对 backend b1 { .host = "127.0.0.1"; ...
随机推荐
- 使用C#创建安装Windows服务程序(最全教程)
开发语言:C# 开发环境: Visual Studio 2022 微软官方文档:https://learn.microsoft.com/zh-cn/dotnet/framework/windows-s ...
- 三维模型OBJ格式轻量化压缩主要技术方法浅析
三维模型OBJ格式轻量化压缩主要技术方法浅析 OBJ格式是一种常用的三维模型文件格式,它以文本形式保存了模型的顶点.纹理坐标和法线信息.为了实现轻量化压缩,可以采用以下主要技术方法: 1.简化网格 ...
- OpenStack-T版+Ceph
OpenStack OpenStack 中有哪些组件 keystone:授权 [授权后各个组件才可以进行相应的功能] Keystone 认证所有 OpenStack 服务并对其进行授权.同时,它也是所 ...
- JDK21来了!附重要更新说明
JDK21 计划23年9月19日正式发布,虽然一直以来都是"版本随便出,换 8 算我输",但这么多年这么多版本的折腾,如果说之前的 LTS版本JDK17你还觉得不香,那 JDK21 ...
- Spring Boot RestController接口如何输出到终端
背景 公司项目的批处理微服务,一般是在晚上固定时段通过定时任务执行,但为了预防执行失败,我们定义了对应的应急接口,必要时可以通过运维在终端中进行curl操作.然而,部分任务耗时较长,curl命令执行后 ...
- Oracle:查询表的统计信息,手动收集统计信息
在Oracle中,存在执行计划不准的情况,怀疑表的统计信息是否收集,需要以下操作:select table_name,num_rows,blocks,last_analyzed from user_t ...
- 其它——python操作kafka实践
文章目录 1.先看最简单的场景,生产者生产消息,消费者接收消息,下面是生产者的简单代码. ------------------------------------------------------- ...
- ERROR: Command errored out with exit status 1:
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting CairoSVG==2.4.2 Using cached ...
- 研发三维GIS系统笔记/实现wgs84投影-002
四叉树代码修改完善 原来的代码中,没有使用投影转换,直接使用的是世界坐标(单位是米), CELLQuadTree::CELLQuadTree( CELLTerrainInterface* pInter ...
- Java Exception最佳实践(转)
https://www.dubby.cn/detail.html?id=9033 1.异常介绍 2.Java中的异常介绍 3.自定义异常 4.几个建议 1)不要生吞异常 2)申明具体的异常 3)尽可能 ...