题目描述

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. vue3探索——组件通信之依赖注入

    背景 通常情况下,当我们需要从父组件向子组件传递数据时,会使用 props.想象一下这样的结构:有一些多层级嵌套的组件,形成了一颗巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据.在 ...

  2. Go之流程控制大全: 细节、示例与最佳实践

    本文深入探讨Go语言中的流程控制语法,包括基本的if-else条件分支.for循环.switch-case多条件分支,以及与特定数据类型相关的流程控制,如for-range循环和type-switch ...

  3. Python爬虫——爬虫时如何知道是否代理ip伪装成功?

    在进行爬虫时,我们可能需要使用代理IP来伪装自己的身份,以避免被网站封禁.如何判断代理IP是否伪装成功呢?本篇文章将围绕这个问题展开讲解,同时提供Python代码示例. 1. 确认代理IP地址 首先, ...

  4. npm install xxx 后加上-s、-d、-g之间的区别?

    1.npm install xxx -s npm install xxx -s.npm install xxx -S是npm install xxx --save的简写形式 局部安装,记录在packa ...

  5. Redis系列之——Redis介绍安装配置

    文章目录 第一章 redis初识 1.1 Redis是什么 1.2 Redis特性(8个) 1.3 Redis单机安装 1.3.1下载安装 1.3.2三种启动方式 1.3.2.1 最简启动 1.3.2 ...

  6. 【信创】 JED on 鲲鹏(ARM) 调优步骤与成果

    项目背景 基于国家对信创项目的大力推进,为了自主可控的技术发展,基础组件将逐步由国产组件替代,因此从数据库入手,将弹性库JED部署在 国产华为鲲鹏机器上(基于ARM架构)进行调优,与Intel (X8 ...

  7. [SWPUCTF 2021 新生赛]老鼠走迷宫(详细版

    附件下载 https://wwvc.lanzouj.com/iYLez1br84jg 解题思路 用pyinstxtrator解析exe 重点:将无后缀的5先修改后缀为pyc,然后随便找一个pyc文件补 ...

  8. 【v2v迁移】Xen2kvm 迁移-linux篇

    迁移环境: 源平台:华为FusionComputeV100R006C10SPC101 目标平台:基于KVM虚拟化的云平台,本文以原生的libvirt为例 虚拟机:centos 7.6 具体操作步骤: ...

  9. Backgrounds

    有人私信要背景图,所以一起放出来了qwq 感觉这个博皮的动效选深色并且带点漂浮感的背景会比较好看(? 选图基本按这个标准选的,实际上比较亮的几张图已经被我手动拉低亮度了.(不过还是不太行/kk 备注里 ...

  10. DFS深搜小谈

    前几天有人跟我说,啊,说dfs一搜搜着搜着就把自己搜蒙了,说一写dfs就要dfs(int a,int b,int c),括号里面放一堆东西.啊今天我要澄清一下,dfs其实没有你想的那么复杂. dfs这 ...