Solution -「CSP 2019」Partition
Description
Link.
给出一个数列,要求将其分成几段,使每段的和非严格递增,求最小的每段的和的平方和。
Solution
注意到 \(a_{i}\) 为正,对于正数有这样的结论:
\]
正确性显然。这告诉我们,分的段越多越好。
现在我们来考虑如何使每段的和非严格递增。
考虑暴力 DP,设 \(f_{i,j}\) 为前 \(i\) 个数然后上一个 breakpoint 是 \(j\) 的最小平方和,转移:
\]
\(pre\) 为前缀和。当然这个 DP 什么结论都没用,没有任何技术含量。
所以我们考虑优化。
你会发现这个 \(k\) 不是每次都要重头枚举,他是单调的,于是你维护 \(f_{j,k}\) 最小值即可,复杂度变成了 \(\mathcal{O}(n^{2})\)。
考虑上面的结论,你会发现我们只需要找打第一个可行的转移点 \(k\) 即可。
意味着我们可以维护一个 \(g_{i}\) 来表示:前 \(i\) 个数,我们最大的一个合法 \(k\)。这个东西肯定是单调不降的。
转移即:
\]
变形得:
\]
显然判定条件的右边有单调性(\(pre_{j}+(pre_{j}-pre_{g_{j}})\)),左边也有单调性。
然后单调队列优化即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef __int128 _LL;
int n,a[40000010],taskID,f[40000010],que[40000010],head,tail;
LL pre[40000010];
_LL ans;
template<typename T>
void read(T &hhh)
{
T x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^'0'),c=getchar();
if(~f) hhh=x;
else hhh=-x;
}
template<typename T>
void write(T x,char las='\n')
{
static int stk[100],top=0,f=0;
if(x<0) x=-x,f=1;
do stk[++top]=x%10,x/=10; while(x);
if(f) putchar('-');
while(top) putchar(stk[top--]^'0');
putchar(las);
}
void generateData(int taskID)
{
if(taskID) for(int i=1;i<=n;++i) read(a[i]);
else
{
static int p[100010],l[100010],r[100010],b[40000010];
LL x,y,z;
int m;
read(x),read(y),read(z),read(b[1]),read(b[2]),read(m);
const int MOD=(1<<30);
for(int i=1;i<=m;++i) read(p[i]),read(l[i]),read(r[i]);
for(int i=3;i<=n;++i) b[i]=(LL(x)*b[i-1]%MOD+LL(y)*b[i-2]%MOD+z)%MOD;
for(int j=1;j<=m;++j)
{
for(int i=p[j-1]+1;i<=p[j];++i) a[i]=(b[i]%(r[j]-l[j]+1))+l[j];
}
}
for(int i=1;i<=n;++i) pre[i]=pre[i-1]+a[i];
}
int main()
{
read(n),read(taskID);
generateData(taskID^1);
for(int i=1;i<=n;++i)
{
while(head<tail&&pre[i]>=(pre[que[head+1]]<<1)-pre[f[que[head+1]]]) ++head;
f[i]=que[head];
while(head<tail&&(pre[i]<<1)-pre[f[i]]<=(pre[que[tail]]<<1)-pre[f[que[tail]]]) --tail;
que[++tail]=i;
}
for(int i=n;i;i=f[i]) ans+=_LL(pre[i]-pre[f[i]])*(pre[i]-pre[f[i]]);
write(ans);
return 0;
}
Solution -「CSP 2019」Partition的更多相关文章
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
- Solution -「CCO 2019」「洛谷 P5532」Sirtet
\(\mathcal{Description}\) Link. 在一个 \(n\times m\) 的网格图中,每个格子上是空白 . 或沙子 #,四联通的沙子会连成一个整体.令此时所有沙子块同 ...
- Solution -「ZJOI 2019」「洛谷 P5326」开关
\(\mathcal{Description}\) Link. 有 \(n\) 个开关,初始时所有开关的状态为 \(0\).给定开关的目标状态 \(s_1,s_2,\cdots,s_n\).每 ...
- Solution -「JOISC 2019」「LOJ #3036」指定城市
\(\mathcal{Description}\) Link. 给定一棵含 \(n\) 个结点的树,双向边权不相同.\(q\) 次询问,每次询问在树上标记 \(e\) 个点,标记的价值为所有趋 ...
- Solution -「ROI 2019」「LOJ #3192」课桌
\(\mathcal{Description}\) Link. 原题意足够简洁啦.( \(\mathcal{Solution}\) 乍一看比较棘手,但可以从座位的安排方式入手,有结论: ...
- Solution -「HNOI 2019」「洛谷 P5293」白兔之舞
\(\mathcal{Description}\) Link. 不想概括题意.jpg \(\mathcal{Solution}\) 定义点集 \(S_c=\{(u,v)|v=c\}\):第 ...
- 「WC 2019」数树
「WC 2019」数树 一道涨姿势的EGF好题,官方题解我并没有完全看懂,尝试用指数型生成函数和组合意义的角度推了一波.考场上只得了 44 分也暴露了我在数数的一些基本套路上的不足,后面的 \(\ex ...
- LOJ#3054. 「HNOI 2019」鱼
LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...
- #3146. 「APIO 2019」路灯
#3146. 「APIO 2019」路灯 题目描述 一辆自动驾驶的出租车正在 Innopolis 的街道上行驶.该街道上有 \(n + 1\) 个停车站点,它们将街道划分成了 \(n\) 条路段.每一 ...
随机推荐
- python selenium自动化火狐浏览器开代理IP服务器
前言 Selenium是一款用于自动化测试Web应用程序的工具,它可以模拟用户在浏览器中的各种行为.而代理IP服务器则是一种可以帮助用户隐藏自己真实IP地址的服务器,使得用户可以在互联网上更加匿名地进 ...
- 解决github无法打开问题
在国内访问国外服务器(如github)会有卡顿.无法加载等问题,提供两种解决方案: 1.查看github的IP地址并修改Hosts windows键+R,打开cmd(或windows键+X,打开Win ...
- 这就是艺术,优雅的二维码生成器「GitHub 热点速览」
平时如果没有需要一般那团黑乎乎的二维码,估计路过的人看见第一眼就不会再看第二眼.但是假若,它是个帅哥靓妹,估计就不同了,更别提像是艺术画一样,将编码图案融入到画里的二维码生成器 qrbtf 作者的新作 ...
- 【城南】如何识别AI生成图?视觉AIGC伪造检测技术综述
如何识别 AI 生成图片?or 如何识别 AIGC 图?or 如何识别 AI 换脸?or AI生成图伪造检测? 类似的说法有很多种,总之就是利用AI技术来鉴别一张图是不是AI生成的,这种AI技术就是本 ...
- C++ Tips of the Week-01 string_view
1: string_view ref https://abseil.io/tips/1 函数参数需要是一个字符串的时候,通常的实现有以下几种: // C Convention void TakesCh ...
- Redis6 的安装
安装网址 Redis 官方网站 Redis 中文官方网站 http://redis.io http://redis.cn/ 安装版本 6.2.1 for Linux(redis-6.2.1 ...
- 数据库系统架构:从HBase到InfluxDB的变革
目录 数据库系统架构:从 HBase 到 InfluxDB 的变革 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境 ...
- .NET写一个自己的Lambda表达式与表达式树
LambdaExpression继承Expression Expression又继承LambdaExpressio 所以,Expression与 Expression的区别在于:泛型类以静态类型的方法 ...
- Linux reset子系统
文章代码分析基于linux-5.19.13,架构基于aarch64(ARM64). 1. 前言 复杂IC内部有很多具有独立功能的硬件模块,例如CPU cores.GPU cores.USB控制器.MM ...
- UE构建基础和实践:四、使用脚本打包
序言 使用UE版本为UE5.20 在实际项目中,我们常常使用自动化脚本来进行构建,它可以增加我们的生产效率,并降低人为操作带来的失误风险. BuildGraph BuildGraph UE官方提供的构 ...