description

loj 3212

solution

首先容易想到\(n^3\)DP,即令\(f_{i,j}\)表示前\(i\)个数的划分,其中最后一段是从\(j\)开始时的答案

于是有

\[f_{i,j}=max(f_{j-1,k}+(s_i-s_{j-1})^2)
\]

其中\(s_i\)是前缀和,且\(k<j,s_i-s_{j-1} \ge s_{j-1}-s{k}\)

考虑优化,可以发现对于同一个\(i\)的\(j_1<j_2\),不满足\(j_1\)条件的\(k\)也不会满足\(j_2\)的条件,所有当\(j\)增加时,对应的\(k\)也会单调递增,所以就可以\(O(n^2)\)做了

通过仔细观察(?)/打表,你会发现总存在\(f_{i,j} \ge f_{i,j-1}\)(在\(j\)与\(j-1\)均合法的情况下),于是我们可以得到一个结论——在合法的情况下,让最后一段尽量小一定更优

那么怎么证明呢?

考虑最后两段的的情况如图所示:



此时,后2段的答案就是\(A=(s_{K-1}-s_{L-1})^2+(s_R-s_{K-1})^2\)(图中的2段为\([L,K-1]\)与\([K,R]\))

如果将最后一段长度变小,将原来的2段变为\([L,K]与[K+1,R]\)(满足此时依然合法)

则答案变为\(B=(s_K-s_{L-1})^2+(s_R]-s_K)^2\)

由于

\[A=s_R^2+2*s_{K-1}^2+s_{L-1}^2-2*s_{K-1}*(s_{L-1}+s_R)
\]
\[B=s[R]^2+2*s[K]^2+s[L-1]^2-2*s[K]*(s[L-1]+s[R])
\]

于是

\[B-A=2*(s[K]^2-s[K-1]^2-(s[L-1]+s[R])*(s[K]-s[K-1]))
\]
\[=2*(s[K]-s[K-1])*(s[K]+s[K-1]-s[L-1]-s[R])
\]

因为当前情况下合法,故

