【HDU3507】Print Article

单调队列DP复出练手题

朴素方程dp[i]=min(dp[j]+(s[i]-s[j-1])^2+m

你懂得

 1 var dp,s:array[0..500000]of int64;
 2     a,q:array[1..500000]of longint;
 3     n,m,i,t,w:longint;
 4
 5 function sum(x,y:longint):int64;
 6 begin
 7  exit(s[y]-s[x-1]);
 8 end;
 9
10 function clac(j,i:longint):int64;
11 begin
12  exit(dp[j]+sqr(sum(j+1,i))+m);
13 end;
14
15 function cmp(x,y,z:longint):boolean;
16 var x1,y1,x2,y2:int64;
17 begin
18  x1:=dp[x]-dp[y]+sqr(s[x])-sqr(s[y]);
19  y1:=2*(s[x]-s[y]);
20  x2:=dp[y]-dp[z]+sqr(s[y])-sqr(s[z]);
21  y2:=2*(s[y]-s[z]);
22  if x1*y2>=x2*y1 then exit(true);
23  exit(false);
24 end;
25
26 begin
27  assign(input,‘1.in‘); reset(input);
28  assign(output,‘1.out‘); rewrite(output);
29  while not eof do
30  begin
31   readln(n,m);
32   fillchar(dp,sizeof(dp),0);
33   for i:=1 to n do readln(a[i]);
34   s[0]:=0;
35   for i:=1 to n do s[i]:=s[i-1]+a[i];
36   t:=1; w:=1; q[1]:=0; dp[0]:=0;
37   for i:=1 to n do
38   begin
39    while (w-t>=1)and(clac(q[t],i)>=clac(q[t+1],i)) do inc(t);
40    dp[i]:=clac(q[t],i);
41    while (w-t>=1)and cmp(q[w-1],q[w],i) do dec(w);
42    inc(w); q[w]:=i;
43   end;
44   writeln(dp[n]);
45  end;
46  close(input);
47  close(output);
48 end.

时间: 2024-11-05 18:48:10

【HDU3507】Print Article的相关文章

【Hdu3507】Print Article(斜率优化)

Description 题意:给N个数,按顺序全部取走,每次取一段连续的区间,代价为\((S[i]-S[j])^2+M\) 其中M为一个给定的常数,\(S[i]\)为前缀和 \(N\leq 500000\) Solution 常规的方程:\(dp[i]=min\{dp[j]+(S[i]-S[j])^2+M\}, j<i\) \(O(n^2)\)是过不了50万的,用斜率优化 设有\(k<j<i\) 使得决策j更优,那么有 \(dp[j]+(S[i]-S[j])^2+M<dp[k]+(

【Python3】print用逗号,write用加号

print("\n", Gb[u], "\t",IDlist[u],end="") f.write("\n"+ Gb[u]+"\t"+IDlist[u])  

HDU3507:Print Article(斜率优化dp)

传送门 题意: 现有\(n\)个数,每个数的值为\(a_i\),现在可以把数划分为多段,每一段的代价为\((\sum_{k=i}^{j}c_i)^2+M\). 问怎么划分,代价最小. 思路: 考虑dp,那么dp式子很简单: \[ dp(i)=min\{dp(j)+(S_i-S_j)^2+M\} \] 注意这种\(dp\)形式,后面加上的部分与\(i,j\)两个变量有关,这种一般可以考虑分离变量然后斜率dp优化. (PS.如果可以分为多个部分,每个部分只和一个有关,那么可以考虑单调队列优化.fro

【转载】How to develop your own Boot Loader【怎么样开发自己的bootloader】

How to develop your own Boot Loader 怎么样开发自己的bootloader Table of content[目录] 1. Who may be interested[谁可能会感兴趣]2. What is Boot Loader [Bootloader是什么]3. Be ready to go deeper [深入探究前的准备]3.1. So what language you should know to develop Boot Loader [开发Boot

【LeetCode】树(共94题)

[94]Binary Tree Inorder Traversal [95]Unique Binary Search Trees II (2018年11月14日,算法群) 给了一个 n,返回结点是 1 - n 的所有形态的BST. 题解:枚举每个根节点 r, 然后递归的生成左右子树的所有集合,然后做笛卡尔积. 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *

【python】禁止print输出换行的方法

print后用一个逗号结尾就可以禁止输出换行,例子如下 >>> i=0 >>> while i < 3: print i i+=1 0 1 2 禁止输出换行后效果如下: >>> i=0 >>> while i < 3: print i, i+=1 0 1 2 [python]禁止print输出换行的方法,布布扣,bubuko.com

【Python系统学习01】print函数的用法

原网页和源代码地址 print函数的用法 print - Python中打印信息的函数,可以打印代码运行结果,帮助我们了解代码执行状态. 注意??:在python代码书写过程中,一定要切换成英文输入状态,保证print()函数的括号是用[英文括号],并且其他默认所有正确的语法,包括标点符号都是[英文].不小心用了中文标点的话,计算机会无法识别,然后报错syntaxError:invalid syntax(语法错误:无效语法). 一.主要功能: 打印内容. 打印的意思是:让计算机把你给它的指令结果

hdu3507 Print Article[斜率优化dp入门题]

Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 11761    Accepted Submission(s): 3586 Problem Description Zero has an old printer that doesn't work well sometimes. As it is antiqu

HDU3507 Print Article

Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it to print articles. But it is to