[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\)分( 感觉今年省一稳 ...
随机推荐
- CF1665A GCD vs LCM
- 基于Kubernetes v1.24.0的集群搭建(二)
上一篇文章主要是介绍了,每台虚拟机的环境配置.接下来我们开始有关K8S的相关部署. 另外补充一下上一篇文章中的K8S的changelog链接: https://github.com/kubernet ...
- pyenv安装及使用教程
pyenv安装及使用教程 pyenv 安装 git clone https://github.com/pyenv/pyenv.git ~/.pyenv # 编辑 bashrc vim ~/.bashr ...
- SAP -熟练使用T-Code SHD0
SHD0 业务顾问和开发顾问都非常熟悉的一个T-Code, 如果能合理使用它,可以省去许多增强和程序修改工作. 当我需要时,我在这里找不到任何相关文档,这就是为什么我想借此机会向我们自己的SCN提供内 ...
- 不要使用短路逻辑编写 stl sorter 多条件比较
前言 最近工期紧.任务多,没有时间更新博客,就水一期吧.虽然是水,也不能太水,刚好最近工作中遇到一个 sorter 多条件排序的问题,花费了半天时间来定位解决,就说说它吧. 背景 公司产品是一个跨端的 ...
- Redis docker 主从模式与哨兵sentinel
更多技术记录,请参考软件开发 | 编程 | RustFisher 为实现redis的高可用,我们采用主从模式加哨兵的方法. 一主二从三哨兵,共启动6个redis容器.本文示例在同一个服务器上进行操作. ...
- 【Java面试】简单说一下你对序列化和反序列化的理解
Hi,大家好,我是Mic 一个工作4年的粉丝,投了很多简历 好不容易接到一个互联网公司的面试邀约. 在面试第一轮就被干掉了,原因是对主流互联网技术理解太浅了. 其中就有一个这样的问题:"简单 ...
- LinkedList集合和Vector集合
LinkedList集合数据存储的结构是链表结构.方便元素添加.删除的集合.实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法 LinkedList ...
- pyinstaller打包一些三方库后,报资源不存在
在目录site-packages\PyInstaller\hooks下新建对应文件hook-对应三方库名字.py,如hook-ngender.py 编辑hook-ngender.py: from Py ...
- SQLZOO练习四--SUM and COUNT(聚合函数)
World Country Profile: Aggregate functions This tutorial is about aggregate functions such as COUNT, ...