题面

题解

CSP赛场上能请教别人吗

在这道题中,我看到了一个很敏感又很熟悉的东西——平方!

这意味着,可以推出一些结论,使这道题几乎可以边输入边解决。

自己在脑子里动态一下就知道,像这种总和一定、代价为平方的模式一眼就可以看出这个明显的结论:最大的段最小 !

(可惜笔者做到后来把它忘了)

于是,我们就可以把一个总和一定的一个序列,使它的最后一段的和最小。

令f[i]为1~i中,最后一段最靠右的可能的左端点 - 1,

所以,

f[i] = max{ (j < i && sum[i] - sum[j] >= f[j]) ? j : 0 } ;

单调队列学得好的大佬可以用比较灵活的单调栈去实现,

然后再用一个卡常压位高精就行。

CODE

可惜笔者卡常不会

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
inline int read() {
int f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s == '-') f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 + s - '0';s = getchar();}
return x * f;
}
struct bignum{
LL a[8];
int le;
bignum(){memset(a,0,sizeof(a));le = 1;}
bignum(LL x){a[4] = 0;a[3] = 0;a[2] = x / 1e9;a[1] = x % ((LL)1e9),le = 1;}
void operator = (LL x) {
a[4] = 0;a[3] = 0;a[2] = x / 1e9;a[1] = x % ((LL)1e9),le = 1;
}
};
bignum operator * (bignum x,bignum y) {
bignum z;
for(int i = 1;i <= 3;i ++) {
LL m = 0;
for(int j = 1;i + j - 1 <= 4;j ++) {
z.a[i + j - 1] += x.a[i] * y.a[j] + m;
m = z.a[i + j - 1] / 1e9;
z.a[i + j - 1] %= ((LL)1e9);
}
}
return z;
}
bignum operator + (bignum x,bignum y) {
bignum z;
LL m = 0;
for(int i = 1;i <= 4;i ++) {
z.a[i] = x.a[i] + y.a[i] + m;
m = z.a[i] / 1e9;
z.a[i] %= ((LL)1e9);
}
return z;
}
LL mod = 1073741824;
int n,m,i,j,s,o,k;
LL a[40000005];
LL sum[40000005];
int f[40000005];
int q[40000005],tail,head;
LL min(LL a,LL b) {
return a < b ? a : b;
}
inline LL js(int x) {
return sum[x] + sum[x] - sum[f[x]];
}
int main() {
// freopen("partition.in","r",stdin);
// freopen("partition.out","w",stdout);
n = read();
tail = head = 1;
q[1] = 0;
bool T = read();
if(T) {
LL x = read(),y = read(),z = read();
a[1] = read();a[2] = read();m = read();
for(register int i = 3;i <= n;i ++) a[i] = (a[i - 1] * x % mod + y * a[i - 2] % mod + z) % mod;
int pp = 0;
for(register int i = 1;i <= m;i ++) {
int p = read();
LL l = read(),r = read();
for(register int j = pp + 1;j <= p;j ++) {
(a[j] %= (r - l + 1ll)) += l;sum[j] = sum[j - 1] + a[j];
while(tail <= head && js(q[head]) >= js(j - 1)) head --;
q[++head] = j - 1;
while(tail < head && js(q[tail + 1]) <= sum[j]) tail ++;
f[j] = q[tail];
}
pp = p;
}
}
else {
for(register int i = 1;i <= n;i ++) {
a[i] = read();sum[i] = sum[i - 1] + a[i];
while(tail <= head && js(q[head]) >= js(i - 1)) head --;
q[++head] = i - 1;
while(tail < head && js(q[tail + 1]) <= sum[i]) tail ++;
f[i] = q[tail];
}
}
register int p = n;
// cout<<"ok"<<endl;
bignum ans = 0ll;
// __int128_t ans2 = 0;
while(p) {
ans = (ans + (bignum(sum[p] - sum[f[p]]) * bignum(sum[p] - sum[f[p]])));
// ans2 += ((sum[p] - sum[f[p]]) * (sum[p] - sum[f[p]]));
// printf("[%d,%d]\n",f[p] + 1,p);
p = f[p];
}
int le = 4;
while(ans.a[le] == 0 && le > 1) le --;
printf("%lld",ans.a[le]);
for(int i = le - 1;i > 0;i --) printf("%09lld",ans.a[i]);
printf("\n");
return 0;
}

