博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P2300 合并神犇
阅读量:6370 次
发布时间:2019-06-23

本文共 1401 字,大约阅读时间需要 4 分钟。

题意分析

首先这道题不可以使用简单的贪心来做

根据\(DP\) 我们令\(dp[i]\)表示当前到了\(i\)一共做了\(dp[i]\)次合并

\(pre[i]\)表示当前合并到了\(i\)后序列末尾的数

那么\[dp[i]=min\{dp[j]+i-j,sum[i]-sum[j]≥pre[j]\}\]

可惜是\(O(n^2)\)


我们考虑由于是\(dp[i]=dp[j]+val_i\)的形式

所以我们可以使用单调队列优化


\[sum[i]≥sum[j]+pre[j]\]

根据贪心法则 我们希望恰好满足

所以我们维护一个递增的单调队列

CODE:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define inf 0x7fffffff#define N 500008#define IL inline#define M 1008611#define D double#define ull unsigned long long#define R registerusing namespace std;template
IL void read(T &_){ T __=0,___=1;char ____=getchar(); while(!isdigit(____)) {if(____=='-') ___=0;____=getchar();} while(isdigit(____)) {__=(__<<1)+(__<<3)+____-'0';____=getchar();} _=___ ? __:-__;}/*-------------OI使我快乐-------------*/int n,head,tail;int num[N],que[N],dp[N];ll sum[N],pre[N];int main(){// freopen(".in","r",stdin);// freopen(".out","w",stdout); read(n); for(R int i=1;i<=n;++i) read(num[i]); for(R int i=1;i<=n;++i) sum[i]=sum[i-1]+1ll*num[i]; head=0;tail=1; for(R int i=1;i<=n;++i) { while(head+1
=sum[que[head+1]]+pre[que[head+1]]) ++head; pre[i]=sum[i]-sum[que[head]];dp[i]=i-que[head]-1+dp[que[head]]; while(head

HEOI 2019 RP++

转载于:https://www.cnblogs.com/LovToLZX/p/10590567.html

你可能感兴趣的文章
成为准DRAM的小幻想? Supermicro推出增内存的双槽服务器
查看>>
联想仅仅依靠不断的重组是不够的
查看>>
Facebook创始人马克·扎克伯格总结的创业三大黄金法则
查看>>
博科第六代FC获戴尔EMC、富士通、日立数据和NetApp拥戴
查看>>
秋色园QBlog技术原理解析:Module之页面基类设计(五)
查看>>
虚拟化天花板将近,后虚拟化时代如何应对?
查看>>
恶意网站可利用这个新漏洞拖垮Windows 7和8电脑
查看>>
MEMS传感器要闯过的三关
查看>>
天合光能提交美股退市请求 正式私有化
查看>>
区块链技术将如何适用于企业业务
查看>>
为了OCP英特尔拼了,一大波新科技正在路上
查看>>
前白宫反恐首席顾问:NSA可以破解圣贝纳迪恐怖份子所有的iPhone
查看>>
Java最小堆解决TopK问题
查看>>
100万的大数据人才缺口,谁来解决?
查看>>
商标转让和域名转让的区别是什么?
查看>>
《数值分析(原书第2版)》—— 1.1 二分法
查看>>
Instor公司发布一款免费的数据中心成本估算工具
查看>>
公交监控系统之弊须有人出来认头
查看>>
STiD推出两款UHF RFID标签,适用于航空航天、石油等行业
查看>>
注意五大问题,避免CRM低效问题
查看>>