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]划分 题解的更多相关文章

  1. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  2. LOJ P10018 数的划分 题解

    每日一题 day52 打卡 Analysis 这道题直接搜索会TLE到**,但我们发现有很多没有用的状态可以删去,比如 1,1,5; 1,5,1; 5,1,1; 所以很容易想到一个优化:按不下降的顺序 ...

  3. LOJ P10149 凸多边形的划分 题解

    Analysis 区间dp+压位高精 dp五分钟,高精两小时 #include<iostream> #include<cstdio> #include<cstring&g ...

  4. 题解 洛谷 P4047 【[JSOI2010]部落划分】

    我觉得几乎就是一道最小生成树模板啊... 题解里许多大佬都说选第n-k+1条边,可我觉得要这么讲比较容易理解 (虚边为能选的边,实边为最小生成树) 令n=5,k=2,(1,3)<(1,2)< ...

  5. 【题解】整数划分 [51nod1201] 整数划分 V2 [51nod1259]

    [题解]整数划分 [51nod1201] 整数划分 V2 [51nod1259] 传送门:整数划分 \([51nod1201]\) 整数划分 \(V2\) \([51nod1259]\)** [题目描 ...

  6. CF1238E.Keyboard Purchase 题解 状压/子集划分DP

    作者:zifeiy 标签:状压DP,子集划分DP 题目链接:https://codeforces.com/contest/1238/problem/E 题目大意: 给你一个长度为 \(n(n \le ...

  7. <题解>「LibreOJ NOIP Round #1」序列划分

    solutions 题面loj#542 对我来说,这或许已经超出了我的能力,我,只能看题解 不知道我写完这一篇题解之后,会不会对我的构造题有一点点的帮助 让我在这类题的解决上能过有一些提升 直接说明白 ...

  8. 洛谷 题解 P1025 【数的划分】

    将n个小球放到k个盒子中的情况总数 = (a)至少有一个盒子只有一个小球的情况数 + (b)没有一个盒子只有一个小球的情况数 这样写出表达式: a.因为盒子不加区分,那么=情况数与"将n-1 ...

  9. 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解

    前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...

随机推荐

  1. PDOStatement::getAttribute

    PDOStatement::getAttribute — 检索一个语句属性(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)高佣联盟 www.cgewang.com 说 ...

  2. luogu P4206 [NOI2005]聪聪与可可 期望dp 记忆化搜索

    LINK:聪聪与可可 这道题的核心是 想到如何统计答案. 如果设f[i][j]表示第i个时刻... 可以发现还需要统计位置信息 以及上一次到底被抓到没有的东西 不太好做. 两者的位置都在变化 所以需要 ...

  3. react-ts模板2.0

    最新整理的react模板2.0 - react 16.12.0 - react-router - redux,redux-thunk - hooks,typescript - antd v4,sass ...

  4. 001_go语言中的hello world

    代码演示: package main import "fmt" func main() { fmt.Println("hello world") } 代码解读: ...

  5. 重温这几个屌爆的Python技巧!

    我已经使用Python编程有多年了,即使今天我仍然惊奇于这种语言所能让代码表现出的整洁和对DRY编程原则的适用.这些年来的经历让我学到了很多的小技巧和知识,大多数是通过阅读很流行的开源软件,如Djan ...

  6. Python面向对象,站在更高的角度来思考

    开篇 面向过程编程和面向对象编程是两种基本的编程思想. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去 ...

  7. SQL Server中的集合运算: UNION, EXCEPT和INTERSECT

    SQL Server中的集合运算包括UNION(合并),EXCEPT(差集)和INTERSECT(相交)三种. 集合运算的基本使用 1.UNION(合并两个查询结果集,隐式DINSTINCT,删除重复 ...

  8. 图数据库HugeGraph源码解读 (1) —— 入门介绍

    HugeGraph介绍 以下引自官方文档: HugeGraph是一款易用.高效.通用的开源图数据库系统(Graph Database,GitHub项目地址), 实现了Apache TinkerPop3 ...

  9. 2020-08-02:输入ping IP 后敲回车,发包前会发生什么?

    福哥答案2020-08-02: 首先根据目的IP和路由表决定走哪个网卡,再根据网卡的子网掩码地址判断目的IP是否在子网内.如果不在则会通过arp缓存查询IP的网卡地址,不存在的话会通过广播询问目的IP ...

  10. Ubuntu无法安装 英伟达显卡

    安装Ubuntu无法正常驱动英伟达,这时需要在启动参数中添加nomodset 如果不会添加参数可以参考这篇文章:安装ubuntu时黑屏三种解决办法