题面

题解

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. 洛谷 P2629 好消息,坏消息 题解

    暴力算法的时间复杂度是O(n^2),考虑优化: 先导入一种思想--断环为链.说通俗点就是在原数组后面再接上下标为1--(n - 1)的元素: 以样例为例:-3 5 1 2:我们将其断环为链后可以得到这 ...

  2. Dcoker镜像管理与容器应用

    Dcoker镜像管理与容器应用 docker基于镜像创建容器 相同版本的镜像只允许存在一个 同一个镜像可以创建多个容器 镜像管理 [root@localhost ~]# docker pull cen ...

  3. CYaRon!语

    P3695 CYaRon!语 开始之前 上次水了些小模拟之后感觉不能再颓废了,于是就来大模拟. 然后这个题花了我一个多星期 还是最差解 不过,为了纪念我的第 20 道紫题,纪念我这一周的努力,我还是想 ...

  4. 如何使用lerna进行多包(package)管理

    为什么要用lerna 将大型代码仓库分割成多个独立版本化的 软件包(package)对于代码共享来说非常有用.但是,如果某些更改 跨越了多个代码仓库的话将变得很 麻烦 并且难以跟踪,并且, 跨越多个代 ...

  5. 02 CSS块级元素和行内元素

    02 CSS块级元素和行内元素 划分依据:根据标签内部可以存放的元素内容不同进行划分,它与CSS样式无关. 要先了解这个 得先了解 什么是容器级别的标签和文本级? 容器级标签 什么是容器级标签? 内部 ...

  6. 『现学现忘』Docker基础 — 41、将本地镜像推送到阿里云

    目录 1.准备工作 2.阿里云容器镜像仓库的使用 (1)创建命名空间 (2)创建容器镜像 (3)查看阿里云镜像仓库的信息 3.将本地Docker镜像推送到阿里云 (1)登陆阿里云 (2)给镜像生成版本 ...

  7. 使用纯 CSS 实现超酷炫的粘性气泡效果

    最近,在 CodePen 上看到这样一个非常有意思的效果: 这个效果的核心难点在于气泡的一种特殊融合效果. 其源代码在:CodePen Demo -- Goey footer,作者主要使用的是 SVG ...

  8. 注册器机制Registry

    在众多深度学习开源库的代码中经常出现Registry代码块,例如OpenMMlab,facebookresearch和BasicSR中都使用了注册器机制.这块的代码经常会让新使用这些库的初学者感到一头 ...

  9. STC8H开发(十三): I2C驱动DS3231高精度实时时钟芯片

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  10. APISpace 空号检测API接口 免费好用

    空号检测也称空号在线过滤,在线筛号,号码在线清洗.空号检测平台借助第五代大数据空号检测系统,为用户提供高精准的空号检测.号码过滤.号码筛选.号码清洗等众多号码检测功能,让用户快速准确的检测出活跃号.空 ...