解析

自己写的时候写了二维单调队列优化的64分
一次过还是可以满意了啦

正解的关键结论是最优的方案的最后一段一定尽可能的短
原因嘛…显然 贪心的想,再最后一段的段首可以往前放的情况下肯定是要往前放的,这样代价更小,同时对后面的选取也更加有利

这个性质是可以递归的
考虑如何求以i结尾的最后一段的最短长度
设以iii为末端的最短段的上一段的段尾在posipos_iposi​
设sis_isi​是[1,i][1,i][1,i]的前缀和
那么posipos_iposi​就是满足:
si−sj>=sj−sposjs_i-s_j>=s_j-s_{pos_j}si​−sj​>=sj​−sposj​​
的jjj的最大值
移一下项:
si>=2∗sj−sposjs_i>=2*s_j-s_{pos_j}si​>=2∗sj​−sposj​​
这个就可以用单调队列来维护了
时间复杂度O(n)O(n)O(n)

关于最后的12分
需要高精
然而我上压位了还是T
qwq
int128 真香

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=4e7+100;
const double eps=1e-6;
const int mod=1333331;
inline ll read() {ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
int n,m;int pos[N];
ll sum[N];
int q[N],st,ed;
#define calc(o) (sum[o]*2-sum[pos[o]])
const int key=1e4;
struct bign{ll a[155],len;
};
inline bign trans(ll o){bign res;res.len=0;while(o){res.a[++res.len]=o%key;o/=key;}return res;
}
inline bign operator * (bign a,bign b){bign res;memset(res.a,0,sizeof(res.a));for(register int i=1;i<=a.len;i++){for(register int j=1;j<=b.len;j++) res.a[i+j-1]+=a.a[i]*b.a[j];}res.len=a.len+b.len;int p=0;for(register int i=1;i<=res.len;i++){res.a[i]+=p;p=res.a[i]/key;res.a[i]-=key*p;if(i==res.len&&p) res.len++;}while(!res.a[res.len]) res.len--;return res;
}
inline bign operator + (bign a,bign b){bign res;memset(res.a,0,sizeof(res.a));int top=a.len>b.len?a.len:b.len,p=0;for(register int i=1;i<=top;i++){res.a[i]+=a.a[i]+b.a[i]+p;p=res.a[i]/key;res.a[i]-=key*p;if(i==top&&p) top++;}res.len=top;return res;
}
__int128 res;
int b[N],p[N],l[N],r[N],w=(1<<30)-1;
void write(__int128 x){if(x>9) write(x/10);putchar('0'+x%10);return;
}
int main() {n=read();register int T=read();int a;if(T==0) for(register int i=1;i<=n;i++) a=read(),sum[i]=sum[i-1]+a;else{ll x=read(),y=read(),z=read();b[1]=read(),b[2]=read(),m=read();for(register int i=1;i<=m;i++){p[i]=read();l[i]=read();r[i]=read();}int pl=1;for(register int i=3;i<=n;i++) b[i]=(1ll*x*b[i-1]+1ll*y*b[i-2]+z)&w;for(register int i=1;i<=n;i++){if(i>p[pl]) ++pl;a=(b[i]%(r[pl]-l[pl]+1))+l[pl];sum[i]=sum[i-1]+a;}}for(register int i=1;i<=n;i++){while(st<ed&&sum[i]>=calc(q[st+1])) st++;pos[i]=q[st];while(st<=ed&&calc(q[ed])>=calc(i)) ed--;q[++ed]=i;//printf("i=%d pos=%d\n",i,pos[i]);}for(register int pl=n;pl;pl=pos[pl]){res=res+(__int128)(sum[pl]-sum[pos[pl]])*(sum[pl]-sum[pos[pl]]);}//printf("%d\n",res.len);write(res);return 0;
}
/*
100 1
123 456 789 12345 6789 3
2000000 123456789 987654321
7000000 234567891 876543219
10000000 456789123 567891234
*/

CSP2019洛谷P5665:划分(单调队列,高精度)相关推荐

  1. 洛谷试炼场 4-8单调队列

    layout: post title: 洛谷试炼场 4-8单调队列 author: "luowentaoaa" catalog: true mathjax: true tags: ...

  2. 洛谷P1080-国王游戏-贪心+高精度

    P1080-国王游戏 啊啊啊,刚才已经写了一次了,但是Edge浏览器不知道为什么卡住了,难受. 好吧,其实是一道可做题,分析得到的贪心策略就是就是将a * b小的放在前面(其他的懒得说了),主要还是要 ...

  3. 洛谷P2144 bzoj1002 [FJOI2007]轮状病毒 (高精度板子)

    P2144 [FJOI2007]轮状病毒 题目描述 轮状病毒有很多变种.许多轮状病毒都是由一个轮状基产生.一个n轮状基由圆环上n个不同的基原子和圆心的一个核原子构成.2个原子之间的边表示这2个原子之间 ...

  4. 洛谷 P1255 数楼梯(dp + 高精度)

    传送门 大致题意 : 经典走楼梯问题 分析 : 用斐波那契数列来解即可, f[i] 表示从1走到 i 的方案数, 属性为数量, 一次可上1步或2步 可推出状态转移方程 : f[i] = f[i-1] ...

  5. 洛谷P1080 国王游戏 贪心+高精度

    https://www.luogu.org/problem/P1080 题目描述 恰逢 HH H国国庆,国王邀请n nn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王 ...

  6. CSP2019洛谷P5666:树的重心

    解析 毒题 细节有亿点点多 我一开始的思路是没有问题的 尝试统计有多少种方案能砍出大小在一个区间的子树. 当时的想法是线段树合并 但是这个玩意在需要保留原树的情况下空间复杂度炸没了- 因为我垃圾的实现 ...

  7. 洛谷算法题单:模拟与高精度例题(上)

    一:模拟 想要利用计算机解决现实生活中的一些复杂的问题时,建立模型是解决问题的关键. 举个生活中常见的例子:我们拿到了某次数学考试的成绩单,现在需要知道谁考得最好.当然不能把成绩单对着电脑晃一晃,然后 ...

  8. 洛谷 - P1886 滑动窗口(单调队列/线段树)

    题目链接:点击查看 题目大意:给出一个由n个数构成的序列,再给出一个长度为k的窗口,这个窗口从第一个下标开始一直向后移动,每次移动一个单位,每次移动询问一次该窗口中的最大值和最小值,最后输出答案 题目 ...

  9. [USACO18JAN]Lifeguards P 洛谷黑题,单调队列优化DP

    传送门:戳我 这道题有两个版本,S和P,S是K等于1的情况,显然可以用线段树水过. P版本就难了很多,洛谷黑题(NOI/NOI+/CTSC),嘿嘿. 我自己也不是很理解,照着题解写了一遍,然后悟到了一 ...

最新文章

  1. mysql怎么判断2个时间戳为同一天_请教一个需求js怎么判断时间戳是否属于同一天...
  2. BZOJ3473:字符串(后缀数组,主席树,二分,ST表)
  3. 利用 GPU 加速人工智能:新型计算模式
  4. torch 列最大值
  5. matlab 计算误码率,关于误码率的问题 急!!!!!
  6. <MySQL>何时使用普通索引,何时使用唯一索引
  7. 日文转换为罗马音_手把手教你掌握韩语40音!入门必备哦
  8. micropython编程软件下载_MicroPython可视化拼插编辑器:让硬件编程更智能!
  9. 【转】Burp Suite详细使用教程-Intruder模块详解
  10. 民航重组:做大容易做强难
  11. xshell4 选中复制,右键粘贴
  12. VTK笔记-组建vtkPolyData-四面体/五面体/六面体
  13. ROS中NodeHandle nh与NodeHandle nh(“~“)区别
  14. miui11稳定版获取完整root_怎么获取root权限-MIUI11系统开启系统ROOT权限图文教程-支持小米红米全部机型...
  15. 我是怎样的一个人感悟
  16. 一些免费的代理服务器
  17. 块存储、文件存储、对象存储
  18. 域名转向目录php代码,php域名301转向程序代码
  19. css颜色和长度简写
  20. 如何安装旧的nvidia显卡驱动程序

热门文章

  1. 腐蚀rust服务器命令_RUST++ MOD
  2. 对象中multipartfile 空报错_Python 为什么会有个奇怪的“...”对象?
  3. 苹果手机透明桌面_原来苹果手机辨别真假很容易!查看桌面1个图标,就能轻松分辨...
  4. Php xml 目录,PHP-PHP+xml的无限分类树目录的方法?
  5. 用python排序算法_Python - 八大排序算法
  6. leetcode1047. 删除字符串中的所有相邻重复项
  7. [JavaWeb-JavaScript]JavaScript注释数据类型
  8. [设计模式]简单工厂和工厂方法模式适用场景
  9. [C++STL]C++实现queue容器适配器
  10. [蓝桥杯][算法提高VIP]夺宝奇兵-递推+记忆化搜索