\[s[R]-s[K] \ge s[K]-s[L-1
\]

于是

\[s[R]+s[L-1] \ge 2*s[K] \ge s[K]+s[K-1]
\]

于是\(B-A<0\),故\(B<A\),后者比前者更优,得证

那么就可以上单调队列,维护最后一段的长度单调递增的一些数,因为前缀和单调递增,所以可以在\(l+1\)满足条件时将\(l\)弹掉,时间复杂度\(O(n)\)

懒得写高精,直接上__int128。

code

#include<bits/stdc++.h>
using namespace std;
const int N=4e7+10;
const int M=1e5+10;
typedef long long ll;
const ll mod=1<<30;
int n,type,q[N],l=1,r,p[M],L[M],R[M],x,y,z,m,pre[N];
ll s[N],b[N];
__int128 ans;
void write(__int128 x){
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
int main(){
freopen("partition.in","r",stdin);
freopen("partition.out","w",stdout);
n=read();type=read();
if(type==1){
x=read(),y=read(),z=read();b[1]=read();b[2]=read();m=read();
for(int i=1;i<=m;i++) p[i]=read(),L[i]=read(),R[i]=read();
for(int i=3;i<=n;i++)b[i]=(x*b[i-1]+y*b[i-2]+z)%mod;
int j=1;
for(int i=1;i<=n;i++){
if(i>p[j]) ++j;
s[i]=s[i-1]+(b[i]%(R[j]-L[j]+1))+L[j];
}
}
else for(int i=1;i<=n;++i) s[i]=read()+s[i-1];
for(int i=1;i<=n;++i){
while(l<=r&&s[q[l]]-s[pre[q[l]]]<=s[i]-s[q[l]]) ++l;
--l;pre[i]=q[l];
while(l<=r&&s[q[r]]-s[pre[q[r]]]+s[q[r]]>=s[i]-s[pre[i]]+s[i]) --r;
q[++r]=i;
}
int now=n;while(now) ans+=((__int128)s[now]-s[pre[now]])*(s[now]-s[pre[now]]),now=pre[now];
write(ans);
return 0;
}

「CSP-S 2019」划分的更多相关文章

  1. LOJ#6713. 「EC Final 2019」狄利克雷 k 次根 加强版

    题目描述 定义两个函数 \(f, g: \{1, 2, \dots, n\} \rightarrow \mathbb Z\) 的狄利克雷卷积 \(f * g\) 为: \[ (f * g)(n) = ...

  2. 「LOJ 3153」 「JOI Open 2019」三级跳

    题面 LOJ 3153 solution 对于任意一对\(A,B\),若区间\([A,B]\)中存在一个数权值大于\(A\)或\(B\),则用这个数来替代\(A\)或\(B\)显然更优. 故只需要考虑 ...

  3. #3146. 「APIO 2019」路灯

    #3146. 「APIO 2019」路灯 题目描述 一辆自动驾驶的出租车正在 Innopolis 的街道上行驶.该街道上有 \(n + 1\) 个停车站点,它们将街道划分成了 \(n\) 条路段.每一 ...

  4. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  5. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  6. 「WC 2019」数树

    「WC 2019」数树 一道涨姿势的EGF好题,官方题解我并没有完全看懂,尝试用指数型生成函数和组合意义的角度推了一波.考场上只得了 44 分也暴露了我在数数的一些基本套路上的不足,后面的 \(\ex ...

  7. 「长乐集训 2017 Day10」划分序列 (二分 dp)

    「长乐集训 2017 Day10」划分序列 题目描述 给定一个长度为 n nn 的序列 Ai A_iA​i​​,现在要求把这个序列分成恰好 K KK 段,(每一段是一个连续子序列,且每个元素恰好属于一 ...

  8. LOJ#3054. 「HNOI 2019」鱼

    LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...

  9. LOJ #3049. 「十二省联考 2019」字符串问题

    LOJ #3049. 「十二省联考 2019」字符串问题 https://loj.ac/problem/3049 题意:给你\(na\)个\(A\)类串,\(nb\)个\(B\)类串,\(m\)组支配 ...

随机推荐

  1. nio DirectByteBuffer如何回收堆外内存

    概述 使用了nio框架的应用,比如服务框架,利用nio建立长连接通信,他们会使用DirectByteBuffer来分配堆外内存,也就是本地直接内存,这个内存的回收不由gc直接维护,我们通常所说的gc, ...

  2. Spring Boot学习笔记(二)——HelloWorld实现

    提示:要在Eclipse里使用Spring Boot,首先要安装STS插件,前面我们已经安装了STS插件了,可以创建Spring Boot项目了. 1.创建项目: 新建项目,选择Spring Boot ...

  3. 什么是SOAP?SOAP有什么用?什么时候会用到SOAP?

    什么是SOAP SOAP(Simple Object Access Protocol)一般指简单对象访问协议,简单对象访问协议是交换数据的一种协议规范,是一种轻量的.简单的.基于XML(标准通用标记语 ...

  4. 使用微创联合M5S空气检测仪、树莓派3b+、prometheus、grafana实现空气质量持续监控告警WEB可视化

    1.简介 使用微创联合M5S空气检测仪.树莓派3b+.prometheus.grafana实现空气质量持续监控告警WEB可视化 grafana dashboard效果: 2.背景 2.1 需求: 1. ...

  5. ASP.NET Core Authentication系列(二)实现认证、登录和注销

    前言 在上一篇文章介绍ASP.NET Core Authentication的三个重要概念,分别是Claim, ClaimsIdentity, ClaimsPrincipal,以及claims-bas ...

  6. 自定义控件-只有横线的文本输入框(TxtLine)

    需求:在实际开发中,由于TextBox控件的背景色样式不美观,且TextBox不能直接设置背景颜色,因此需要使用自定义控件以实现如下效果 实现代码 public partial class TxtLi ...

  7. 我叫Mongo,收了「查询基础篇」,值得你拥有

    这是mongo第二篇「查询基础篇」,后续会连续更新6篇 mongodb的文章总结上会有一系列的文章,顺序是先学会怎么用,在学会怎么用好,戒急戒躁,循序渐进,跟着我一起来探索交流. 通过上一篇基础篇的介 ...

  8. JVM常用调优工具介绍

    前言 王子在之前的JVM文章中已经大体上把一些原理性问题说清楚了,今天主要是介绍一些实际进行JVM调优工作的工具和命令,不会深入讲解,因为网上资料很多,篇幅可能不长,但都是实用的内容,小伙伴们有不清楚 ...

  9. js常用的遍历方法以及flter,map方法

    1.首先明确vue主要操作数据.他并不提倡操作dom. 数组的变异:能改变原数组. *** 先来复习下便利==遍历一个数组的四种方法: <script> let arr = [1, 2, ...

  10. 【线上问题排查技巧】动态修改LOGGER日志级别

    前言 大多数情况下,我们会在打印日志时定义日志的LOGGER级别,用来控制输出的信息范围. 一方面,过多的输出会影响查看日志的效率,另一方面,过少的日志让问题定位变得困难. 但当线上出现问题时,线上容 ...