[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\)分( 感觉今年省一稳 ...
随机推荐
- Git出现“filename too long”错误处理
更新记录 本文迁移自Panda666原博客,原发布时间:2021年5月8日. 怎么肥事? Windows系统下,在Git使用过程中,出现"filename too long"错误提 ...
- Java学习-第一阶段-第一节:Java概述
JAVA概述 Java版本 原网址(https://www.oracle.com/java/technologies/java-se-support-roadmap.html) Oracle 将仅将某 ...
- make 随笔
# --with--cc-opt flag导致./configure时找不到对应库文件? checking for --with-ld-opt="-Wl,-z,relro -Wl,-z,no ...
- 如何利用 RPA 实现自动化获客?
大家好,我是二哥.前高级技术专家 & 增长黑客,现一枚爱折腾的小小创业者,专注于 RPA & SaaS 软件这块.这次给大家带来如何利用 RPA 实现自动化获客 一.RPA 是什么?难 ...
- 【python基础】第06回 运算符和流程控制 1
本章内容概要 1.运算符 2.流程控制 本章内容详解 1.运算符 什么是运算符? 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操作数是2和3,而运算符则是" ...
- Mysql错误:The server time zone value is unrecognized or represents more than one time zone
方法1.修改Mysql的时区为东8区,执行如下命令即可: PS:这种方式每次开机都要配置的 set global time_zone='+8:00' 方法2.配置改成这样的 spring.dataso ...
- Tensorflow2 深度学习十必知
博主根据自身多年的深度学习算法研发经验,整理分享以下十条必知. 含参考资料链接,部分附上相关代码实现. 独乐乐不如众乐乐,希望对各位看客有所帮助. 待回头有时间再展开细节说一说深度学习里的那些道道. ...
- 04.nvue开发
nvue开发注意项 nvue专用内置组件跟api https://uniapp.dcloud.io/nvue-outline?id=_2开发nvue页面 网络示例 https://www.cnblog ...
- Redis_
Redis学习 Redis学习(一) 1. NoSQL的引言 NoSQL(Not Only SQL ),意即不仅仅是SQL, 泛指非关系型的数据库.Nosql这个技术门类,早期就有人提出,发展至200 ...
- dfs-1756:八皇后及1700:八皇后问题
总时间限制: 1000ms 内存限制: 65536kB 描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被 ...