BZOJ 5424: 烧桥计划

目前暂居rk1QAQ

首先,设\(f[i][k]\)为前i个点中,选了第i个点,总共选了k个点的答案。那么就有:

\[f[i][k]=min_{j<i}\{f[j][k-1]+calc(j,i)\}+k*a[i]
\]

其中,\(calc(j,i)=[s[i-1]-s[j]>m]*(s[i-1]-s[j])\)。

那么转移的时候,大于m的很显然的可以用前缀和,而小于等于m的可以用单调队列处理。这样转移复杂度就变成了\(O(n^2)\)。

而\(1000 \le a_i\le 2000\),那么就设选的最小的k个点,k个点的贡献就是\(\frac{k*(k-1)}{2}1000\),而如果一个点也不选,那么贡献最大是\(2000n\),可以发现,当\(k\ge \sqrt{n}\)的时候,选一定不会更优了,所以只需要转移大约\(\sqrt n\)次就好了。

然后转移151次会WA,而转移152次就能A掉了,所以。。。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cctype>
#define qmin(x,y) (x=min(x,y))
#define qmax(x,y) (x=max(x,y))
#define vi vector<int>
#define vit vector<int>::iterator
#define pir pair<int,int>
#define fr first
#define sc second
#define mp(x,y) make_pair(x,y)
#define rsort(x,y) (sort(x,y),reverse(x,y))
using namespace std; inline char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
return getchar();
} template<class T>
int read(T &ans) {
ans=0;char ch=gc();T f=1;
while(!isdigit(ch)) {
if(ch==EOF) return -1;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
} template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)!=EOF&&read(b)!=EOF?2:EOF;
} template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)!=EOF&&read(c)!=EOF?3:EOF;
} typedef long long ll;
const int Maxn=110000;
const int inf=0x3f3f3f3f; int n,m,a[Maxn],s[Maxn],f[Maxn],l,r,cur,g[Maxn];
pir p[Maxn]; void push(int x,int y) {
pir now=mp(x,y);
while(r>=l&&p[r]>now) r--;
p[++r]=now;
} int front() {
while(p[l].sc<cur) l++;
return p[l].fr;
} signed main() {
// freopen("test.in","r",stdin);
read(n,m);
if(m<0) m=0;
for(int i=1;i<=n;i++)
read(a[i]);
n++;
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
int ans=inf,cnt=1;
memset(f,0x3f,sizeof(f));
f[0]=0;
for(int i=1;i<=n;i++) g[i]=s[i];
// memset(g,0x3f,sizeof(g));
// for(int i=1;i<=n;i++) f[i]=g[i]=inf;
for(int i=1;i<=152;i++) {
r=0,l=1;
cur=0;
push(0,0);
int temp=inf;
for(int i=1;i<=n;i++) {
while(s[i-1]-s[cur]>m) qmin(temp,g[cur]-s[cur]),cur++;
int sxz=f[i];
f[i]=s[i-1]+temp;
qmin(f[i],front());
push(sxz,i);
f[i]+=cnt*a[i];
}
qmin(ans,f[n]);
memcpy(g,f,sizeof(g));
cnt++;
}
printf("%d\n",ans);
return 0;
}

BZOJ 5424: 烧桥计划的更多相关文章

  1. BZOJ-5424: 烧桥计划(单调队列)

    BZOJ-5424: 烧桥计划(单调队列) 题目链接 题解: 先考虑最暴力的\(dp\):设\(f[k][i]\)表示搞掉第\(1\sim i\)段,烧了\(k\)段的最小花费,设\(calc(x,y ...

  2. bzoj 前100题计划

    bzoj前100题计划 xz布置的巨大的坑.. 有空填题解... 1002 轮状病毒 用python手动matrixtree打表. #include<bits/stdc++.h> #def ...

  3. bzoj千题计划137:bzoj [CQOI2014]危桥

    http://www.lydsy.com/JudgeOnline/problem.php?id=3504 往返n遍,即单向2*n遍 危桥流量为2,普通桥流量为inf 原图跑一遍最大流 交换b1,b2再 ...

  4. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1388  Solved: 860 [Submit][Stat ...

  5. bzoj 4326: NOIP2015 运输计划

    4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MB Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个 ...

  6. [BZOJ]2132: 圈地计划 最小割

    圈地计划 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一 ...

  7. bzoj 4444: [Scoi2015]国旗计划

    Description A国正在开展一项伟大的计划--国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名优秀的 ...

  8. bzoj 4326: NOIP2015 运输计划(二分+树链剖分)

    传送门 题解: 树链剖分快速求解任意两点间的路径的权值和: 然后,二分答案: 此题的难点是如何快速求解重合路径? 差分数组可以否??? 在此之前先介绍一下相关变量: int fa[maxn]; int ...

  9. BZOJ.1758.[WC2010]重建计划(分数规划 点分治 单调队列/长链剖分 线段树)

    题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深 ...

随机推荐

  1. Kafka性能

    基准测试Apache Kafka:每秒写入2百万(在三台便宜的机器上) 核心的数据枢纽一定是高效的,可预测的,并且容易扩展.Kafka能够做到在普通的硬件上支撑每秒百万次写入. Kafka的数据模型非 ...

  2. (四)Web应用开发---新增对象Master类别

    UI设计类似如下形式 Copy如下Html代码到新创建的Html <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xh ...

  3. Loadrunner 手动关联技术

    录制成功,回放失败,怀疑和动态数据有关: 1 重新录制一份脚本,两次录制的脚本进行比对,确定动态数据,复制动态数据: 2  找到第一次产生该动态数据的响应对应的相应请求: 1)  拷贝脚本中适当长度的 ...

  4. [kx]人眼结构&凹/凸透镜成像及生活应用

    物理学中的lamba光谱: http://www.cnblogs.com/iiiiiher/diary/2018/04/05/8724339.html 思路: 电磁光谱-->可见光-->人 ...

  5. Python安装sqlite3

    今天使用PYthon时,发现错误 ImportError: No module named sqlite 这是因为缺少 SQLITE3的缘故. 下面分享一下解决此问题的方法步骤: 1. 查看是Pyth ...

  6. Java-单向链表算法

    /** * 数据结构之链表(单向链表) * @author Administrator * */ public class LinkNodeTest { public static void main ...

  7. 机器学习理论基础学习14.2---线性动态系统-粒子滤波 particle filter

    一.背景 与卡曼滤波不同的是,粒子滤波假设隐变量之间(隐变量与观测变量之间)是非线性的,并且不满足高斯分布,可以是任意的关系. 求解的还是和卡曼滤波一样,但由于分布不明确,所以需要用采样的方法求解. ...

  8. Map<String, String>循环遍历的方法

    Map<String, String>循环遍历的方法 Map<String, String>循环遍历的方法 Map<String, String>循环遍历的方法 下 ...

  9. window.open和window.showModalDialog

    window.open window.open是打开一个新窗口 在window.open打开的窗口中刷新父页面 opener.location.reload(); 打开一个窗口格式:属性可以任意设置 ...

  10. virtualBox虚拟机联网

    1. 2. 3. 4. 5. 6. 7. 8. 9. 10.