[CSP-S 2019 day2 T2] 划分
题面

题解
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] 划分的更多相关文章
- 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 里遇到的 ...
- 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数
本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...
- NOIP2014 day2 t2 寻找道路
寻找道路 NOIP2014 day2 t2 描述 在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到 终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指向的 ...
- 【LOJ】#3034. 「JOISC 2019 Day2」两道料理
LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...
- 【LOJ】#3033. 「JOISC 2019 Day2」两个天线
LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...
- Loj3033 JOISC 2019 Day2两个天线
Loj3033 JOISC 2019 Day2两个天线 下午唯一听懂的题目但,但还是比较模糊.写一篇题解来加深一下印象. 题目大意:给定\(n\)根天线,第\(i\)跟天线的高度为\(h_i\),切它 ...
- 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解
前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...
- 2019.6.5 NOIP2014 day2 t2 寻找道路
我竟然一个人敲了NOIP提高组的t2? 题目描述 在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 路径上的所有点的出边所指向的点都直 ...
- CSP/NOIP 2019 游记
Day0 打牌 Day1 \(T1\) 没开\(ull\), 不知道有几分 \(T2\) \(N^2\)暴力+链, 没搞出树上做法, \(70\)分 \(T3\) 标准\(10\)分( 感觉今年省一稳 ...
随机推荐
- .NET 处理[未能为 SSLTLS 安全通道建立信任关系]问题
更新记录 2022年4月16日本文迁移自Panda666原博客,原发布时间:2021年7月16日. 在.NET的开发过程中,发现[基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系]问题 ...
- C#项目中常见的目录和文件
本文迁移自Panda666原博客,原发布时间:2021年4月17日. Bin 目录 bin是英文binary的缩写, 字面意思是二进制,意指用来存放编译后的结果.C#/VB编译器编译后的程序二进制文件 ...
- 七、服务器硬件及RAID配置实战
一.RAID磁盘阵列介绍 磁盘阵列的全名(Redundant Arrays of Inexpensive Disk,RAID),中文简称是独立冗余磁盘阵列.冗余(如果磁盘出现故障,可以保证数据不丢) ...
- bat-进程与服务
进程 tasklist 查看进程表 关闭进程 taskkill /PID xxx taskkill -f -im unm* taskkill -f -im ice* 服务 **net** net命令不 ...
- Flink1.13.1源码解析-Application on yarn(一)
本篇文章讲述 Flink Application On Yarn 提交模式下,从命令提交到 AM 容器创建 1.脚本入口 flink run-application -t yarn-applicati ...
- go-zero微服务实战系列(九、极致优化秒杀性能)
上一篇文章中引入了消息队列对秒杀流量做削峰的处理,我们使用的是Kafka,看起来似乎工作的不错,但其实还是有很多隐患存在,如果这些隐患不优化处理掉,那么秒杀抢购活动开始后可能会出现消息堆积.消费延迟. ...
- PTA(BasicLevel)-1014 福尔摩斯的约会
一.问题描述 大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm.大侦探很快就明 ...
- [Java学习笔记] Java异常机制(也许是全网最独特视角)
Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...
- IP核的使用(Vivado中的调用,product guide的查询阅读 ,引脚的设置(位宽,个数,算法等),coe文件的初始化 )
IP核:Intellectual Property core ,即知识产权核.每个IP核可以实现特定功能,我们在设计一个东西时可以直接调用某个IP核来辅助实现功能. 存在形式:HDL语言形式,网表形式 ...
- python sphinx(文档生成器)入门
简介 Sphinx 是一个 文档生成器 ,您也可以把它看成一种工具,它可以将一组纯文本源文件转换成各种输出格式,并且自动生成交叉引用.索引等.也就是说,如果您的目录包含一堆 reStructuredT ...