P1725-DP【绿】
这道题最开始我用记搜写的,然后WA了一些点,后来看了半天才发现是数组开小了,原来他给了两个数据范围,一个是60%数据的数据范围,另一个是100%数据的数据范围。我没仔细看,没看见后面那行,把60%数据当成本题数据范围了....自然WA了(不过有点好奇为什么不是RE,但是不重要,这种情况不罕见)
然后,增大数组后WA的点就变成TLE了,80分的TLE。然后我用上了cincout加速并且化递归为递推,用正儿八经的DP代替了记搜,过了。
但是,我意识到我提交代码时默认勾选了O2选项,按往常的习惯,我吸口氧能过的题绝对不再花时间。但这道题鬼使神差的我试了试不开O2,结果让我大跌眼镜直接TLE了四个点只有60分...我突然不再那般不求甚解了,得认真些才是呀,于是我打开了题解,想知道自己为什么TLE了以及正解应该怎么优化。(直到那时我还以为这是一道卡常题所谓正解也无非是优化了常数的做法)但是,看到题解后瞬间意识到自己O(n^2)的做法在这个2*10^5数据范围的题目中过不去简直太正常了,我差的不是常数优化,而是根本性的优化。然后我接触到了好多新的优化方法,优先队列、单调队列、线段树、分块。我随后学习了优先队列和单调队列的思想,然后意识到用单调队列来优化我这道题是非常之自然的做法,此前也隐约想到了这种优化但是考虑到下标会在优化过程中丢失然后就不知道该怎么处理了所以没这么做。然而题解仿佛一语点醒梦中人,直接用结构体当队列节点不就行了,把下标和数据绑死在一起,下标本身也存起来而不是依赖其序号而确定就可以消灭一个我此前以为优先队列和单调队列存在的缺点——下标丢失。所以我此前以为的缺点其实根本不算一回事。
最后我感悟到单调队列的思想以及那个用结构体的小tips之后手写了起来,写的不快,但最终写成了,这个过程便让我彻底理解了单调队列,以后就完全会了这种手段了。
顺便还意识到原来deque是可以用迭代器访问其中间元素的,此前我被某些垃圾博客忽悠以为这东西不能访问内部来着,所以此前一直用vector代替deque,现在好了,直到deque可以用并且前端插入的效率远快于vector,以后的各种新队列都可以用deque来实现喽,很方便。
最后,发现这个做法的提升不是一点半点,原本的算法2s的时限都超出了,新代码直接三十多ms过大数据,并且取消掉cincout优化后仍可以50多毫秒过大数据,开了O2后甚至十几ms就能过大数据。
看来读入优化等常数优化的效果果然远小于此类根本性的优化,以后要先分析自己的时间复杂度,发现有明显问题是优先想彻底性的优化,然后再考虑读入优化尾递归等小优化,别上来就读入优化。长期用常数优化+O2骗过洛谷是会有很多坏处的!今天要不是我多想了想,这些知识就错过了!
Code
#include <iostream>
#include <deque>
using namespace std;
struct node
{
int index,num;
node(){}
node(int i,int n){index=i;num=n;}
};
deque<node> q;
int n,l,r,a[400000+5],ans=-99999999,dp[400000+5];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>l>>r;
for(int i=0;i<=n;i++)cin>>a[i];
for(int i=1;i<l;i++)dp[i]=-99999999;
for(int i=l;i<=n+r;i++)
{
while(!q.empty()&&q.front().index<max(0,i-r))q.pop_front();//出队是全自动的,只要设定好新的窗口左端
int k=min(i-l,n);//单调队列处理滑动窗口问题,入队时只需要考虑新纳入队列考虑范围的那些未入队节点如何入队,有时每轮循环中只需要考虑一个节点的入队
while(!q.empty()&&q.back().num<dp[k])q.pop_back();
q.push_back(node(k,dp[k]));
dp[i]=a[i]+q.front().num;
}
for(int i=n+1;i<=n+r;i++)ans=max(ans,dp[i]);
cout<<ans<<endl;
return 0;
}
P1725-DP【绿】的更多相关文章
- 「疫期集训day4」硝烟
那真是一阵恐怖的炮击(that boomed booms),响亮的炮音(that noise),滚滚的硝烟(that smoke),熊熊的火焰在围绕着我们前进...小心前进(go and be car ...
- Luogu【P1725】琪露诺(单调队列,DP)
本文是笔者第二篇解题报告.从现在开始,会将练的一些题发到博客上并归类到"解题报告"标签中. 琪露诺是这样一道题 这道题可以用纯DP做,但是据说会超时.(为什么?看起来过河这题比它数 ...
- 洛谷P1725琪露诺(单调队列优化dp)
P1725 琪露诺 题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精.某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪 ...
- 洛谷p1725 露琪诺 单调队列优化的DP
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int ...
- 洛谷P1725 琪露诺 (单调队列/堆优化DP)
显然的DP题..... 对于位置i,它由i-r~i-l的位置转移过来,容易得到方程 dp[i]=dp[i]+max(dp[i−r],...,dp[i−l]). 第一种:n2的暴力,只能拿部分分. 1 ...
- 【BZOJ-1260】涂色paint 区间DP
1260: [CQOI2007]涂色paint Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1147 Solved: 698[Submit][Sta ...
- hdu4939 Stupid Tower Defense (DP)
2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131 ...
- 洛谷P2014 选课 (树形dp)
10月1日更新.题目:在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分 ...
- 【DP】BZOJ 1260: [CQOI2007]涂色paint
1260: [CQOI2007]涂色paint Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 893 Solved: 540[Submit][Stat ...
- 周赛C题 LightOJ 1047 (DP)
C - C Time Limit:500MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Description Th ...
随机推荐
- [ABC318G] Typical Path Problem
Problem Statement You are given a simple connected undirected graph $G$ with $N$ vertices and $M$ ed ...
- springBoot——多环境开发
不常用的application.properties版的 常用的:application.yml版 #多环境开发,设置启用环境 spring: profiles: active: test --- # ...
- oracle12c静默安装
oracle12c 静默安装 先决条件 ● 至少 1 GB RAM 用于 Oracle 数据库安装.建议使用 2 GB 内存. ● 至少 8 GB RAM 用于 Oracle Grid Infrast ...
- CatFly【汇编代码还原】
CatFly[难度:1] 题目界面 下载附件,发现是dll文件,放到linux中运行一下,运行界面如图所示: 从上图中可以看到两处字符串,上面的字符串不断滚动,下方字符串在次数上不断累加,猜测上方字符 ...
- Linux磁盘专题-常用分区命令
划分分区 fdisk 专门用于划分MBR类型的分区.(mbr分区类型在linx中也叫msdos) 注意:fdisk在centos7上已经可以用来划分gpt类型的分区. 详细不说了,N年之前学习过 gd ...
- 一款基于.NET Core的快速开发框架、支持多种前端UI、内置代码生成器
前言 经常看到有小伙伴在技术群里问有没有什么好用且快速的开发框架推荐的,今天就给大家分享一款基于MIT License协议开源.免费的.NET Core快速开发框架.支持多种前端UI.内置代码生成器. ...
- 华企盾DSC编辑文件不加密常见问题
1.先查看客户端日志主进程是否是加密进程.日志中是不是勾选智能半透明.加密类型是否有添加 2.用procmon监控保存的文件找出writefile的进程是否有添加,进程树是否有父进程,加密类型是否正确 ...
- 将微服务注册到nacos中
将微服务注册到nacos中将微服务注册到nacos中 首先修改pom文件,引入nacos依赖,名为spring-cloud-starter-nacos-discovery <dependency ...
- ElasticSearch之线程池
ElasticSearch节点可用的CPU核的数量,通常可以交给ElasticSearch来自行检测和判定,另外可以在``elasticsearch.yml`中显式指定.样例如下: node.proc ...
- DDD落地实践-架构师眼中的餐厅 | 京东云技术团队
本文以餐厅场景为叙事主线,以领域驱动为核心思想,结合架构设计与功能设计方法论.是从领域分析到落地的全过程案例,内容偏重于落地,因此不乏一些探讨,欢迎指正. 文章较长.全程干货.耐心读完.必有收获. 本 ...