[CSP-S 2019 day2 T2] 划分的更多相关文章

  1. CEOI 2019 Day2 T2 魔法树 Magic Tree (LOJ#3166、CF1993B、and JOI2021 3.20 T3) (启发式合并平衡树,线段树合并)

    前言 已经是第三次遇到原题. 第一次是在 J O I 2021 S p r i n g C a m p \rm JOI2021~Spring~Camp JOI2021 Spring Camp 里遇到的 ...

  2. 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数

    本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...

  3. NOIP2014 day2 t2 寻找道路

    寻找道路 NOIP2014 day2 t2 描述 在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到 终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指向的 ...

  4. 【LOJ】#3034. 「JOISC 2019 Day2」两道料理

    LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...

  5. 【LOJ】#3033. 「JOISC 2019 Day2」两个天线

    LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...

  6. Loj3033 JOISC 2019 Day2两个天线

    Loj3033 JOISC 2019 Day2两个天线 下午唯一听懂的题目但,但还是比较模糊.写一篇题解来加深一下印象. 题目大意:给定\(n\)根天线,第\(i\)跟天线的高度为\(h_i\),切它 ...

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

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

  8. 2019.6.5 NOIP2014 day2 t2 寻找道路

    我竟然一个人敲了NOIP提高组的t2? 题目描述 在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 路径上的所有点的出边所指向的点都直 ...

  9. CSP/NOIP 2019 游记

    Day0 打牌 Day1 \(T1\) 没开\(ull\), 不知道有几分 \(T2\) \(N^2\)暴力+链, 没搞出树上做法, \(70\)分 \(T3\) 标准\(10\)分( 感觉今年省一稳 ...

随机推荐

  1. python中f'{}'用法

    python3.6增加的方法,字符串定义以f开头,可以使用{}包裹变量,方便字符串的定义. 有些时候很懒,碰到写的比较清晰的就直接搬运:https://blog.csdn.net/weixin_387 ...

  2. junit 5 - Display Name 展示名称

    本文地址:https://www.cnblogs.com/hchengmx/p/14883563.html @DisplayName可以给 测试类 或者 测试方法来自定义显示的名称.可以支持 空格.特 ...

  3. 编写一个kubernetes controller

    Overview 根据Kuberneter文档对Controller的描述,Controller在kubernetes中是负责协调的组件,根据设计模式可知,controller会不断的你的对象(如Po ...

  4. 关于使用koa 跨域问题你可能会遇到

    var cors = require('koa2-cors');// 跨域const allowOrigins = ["http://localhost:8080" // 需要跨域 ...

  5. 『现学现忘』Docker基础 — 40、发布镜像到Docker Hub

    目录 1.准备工作 2.Docker登陆命令 3.Docker提交命令 4.总结: 5.补充:docker tag命令 1.准备工作 Docker Hub地址:https://hub.docker.c ...

  6. Python简单实现自动评论、自动点赞、自动关注脚本

    一些哔哔: 今天的这个脚本,是一个别人发的外包,交互界面的代码就不在这里说了,但是可以分享下自动评论.自动点赞.自动关注.采集评论和视频的数据是如何实现的 开发环境 python 3.8 运行代码py ...

  7. 一个紧张刺激的聊天器,要不要进来看看(Python UDP网络模型)

    先来哔哔两句:(https://jq.qq.com/?_wv=1027&k=QgGWqAVF) 互联网的本质是什么?其实就是信息的交换.那么如何将自己的信息发送到其他人的电脑上呢?那就需要借助 ...

  8. Java获取当天或者明天等零点时间(00:00:00)0时0分0秒的方法

    SimpleDateFormat sdfYMD = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar calendar = ...

  9. Django WEB开发 - Django 3.0 Tutorial入门

    1. Django 官方网站 https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial01/ 2. Model View Controller ...

  10. JDBC:Statement问题

    1.Statement问题  2.解决办法:通过PreparedStatement代替  实践: package com.dgd.test; import java.io.FileInputStrea ...