[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"; ...
随机推荐
- 半导体行业通信标准SECS/GEM协议一看就懂的
半导体行业通信标准SECS/GEM透析 HSMS通信的设备端通常为客户端(Equipment)(也可称为Active 在通信中主动连接对方的),工厂会部署服务端(Host)(也可称为Passive 被 ...
- 使用 Laf 一周内上线美术狮 AI 绘画小程序
"美术狮 AI 绘画"(以下简称"美术狮"),是我们小团队的一次尝试,定位是人人都可以上手的,充满创意的,理解中文和中国文化的图片生成工具. 在完善图像模型和论 ...
- 文盘Rust -- 生命周期问题引发的 static hashmap 锁
2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了.项目地址:https://github.com/jiashiwen/interactc ...
- Python隔离环境的搭建
在nodejs中,我们可以指定扩展安装的路径,那么在python中,我们是不是也可以这么做呢? 当然可以,我们只需要安装一个扩展virtualenv或者virtual wrapper就可以实现环境的隔 ...
- SQL select关联表查询 统计另一个表合计
db_order 是记录订单的, 一个订单一条记录.(oid, 运费, 实收金额, 产品KEY.......) db_soid 是记录出售商品的 (id, 商品名称, 售价, 数量, 成本, 标识 ...
- .NET C#基础(9):资源释放 - 需要介入的资源管理
1. 什么是IDisposable? IDisposable接口是一个用于约定可进行释放资源操作的接口,一个类实现该接口则意味着可以使用接口约定的方法Dispose来释放资源.其定义如下: pub ...
- ES13 中11个令人惊叹的 JavaScript 新特性
前言 与许多其他编程语言一样,JavaScript 也在不断发展.每年,该语言都会通过新功能变得更加强大,使开发人员能够编写更具表现力和简洁的代码. 小编今天就为大家介绍ES13中添加的最新功能,并查 ...
- 解读Redis常见命令
Redis数据结构介绍 Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样: 贴心小建议:命令不要死记,学会查询就好啦 Redis为了方便我们学习, ...
- 查看docker容器使用的cpu和内存
转载请注明出处: 使用docker ps命令列出正在运行的Docker容器,并获取目标容器的ID或名称. 使用docker stats <容器ID或名称>命令来实时监测指定容器的资源使用情 ...
- 痞子衡嵌入式:MCUBootUtility v5.3发布,利用XMCD轻松使能外部RAM
-- 痞子衡维护的 NXP-MCUBootUtility 工具距离上一个大版本(v5.0.0)发布过去4个多月了,期间痞子衡也做过三个小版本更新,但不足以单独介绍.这一次痞子衡为大家带来了全新重要版本 ...