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. 18级北航软件学院算法复习--Samshui

    A 比特手链 简单模拟 判断 贪心 叶姐要想哥赠送一串比特手链,这个手链由0和1组成.想哥买了手链B,无意间得知叶姐想要同样长度的手链A.想哥囊中羞涩,只能手工调整手链.他希望最少通过以下操作进行最少 ...

  2. LruCache缓存bitmap(二)

    Lrucache缓存程序关闭缓存自动清除,所以要在onstart方法中调用,只要不关闭程序缓存就在,除以1024是以kb为单位 public class MainActivity extends Ap ...

  3. Phoenix创建索引源码过程

    date: 2020-09-27 13:50:00 updated: 2020-09-28 16:30:00 Phoenix创建索引源码过程 org.apache.phoenix.index.Inde ...

  4. Hadoop 指令

    date: 2018-04-30 09:07:56 updated: 2018-04-30 09:07:56 1.ls hadoop fs -ls / 列出hdfs文件系统根目录下的目录和文件 had ...

  5. RocketMQ4.7.1双主双从集群搭建

    导读 上一集我们已经学会了SpringBoot整合RocketMQ点我直达,今天我们来搭建双主双从高性能MQ服务集群. 简介 主从架构 Broker角色,Master提供读写,Slave只支持读,Co ...

  6. Luogu P6830 [IOI2020]Connecting Supertrees

    题意 好复杂,我就不写了. 题解 口胡了一下,发现我居然会 IOI 的题? 首先发现有 \(3\) 一定不合法,因为连通块里面有一个环的话 \(p_{i,j}\) 最多为 \(2\),有两个环的话就存 ...

  7. Luogu P5072 [Ynoi2015]盼君勿忘

    题意 给定一个长度为 \(n\) 的序列 \(a\) 和 \(m\) 次询问,第 \(i\) 次询问需要求出 \([l_i,r_i]\) 内所有子序列去重之后的和,对 \(p_i\) 取模. \(\t ...

  8. C++ stringstream 实现字符与数字之间的转换

    c++中利用srtingstream可以将数字转为字符串,或者将字符串转为数字: 首先将double型数字串转成了string: stringnum2string(double *a,int n) { ...

  9. 18 socket

    18 socket 推荐: http://www.360doc.com/content/11/0609/15/5482098_122692444.shtml Socket=Ip address+ TC ...

  10. brctl 增加桥接网卡

    前言 之前有一篇介绍配置桥接网卡的,这个桥接网卡一般是手动做虚拟化的时候会用到,通过修改网卡的配置文件的方式会改变环境的原有的配置,而很多情况,我只是简单的用一下,并且尽量不要把网络搞断了,万一有问题 ...