description




analysis

  • 首先有一个结论,对于\([1,i]\)区间划分最后一段的和尽量小,答案会更优,具体证明参考毛爷爷的博客

  • 设\(f[i]\)为满足\([1,i]\)划分最优时、\((f[i],i]\)这段和最小时的最右的端点,最优划分即为从\(n\)开始向\(f\)不断统计

  • 由后一段比前一段大可知\(sum[f[i]]-sum[f[f[i]]]≤sum[i]-sum[f[i]]\),即\(sum[i]≥2sum[f[i]]-sum[f[f[i]]]\)

  • 右边只和\(f[i]\)有关,把右边的记为\(clac(f[i])\),于是可以维护一个\(clac\)值上升的单调队列来求出每一位的\(f\)

  • 具体维护就是,队头不断出队直到\(sum[i]<clac(q[head])\)(因为\(f[i]\)要尽可能大),\(f[i]\)赋为队头

  • 若\(clac(i)≤clac(q[tail])\)队尾再不断出队(因为\(clac(i)\)更小且\(i\)更靠右),最后\(i\)进队,就完成了队列的维护


code

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 40000005
#define ha 1073741824
#define ll long long
#define LL __int128
#define reg register int
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i) using namespace std; int p[100005],l[100005],r[100005];
int f[MAXN],q[MAXN];
ll b[MAXN],sum[MAXN];
int n,type; inline int read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline ll clac(ll x){return 2*sum[x]-sum[f[x]];}
inline void print(LL x)
{
int num[55];num[0]=0;
while (x)num[++num[0]]=x%10,x/=10;
while (num[0])printf("%d",num[num[0]--]);
printf("\n");
}
int main()
{
n=read(),type=read();
if (type)
{
int x=read(),y=read(),z=read();b[1]=read(),b[2]=read();int m=read(),now=1;
fo(i,1,m)p[i]=read(),l[i]=read(),r[i]=read();
fo(i,3,n)b[i]=(x*b[i-1]%ha+y*b[i-2]%ha+z)%ha;
fo(i,1,n)
{
if (i>p[now])++now;
sum[i]=sum[i-1]+(b[i]%(r[now]-l[now]+1))+l[now];
}
}
else {fo(i,1,n)sum[i]=sum[i-1]+read();}
int head=0,tail=0;
fo(i,1,n)
{
while (head<tail && sum[i]>=clac(q[head+1]))++head;
f[i]=q[head];
while (head<tail && clac(i)<=clac(q[tail]))--tail;
q[++tail]=i;
}
LL ans=0;
for (reg i=n;i;i=f[i])ans+=(LL)(sum[i]-sum[f[i]])*(sum[i]-sum[f[i]]);
print(ans);
return 0;
}

最新文章

  1. crontab
  2. Swift 写纯洁的TableviewCell
  3. 移动web前端之meta标签
  4. Android中Bitmap和Drawable
  5. Scrum Meeting 9-20151211
  6. HDU-4521 小明系列问题——小明序列 间隔限制最长上升子序列
  7. hdu 5769 Substring 后缀数组 + KMP
  8. js 如何把JSON格式的字符串转换为JSON对象
  9. ArrayUtils用法
  10. win7系统玩游戏不能全屏的解决办法
  11. E. Three States - Codeforces Round #327 (Div. 2) 590C States(广搜)
  12. 9、Cocos2dx 3.0游戏开发三查找值小工厂方法模式和对象
  13. iOS定义自己的回报button(它不影响返回手势)
  14. 10169 - Urn-ball Probabilities !
  15. main 及Scanner
  16. mysql设置存储中文变成问号或者乱码
  17. java用星星符号打印出一个直角三角形
  18. CCF2016092火车购票
  19. 虚拟机VirtualBox与CentOS 7安装
  20. WCF开发框架形成之旅---WCF的几种寄宿方式

热门文章

  1. 深度学习练手项目——DNN识别手写数字
  2. php socket简单原理及实现笔记
  3. 部署core
  4. Mac 终端SSH连接服务器
  5. 【架构】Linux的架构(architecture)
  6. Spring解决循环依赖
  7. tp框架连接数据库配置及Model数据模型层
  8. 怎么让小白理解intel处理器(CPU)的分类
  9. CSS 布局 - Overflow
  10. (转)Adaboost