AT_joisc2019_j 题解
先考虑这个式子:
\]
一定是在 \(C\) 有序时取到,具体证明很简单各位读者自己证明。
那么现在式子变成:
\]
这个时候一个常见的技巧是将 \(C\) 排序。
这个时候就可以定义状态:
\]
然后从贪心的思想出发,\(V\) 一定是选取区间 \([i,j]\) 中最大的 \(M\) 个。
令 \(f(i,j)\) 表示区间 \([i,j]\) 中前 \(M\) 大之和,有:
\]
考虑去掉一维状态:
\]
因为 \(f(i,j) + 2 \times C_{j}\) 满足四边形不等式,所以 \(dp_{i}\) 满足决策单调性,考虑分治优化,\(f(i,j)\) 可以直接用主席树求解。
那么我们就 \(O(n \log^2 n)\) 地做完了。
#include<bits/stdc++.h>
#define int long long
using namespace std;
//dp[l][r] 表示区间 [l,r] 内前 M 大
//求 max(dp[l][r])
//max_{r>l}(dp[l][r])
//设计状态 dp[i] 表示区间 [i,j] 前 M 大之和减去 2*(c[j]-c[i])
//dp[i]=max{f(i,j)-2*c[j]}+2*c[i]
const int maxn = 2e5+114;
const int top = 1e9+114;
const int inf = 2e18+114514;
int dp[maxn];
int n,m;
struct Node{
int sum,ls,rs;
int val;
}tr[maxn*35];
struct hhx{
int c,v;
}a[maxn];
int root[maxn],tot;
inline int kth(int lt,int rt,int L,int R,int k){
if(lt==rt){
return k*lt;
}
int mid=(lt+rt)>>1;
if((tr[tr[R].rs].sum-tr[tr[L].rs].sum)>=k){
return kth(mid+1,rt,tr[L].rs,tr[R].rs,k);
}
else{
return (tr[tr[R].rs].val-tr[tr[L].rs].val)+kth(lt,mid,tr[L].ls,tr[R].ls,k-(tr[tr[R].rs].sum-tr[tr[L].rs].sum));
}
}
inline void add(int cur,int lst,int lt,int rt,int pos){
tr[cur].sum=tr[lst].sum+1;
tr[cur].val=tr[lst].val+pos;
if(lt==rt){
return ;
}
int mid=(lt+rt)>>1;
if(pos<=mid){
tr[cur].rs=tr[lst].rs;
tr[cur].ls=++tot;
add(tr[cur].ls,tr[lst].ls,lt,mid,pos);
}
else{
tr[cur].ls=tr[lst].ls;
tr[cur].rs=++tot;
add(tr[cur].rs,tr[lst].rs,mid+1,rt,pos);
}
}
//前 k 大之和
void solve(int l,int r,int L,int R){
if(l>r) return ;
int mid=(l+r)>>1;
int mx=-inf,p=0;
for(int i=max(mid+m-1,L);i<=R;i++){
if(kth(1,top,root[mid-1],root[i],m)-2*a[i].c>mx){
mx=kth(1,top,root[mid-1],root[i],m)-2*a[i].c;
p=i;
}
}
dp[mid]=mx+2*a[mid].c;
solve(l,mid-1,L,p);
solve(mid+1,r,p,R);
}
bool cmp(hhx A,hhx B){
return A.c<B.c;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) dp[i]=-inf;
for(int i=1;i<=n;i++) cin>>a[i].v>>a[i].c;
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
root[i]=++tot;
add(root[i],root[i-1],1,top,a[i].v);
}
solve(1,n-m+1,1,n);
int ans=-inf;
for(int i=1;i<=n;i++) ans=max(ans,dp[i]);
cout<<ans;
}
AT_joisc2019_j 题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- keepalived(3)- keepalived+nginx实现WEB负载均衡高可用集群
目录 1. keepalived+nginx实现WEB负载均衡高可用集群 1.1 需求和环境描述 1.2 WEB集群部署 1.3 负载均衡集群部署 1.4 keepalived部署 1.5 测试监控的 ...
- Android 开发中脚本 提高效率工具
在安卓开发中我们常常需要获取日志,通常我们可以通过adb logcat 命令获取日志.同样,我没有可以通过脚本获取.其实质也是通过adb命令实现,只是把命名写入bat文件中,在win系统中直接双击就可 ...
- Docker 必知必会2----跟我一步步来执行基本操作
通过前文(https://www.cnblogs.com/jilodream/p/18177695)的了解,我们已经大致明白了什么是docker,为什么要用docker,以及docker的基本设计思路 ...
- 处理flex布局
点击查看代码 <view class="recommend-view"> <view class="title-view"> 热门推荐 ...
- c语言编译系统工作原理
c语言编译系统内部的工作原理 程序生命周期概述 一个程序的生命周期可以被分成四个部分: 创建 编译 运行 退出 以一个简单的 helloworld.c 程序为例: #include<stdio. ...
- Mark Lee:Splashtop 如何成为最新的 10 亿美元估值技术独角兽
从左至右:Splashtop联合创始人Rob.Philip.Mark和Thomas Splashtop 刚刚完成了由我们的长期投资者 Sapphire Ventures 领投的 5000 万美元的新融 ...
- js与jquery实例-拖动改变列宽和行高
js与jquery实例-拖动改变列宽和行高 如何通过javascript或者jquery实现改变表格宽度或者行高的功能?今天就把这个功能代码分享给大家,绝对原创哦,代码少而且易懂.先看效果图: htm ...
- MyBatis数据源模块源码分析
数据源对象是比较复杂的对象,其创建过程相对比较复杂,对于 MyBatis 创建数据源,具体来讲有如下难点: MyBatis 不但要能集成第三方的数据源组件,自身也提供了数据源的实现: 数据源的初始化参 ...
- Leetcode-916. Word Subsets-(Medium)
一.问题描述 We are given two arrays A and B of words. Each word is a string of lowercase letters. Now, s ...
- 滴滴面试:谈谈你对Netty线程模型的理解?
Netty 线程模型是指 Netty 框架为了提供高性能.高并发的网络通信,而设计的管理和利用线程的策略和机制. Netty 线程模型被称为 Reactor(响应式)模型/模式,它是基于 NIO 多路 ...