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 ...
随机推荐
- Linux下vim的常用命令总结
vim按d表示剪切 按dd剪切一行 vim命令:命令模式 /关键字 n继续向下查找 vim的多行注释: 1.按ctrl + v进入 visual block模式 2.按上下选中要注释的行 3.按大写字 ...
- 密码学—Kasiski测试法Python程序
Kasiski Kasiski是辅助破解Vigenere的前提工作,Kasiski是猜测加密者使用Vigenere密码体系的密钥的长度,Kasiski只是猜测长度而已,所以说是辅助破解Vigenere ...
- C数据结构:二叉树的基本操作
二叉树 树基本知识 二叉树的性质 满二叉树 完全二叉树 性质4.5的解释 顺序存储结构(利用性质4.5) 链式存储结构 结点结构体 建立二叉树 先序遍历 中序遍历 后序遍历 层次遍历 复制二叉树 计算 ...
- .NET中特性+反射 实现数据校验
.NET中特性+反射 实现数据校验 在.NET中,我们可以使用特性+反射来实现数据校验.特性是一种用于为程序中的代码添加元数据的机制.元数据是与程序中的代码相关联的数据,但不直接成为代码的一部分.通过 ...
- Must use PackageReference 解决办法
Must use PackageReference 这是因为 .net framework的项目 在nuget时,引用到了 .net core 下的包. 解决办法,把之前引用的相关包全部在nuget上 ...
- 详解 XSS 攻击原理
更多优质博文请关注:听到微笑的博客 跨站脚本攻击(Cross Site Scripting)本来的缩写为CSS,为了与层叠样式表(Cascading Style Sheets,CSS)的缩写进行区分, ...
- Uni-app极速入门(二) - 登录demo
需求 背景 1.进入小程序,默认页面判断用户是否已经登录,已经登录则进入首页,没有登录则进入登录页面 2.首页为tabbar,包括首页和设置页,设置页可以退出登录,回到登录页面 页面流转 graph ...
- 利用cycript动态调试app
一.准备 ios系统越狱环境 安装ssh 安装cycript 二.执行命令 找到进程注入: 6187 ?? 0:00.70 /var/containers/Bundle/Application/ 61 ...
- 阿里云入选Gartner「边缘分发平台市场指南」代表厂商
近日,全球技术研究与咨询机构Gartner首次发布边缘分发平台市场指南报告<Market Guide for Edge Distribution Platforms>,阿里云凭借内容分发网 ...
- HiveSQL 工作实战总结
记录一些工作中有意思的统计指标,做过一些简化方便大家阅读,记录如有错误,欢迎在评论区提问讨论~ 问题类型 连续问题 两种思路 第一种:日期减去一列数字得出日期相同,主要是通过row_number窗口函 ...