[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,我都没看出来,我竟然折磨菜. 考试的时候先 ...
随机推荐
- PHP zip_read() 函数
定义和用法 zip_read() 函数读取打开的 zip 档案中的下一个文件.高佣联盟 www.cgewang.com 如果成功,该函数则返回包含 zip 档案中一个文件的资源.如果没有更多的项目可供 ...
- 【NOI2001】方程的解数 题解(dfs+哈希)
题目描述 已知一个方程 k1*x1^p1+k2*x2^p2……+kn*xn^pn=0. 求解的个数.其中1<=x<=150,1<=p<=6; 答案在int范围内 输入格式 第一 ...
- FastAPI框架入门 基本使用, 模版渲染, form表单数据交互, 上传文件, 静态文件配置
安装 pip install fastapi[all] pip install unicorn 基本使用(不能同时支持,get, post方法等要分开写) from fastapi import Fa ...
- 关于Linux目录访问函数总结
Linux下目录访问函数总结,主要是涉及到的函数,以及所在头文件. 获得工作目录: #include <unistd.h> char *getcwd(char *buf,s ...
- java验证工具类(待验证)
/** * <判断对象是否为null或者空> * * @param obj * 需要判断的对象 * @return 如果对象为null或者空则返回true */ public static ...
- 教你看懂Docker和K8S!
转载于 https://my.oschina.net/jamesview/blog/2994112 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这家公司主要 ...
- 敏捷工具:Scrum板与Kanban如何抉择?敏捷工具:Scrum板与Kanban如何抉择?
Scrum板作为一种工具,主要应用于Scrum团队的敏捷项目管理,能够帮助团队更新任务进度,促进团队信息共享,及时发现任务过程中的异常现象,从而查漏补缺.团队在每日站会时会通过Scrum板来直观地展示 ...
- object detection 总结
1.基础 自己对于YOLOV1,2,3都比较熟悉. RCNN也比较熟悉.这个是自己目前掌握的基础2.第一步 看一下2019年的井喷的anchor free的网络3.第二步 看一下以往,引用多的网路4. ...
- 题解 洛谷P3469
题目每个割点去掉后会导致多少对点不能连通 考虑跑Tarjan的时候记录每个儿子的size,那么去掉这个割点后其他的点都不能和这个儿子连通 注意每个点去掉后它本身就不能与其他所有点连通 还有就是题目里求 ...
- unity探索者之支付宝支付,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8405044.html 支付宝的sdk接入方式和微信支付比较类似,大部分的工作也基本 ...