description




analysis

  • 首先有一个结论,对于\([1,i]\)区间划分最后一段的和尽量小,答案会更优,具体证明参考毛爷爷的博客

  • 设\(f[i]\)为满足\([1,i]\)划分最优时、\((f[i],i]\)这段和最小时的最右的端点,最优划分即为从\(n\)开始向\(f\)不断统计

  • 由后一段比前一段大可知\(sum[f[i]]-sum[f[f[i]]]≤sum[i]-sum[f[i]]\),即\(sum[i]≥2sum[f[i]]-sum[f[f[i]]]\)

  • 右边只和\(f[i]\)有关,把右边的记为\(clac(f[i])\),于是可以维护一个\(clac\)值上升的单调队列来求出每一位的\(f\)

  • 具体维护就是,队头不断出队直到\(sum[i]<clac(q[head])\)(因为\(f[i]\)要尽可能大),\(f[i]\)赋为队头

  • 若\(clac(i)≤clac(q[tail])\)队尾再不断出队(因为\(clac(i)\)更小且\(i\)更靠右),最后\(i\)进队,就完成了队列的维护


code

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 40000005
#define ha 1073741824
#define ll long long
#define LL __int128
#define reg register int
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i) using namespace std; int p[100005],l[100005],r[100005];
int f[MAXN],q[MAXN];
ll b[MAXN],sum[MAXN];
int n,type; inline int read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline ll clac(ll x){return 2*sum[x]-sum[f[x]];}
inline void print(LL x)
{
int num[55];num[0]=0;
while (x)num[++num[0]]=x%10,x/=10;
while (num[0])printf("%d",num[num[0]--]);
printf("\n");
}
int main()
{
n=read(),type=read();
if (type)
{
int x=read(),y=read(),z=read();b[1]=read(),b[2]=read();int m=read(),now=1;
fo(i,1,m)p[i]=read(),l[i]=read(),r[i]=read();
fo(i,3,n)b[i]=(x*b[i-1]%ha+y*b[i-2]%ha+z)%ha;
fo(i,1,n)
{
if (i>p[now])++now;
sum[i]=sum[i-1]+(b[i]%(r[now]-l[now]+1))+l[now];
}
}
else {fo(i,1,n)sum[i]=sum[i-1]+read();}
int head=0,tail=0;
fo(i,1,n)
{
while (head<tail && sum[i]>=clac(q[head+1]))++head;
f[i]=q[head];
while (head<tail && clac(i)<=clac(q[tail]))--tail;
q[++tail]=i;
}
LL ans=0;
for (reg i=n;i;i=f[i])ans+=(LL)(sum[i]-sum[f[i]])*(sum[i]-sum[f[i]]);
print(ans);
return 0;
}

【JZOJ6434】【luoguP5665】【CSP-S2019】划分的更多相关文章

  1. CCF CSP 201612-2 工资计算

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201612-2 工资计算 问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所 ...

  2. 【CSP-S 2019】【洛谷P5665】划分【单调队列dp】

    前言 \(csp\)时发现自己做过类似这道题的题目 : P4954 [USACO09Open] Tower of Hay 干草塔 然后回忆了差不多\(15min\)才想出来... 然后就敲了\(88p ...

  3. xss之上传文件的xss,绕过csp,预警机制

    xss1.XSS姿势——文件上传XSS https://wooyun.x10sec.org/static/drops/tips-14915.html总结: 1.1.文件名方式,原理:有些文件名可能反应 ...

  4. [LeetCode] Partition List 划分链表

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  5. SWMM模型子汇水区划分的几种方法

    子汇水区的划分是SWMM模型建模的主要步骤之一,划分的好坏对结果精度有比较大的影响.概括来讲,子汇水区的划分有以下几种思路: (1)根据管网走向.建筑物和街道分布,直接人工划分子汇水区.这个方法适用于 ...

  6. 等价类划分方法的应用(jsp)

    [问题描述] 在三个文本框中输入字符串,要求均为1到6个英文字符或数字,按submit提交. [划分等价类] 条件1: 字符合法; 条件2: 输入1长度合法; 条件3: 输入2长度合法: 条件4: 输 ...

  7. Java上等价类划分测试的实现

    利用JavaFx实现对有效等价类和无效等价类的划分: 代码: import javafx.application.Application;import javafx.event.ActionEvent ...

  8. CSP的今世与未来

    一.从两个工具说起 最近Google又推出了两款有关CSP利用的小工具,其一为CSP Evaluator,这是一个能够评估你当前输入的CSP能否帮助你有效避免XSS攻击的工具,其用法非常简单,在输入框 ...

  9. ENode框架Conference案例分析系列之 - 上下文划分和领域建模

    前面一片文章,我介绍了Conference案例的核心业务,为了方便后面的分析,我这里再列一下: 业务描述 Conference是这样一个系统,它提供了一个在线创建会议以及预订会议座位的平台.这个系统的 ...

随机推荐

  1. InnoDB事务之redo log工作原理

    Reference:https://time.geekbang.org/column/article/121710 InnoDB是一个事务性的存储引擎,而InnoDB的事务实现是基于事务日志redo ...

  2. 监控服务(keepalived,httpd)

    #!/bin/bashpidof httpdif [ $? -eq 0 ];then echo "httpd is ok"else echo "httpd is not ...

  3. Git分支,合并,切换分支的使用

    1.创建合并分支 在我们每次的提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD指针严格来说不是指向提交 ...

  4. Axure 部件的交互样式

    选中的 时  需要设置事件

  5. switch 使用使用小技巧

    for (int i=0;i<100;i++) { switch (i) { case 1 ... 10: NSLog(@"case 1 ... 10: = %d",i); ...

  6. Redis入门很简单之四【初识Jedis】

    Redis入门很简单之四[初识Jedis] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存jedis  使用Jedis提供的Java API对Redis进行操作,是Red ...

  7. 栈Stack --- 数组实现

    栈最大的一个特点就是先进后出(FILO—First-In/Last-Out). /** * 栈:后进先出 * Created by fred on 2018/7/31. */ public class ...

  8. Python机器学习及分析工具:Scikit-learn篇

    https://www.jianshu.com/p/e0844e7cdba5 https://sklearn.apachecn.org/docs/0.21.3/62.html 中文文档

  9. 在dos中编译java文件

    首先Dos中 编译java文件是:javac (所有)类名.java 运行java文件是:java 包名.类名 java指令默认在寻找class文件的地址是通过CLASSPATH环境变量中指定的目录中 ...

  10. Linux基础-文件管理

    <1>查看文件信息:ls ls是英文单词list的简写,其功能为列出目录的内容,是用户最常用的命令之一,它类似于DOS下的dir命令. Linux文件或者目录名称最长可以有265个字符,“ ...