题目描述
小 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. 关于标准IO缓冲区的问题

    关于标准IO缓冲区的问题 按照标准IO缓冲区可以分为三类: 不缓存类型: 一旦有数据,直接将数据写入到文件 行缓冲类型: 同全缓冲类型 遇到\n时,将数据写入文件 全缓冲类型: 当程序结束,将数据冲洗 ...

  2. 奇技淫巧玄妙无穷| M1 mac os(苹果/AppleSilicon)系统的基本操作和设置

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_191 最近有个朋友跟我说,说他新入职了一家公司,公司还不错,给他配了一台Mac,但是呢他以前一直在Windows环境下开发,对Ma ...

  3. SQLServer的两个日期相减(间隔)datediff函数

    select datediff(year, 开始日期,结束日期); --两日期间隔年  select datediff(quarter, 开始日期,结束日期); --两日期间隔季  select da ...

  4. Java学习(二)Dos

    打开CMD方式 开始+系统+命令提示符 WIN键+R 输入cmd 在任意的文件夹下面,按住SHIFT键+鼠标右键,在此处打开命令行窗口 在资源管理器的地址栏前面加上cmd 路径 常用Dos命令 #盘符 ...

  5. placeholder 设置换行三种方式

    在 html 中编写代码时保留代码换行 <textarea name="" id="" cols="30" rows="10 ...

  6. 十分钟教会你如何使用VitePress搭建及部署个人博客站点

    使用VitePress可以让我们快速搭建一个静态博客网站,这篇文章将带领大家搭建一个基于VitePress的静态博客网站并且部署到GitHub Pages(github提供的静态网页服务) 快速上手 ...

  7. Vector3类定义

    大家一定要先看书,在看我的随笔啊.不然不知道原理的.而且我是不写教程的,只是写笔记怕自己忘记了. 我把所有的基础类放在了名叫geometry的文件中,包含Vector3, Normal3, Point ...

  8. 羽夏看Linux内核——引导启动(上)

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...

  9. Nginx 代理Vue项目出现Invalid Host header

    说明 使用 Nginx 的 upstream 对 Vue 项目做负载均衡时,代理的地址无法访问目标地址,且页面报错: Invalid Host header(无效主机头) 分析 检查 Nginx 的 ...

  10. java-Collection,List简单使用与方法/(集合使用-中)

    1.1集合只存放引用类型的元素并且集合存放的时元素的引用(地址)1.2新循环遍历集合 Collection c = new ArrayList(); c.add("one"); c ...