[CSP-S2019]划分 题解
CSP-S2 2019 D2T2
考场上读完题感觉是DP就直接扔了开T3了,考完才发现部分分好像不难拿,枯了
题意分析
给出一个数列,要求将其分成几段,使每段的和非严格递增,求最小的每段的和的平方和。
思路分析
可以发现,分成的段越多,即合并越少,答案越小;因此我们希望每段的和都尽量小。这提供了一个贪心的思想来解题。
以上只是合情推理,大家看着开心就好,不过看起来似乎没什么问题
设$f_i$表示数列$[a_1,a_i]$最后一段的和最小时最后一个断点(若需要整段合并,则为0)。这个$f_i$需要在使分段满足题目要求的单调性的前提下,尽量地大,也就是使最后一段的和尽量小,从而使每段的和都尽量小。因此,对于每个$i$,我们可以找到最大的合法的$f_i$。每次都遍历一遍暴力查找,复杂度$O(n^2)$,预计可以得到64分的高分。
查找时用数列前缀和来求段和,设$sum_i$表示$i$位置的前缀和。
通过分析或者手玩样例可以发现,$f_i$一定是单调不降的,并且判定合法的条件$sum_i-sum_j\geq sum_j-sum_{f_j}$,可以变形为$sum_i\geq sum_j+(sum_j-sum_{f_j})$,根据题意,$sum_j-sum_{f_j}$和$sum_j$都具有单调性。显然,这可以用单调队列来优化,复杂度$O(n)$。
据说,为了防止被看出可以直接推出分段然后求解答案,出题人放弃了取模而使用了高精。然而我太懒,本文的代码直接用int128实现。当然,考场上是用不了int128的,还是要熟练高精才行。
注意要尽量优化空间,不需要存储的信息可以不用存储,否则会导致正解MLE的惨状。
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define INT __int128
using namespace std;
const int N=4e7+100,P=1073741824;
int n,type,head=1,tail=1,x,y,z,m,p,l,r;
int f[N],q[N];
ll b1,b2,b3,w;
ll sum[N];
INT ans;
void in1()
{
scanf("%d%d%d%lld%lld%d",&x,&y,&z,&b1,&b2,&m);
int now=1;ll w;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&p,&l,&r);
while(now<=p)
{
if(now==1)
w=(b1%(r-l+1))+l,sum[1]=w;
else
if(now==2)
w=(b2%(r-l+1))+l,sum[2]=sum[1]+w;
else
{
b3=(x*b2+y*b1+z)%P;
w=(b3%(r-l+1))+l,sum[now]=sum[now-1]+w;
b1=b2,b2=b3;
}
now++;
}
}
}//特殊输入
void write(INT x)
{
if(x>9)
write(x/10);
putchar(x%10+'0');
}//int128不能直接输出
int main()
{
scanf("%d%d",&n,&type);
if(type)
in1();
else
for(int i=1;i<=n;i++)
scanf("%lld",&w),sum[i]=sum[i-1]+w;
for(int i=1;i<=n;i++)
{
while(head<tail && 2*sum[q[head+1]]-sum[f[q[head+1]]]<=sum[i])
head++;//找到最大的f[i]
f[i]=q[head];
while(head<tail && 2*sum[q[tail]]-sum[f[q[tail]]]>=2*sum[i]-sum[q[head]])
tail--;//维护单调性
q[++tail]=i;
}
int now=n;
while(now)
{
ans+=(INT)(sum[now]-sum[f[now]])*(sum[now]-sum[f[now]]);
now=f[now];
}//计算答案
write(ans);
return 0;
}
[CSP-S2019]划分 题解的更多相关文章
- 洛谷P4047 [JSOI2010]部落划分题解
洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...
- LOJ P10018 数的划分 题解
每日一题 day52 打卡 Analysis 这道题直接搜索会TLE到**,但我们发现有很多没有用的状态可以删去,比如 1,1,5; 1,5,1; 5,1,1; 所以很容易想到一个优化:按不下降的顺序 ...
- LOJ P10149 凸多边形的划分 题解
Analysis 区间dp+压位高精 dp五分钟,高精两小时 #include<iostream> #include<cstdio> #include<cstring&g ...
- 题解 洛谷 P4047 【[JSOI2010]部落划分】
我觉得几乎就是一道最小生成树模板啊... 题解里许多大佬都说选第n-k+1条边,可我觉得要这么讲比较容易理解 (虚边为能选的边,实边为最小生成树) 令n=5,k=2,(1,3)<(1,2)< ...
- 【题解】整数划分 [51nod1201] 整数划分 V2 [51nod1259]
[题解]整数划分 [51nod1201] 整数划分 V2 [51nod1259] 传送门:整数划分 \([51nod1201]\) 整数划分 \(V2\) \([51nod1259]\)** [题目描 ...
- CF1238E.Keyboard Purchase 题解 状压/子集划分DP
作者:zifeiy 标签:状压DP,子集划分DP 题目链接:https://codeforces.com/contest/1238/problem/E 题目大意: 给你一个长度为 \(n(n \le ...
- <题解>「LibreOJ NOIP Round #1」序列划分
solutions 题面loj#542 对我来说,这或许已经超出了我的能力,我,只能看题解 不知道我写完这一篇题解之后,会不会对我的构造题有一点点的帮助 让我在这类题的解决上能过有一些提升 直接说明白 ...
- 洛谷 题解 P1025 【数的划分】
将n个小球放到k个盒子中的情况总数 = (a)至少有一个盒子只有一个小球的情况数 + (b)没有一个盒子只有一个小球的情况数 这样写出表达式: a.因为盒子不加区分,那么=情况数与"将n-1 ...
- 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解
前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...
随机推荐
- python基础day6_字典dict
数据类型划分:可变数据类型.不可变数据类型 不可变数据类型(又叫可哈希):元祖,bool ,int,str, 可变数据类型(又叫不可哈希):list,dict,set(集合) dict的key必须是不 ...
- Hadoop学习之常用输入输出格式总结
目的 总结一下常用的输入输出格式. 输入格式 Hadoop可以处理很多不同种类的输入格式,从一般的文本文件到数据库. 开局一张UML类图,涵盖常用InputFormat类的继承关系与各自的重要方法(已 ...
- Spring学习总结(8)-接口多个实现类的动态调用
需求描述:当一个接口有2个以上的实现类时,调用方需要根据参数选择只其中一个实现类 Spring版本:5.1.8.RELEASE 1. 接口和实现类 /** * 接口 */ public interfa ...
- 在centos 上安装python
1.下载最新版本python源码包 下载地址为https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz 2.解压源码包 tar -zxf Pyt ...
- Redis服务之集群节点管理
上一篇博客主要聊了下redis cluster的部署配置,以及使用redis.trib.rb工具所需ruby环境的搭建.使用redis.trib.rb工具创建.查看集群相关信息等,回顾请参考https ...
- SpringBoot2 整合Ehcache组件,轻量级缓存管理
本文源码:GitHub·点这里 || GitEE·点这里 一.Ehcache缓存简介 1.基础简介 EhCache是一个纯Java的进程内缓存框架,具有快速.上手简单等特点,是Hibernate中默认 ...
- React的useEffect与useLayoutEffect执行机制剖析
引言 useEffect和useLayoutEffect是React官方推出的两个hooks,都是用来执行副作用的钩子函数,名字类似,功能相近,唯一不同的就是执行的时机有差异,今天这篇文章主要是从这两 ...
- Qt之先用了再说系列-定时器的用法
Qt 定时器是一个比好用的东西,在此就地简单记录一下使用的方式: 1.首先包含头文件 #include <QTimer> 2.具体用法有几种,我就写其中2种吧 1>执行一次 这种方式 ...
- C#LeetCode刷题-几何
几何篇 # 题名 刷题 通过率 难度 587 安装栅栏 21.5% 困难 892 三维形体的表面积 C#LeetCode刷题之#892-三维形体的表面积(Surface Area of 3D Sh ...
- 面试官:怎么做JDK8的垃圾收集器的调优?
面试官:怎么做JDK8的垃圾收集器的调优? 看着面试官真诚的眼神,心中暗想看起来年纪轻轻却提出如此直击灵魂的问题.擦了擦额头上汗,我稍微调整了一下紧张的情绪,对面试官说: 在JDK8中有Serial收 ...