题目描述
小 B 喜欢玩游戏。
有一天,小 B 在玩一个序列上的游戏,他得到了正整数序列{ai}以及一个常数c 。
游戏规则是,玩家可以对于每一个ai 分别加上一个非负整数x ,代价为 x2,完成所有操作之后,需要额外花费的代价就是所有相邻位置上数之差的绝对值总和再乘上c 。
小 B 觉得这个游戏很简单,想以最小的代价通过关卡,请你来帮助他求出总代价的最小值。
输入格式
第一行两个整数n,c
第二行 n个整数表示{ai}
输出格式
一行一个整数表示最小代价。
 
 

花了我一天多的时间......

先放代码:(注释应该比较详细了)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10,T=18;
int n,c,a[N],lg[N],ans;
#define fi first
#define se second
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
pair<int,int> st[N][T];
pair<int,int> get(int l,int r){
int p=lg[r-l+1];
return max(st[l][p],st[r-(1<<p)+1][p]);
}
struct node{
int x,h;//x是往上抬的步数总和、h是抬高到的高度
}; void ST(){//ST表求区间max
lg[1]=0;
for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
for(int j=1;j<=T-1;j++)
for(int i=1;i+(1<<j-1)<=n;i++)
st[i][j]=max(st[i][j-1],st[i+(1<<j-1)][j-1]);
} node solve(int l,int r,int k){
if(l>r) return (node){0,-1};
int id=get(l,r).se;
node L=solve(l,id-1,a[id]),R=solve(id+1,r,a[id]);
if(L.h!=-1&&L.h!=a[id]||R.h!=-1&&R.h!=a[id]) return (node){0,0};
//一边没有提上来,之后不需要提了(大佬:直接溜了)
int len=r-l+1,x=L.x+R.x,op=0,ll=0,rr=1e7;
if(l==1||r==n) op=1;//边界
else op=2;
while(ll<=rr){
int mid=(ll+rr)>>1;
if(2*x+len+2*len*mid>op*c) rr=mid-1;
else ll=mid+1;
}//二分寻找应该向上抬多少层
if(ll<1) return (node){x,a[id]};//抬不了
ll=min(ll,k-a[id]);//抬的高度不能超过k
ans+=(2*x+len+2*(x+(ll-1)*len)+len)*ll/2-op*c*ll;//等差数列求和
return (node){x+ll*len,a[id]+ll};
} signed main(){
n=read();c=read();
for(int i=1;i<=n;i++){
a[i]=read();
st[i][0]=make_pair(a[i],i);
ans+=c*(i!=1)*abs(a[i]-a[i-1]);//初始代价
}
ST();int k=get(1,n).fi;
solve(1,n,k);
cout<<ans<<endl;
return 0;
}
/*
4 3
2 1 2 3
*/

原数列将数值看做高度,相当于是一个连绵起伏,蜿蜒曲折的山脉(文笔真好),我们要找到波谷,对其尝试往上抬,抬的具体数值用二分来寻找。

大佬的草稿,用于解释solve()的步骤:(仰望大佬)

220722 T2 序列(ST表+分治)的更多相关文章

  1. 【BZOJ3784】树上的路径 点分治序+ST表

    [BZOJ3784]树上的路径 Description 给定一个N个结点的树,结点用正整数1..N编号.每条边有一个正整数权值.用d(a,b)表示从结点a到结点b路边上经过边的权值.其中要求a< ...

  2. CF1039E Summer Oenothera Exhibition 根号分治,LCT,ST表

    CF1039E Summer Oenothera Exhibition LG传送门 根号分治好题. 可以先看我的根号分治总结. 题意就是给出长度为\(n\)的区间和\(q\)组询问以及一个\(w\), ...

  3. [bzoj4540][Hnoi2016][序列] (莫队算法+单调栈+st表)

    Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,ar-1,ar.若1≤l≤s≤t≤r≤n,则称a ...

  4. CF1039E Summer Oenothera Exhibition 贪心、根号分治、倍增、ST表

    传送门 感谢这一篇博客的指导(Orzwxh) $PS$:默认数组下标为$1$到$N$ 首先很明显的贪心:每一次都选择尽可能长的区间 不妨设$d_i$表示在取当前$K$的情况下,左端点为$i$的所有满足 ...

  5. BZOJ4540 [Hnoi2016]序列 【莫队 + ST表 + 单调栈】

    题目 给定长度为n的序列:a1,a2,-,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,-,ar- 1,ar.若1≤l≤s≤t≤r≤n,则称a[s:t]是a[ ...

  6. [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)

    4540: [Hnoi2016]序列 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1567  Solved: 718[Submit][Status] ...

  7. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  8. [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)

    [51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...

  9. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

随机推荐

  1. Netty源码解读(三)-NioEventLoop

    先看看EventLoop类图 我们在Netty第二篇文章中的代码中,看到有多次用到eventLoop.execute()方法,这个方法就是EventLoop开启线程执行任务的关键,跟踪进去看看 // ...

  2. 修改 hosts

    不会牛逼操作 -1. 位置.格式 所有系统都差不多,都是 啥啥/etc/hosts 这样的 . 具体去查即可 . 格式: ip + 域名 域名不能含有通配符 hosts 可以绕过 dns 解析,直接访 ...

  3. Nmap 操作手册 - 完整版

    目录 Nmap - 基础篇 Nmap 安装 RedHat Windows Debina & Ubuntu Others Linux Nmap 参数(简单版) 目标说明 主机发现 扫描技术 端口 ...

  4. 【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法

    问题描述 在App Service for Windows的环境中,当前只提供了PHP 7.4 版本的选择情况下,如何实现自定义PHP Runtime的版本呢? 如 PHP Version 8.1.9 ...

  5. k8s-Pod基础

    制作镜像 第一个pod 搭建Harbor仓库 重启策略 启动命令 pod基本命令 设置环境变量 数据持久化和共享-hostPath 数据持久化和共享-emptyDir JSON格式编写pod文件 Co ...

  6. WAF对抗-安全狗(联合查询篇)

    WAF对抗-安全狗(联合查询篇) 实验环境 网站安全狗APACHE版V4.0.靶场:dvwa 为了方便对比可以在这个在线靶场申请一个dvwa https://www.vsplate.com/ mysq ...

  7. 【MySQL】从入门到掌握3-WorkBench

    上期:[MySQL]从入门到掌握2-下载安装 我们安装完MySQL Server的时候,是没有任何界面的. 不过很好,我们有一个工具,MySQL Workbench,他可以简化我们的操作,有点像Jav ...

  8. 实时降噪(Real-time Denoising):Spatio-Temporal Filtering

    目录 空间滤波(Spatial Filtering) 基于距离的高斯滤波 双边滤波(Bilateral filtering) 联合双边滤波(Joint Bilateral filtering)[201 ...

  9. KingbaseES批量数据加载的实践技巧

    有时,KingbaseES数据库需要在单个或最少的步骤中导入大量数据,这通常称为批量数据导入.其中数据源通常是一个或多个大文件,这个过程有时可能非常慢. 造成性能不佳的原因有很多:索引.触发器.外键. ...

  10. 安装docker及使用docker安装其他软件(手动挂载数据卷)

    中秋明月,豪门有,贫家也有,极慰人心 Linux安装docker 可以参考官方的安装文档 centos安装docker: https://docs.docker.com/engine/install/ ...