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 ...
随机推荐
- [USACO2007NOVS] Best Cow Line S
题目描述 Farmer John 打算带领 \(N\)(\(1 \leq N \leq 2\,000\))头奶牛参加一年一度的"全美农场主大奖赛".在这场比赛中,每个参赛者必须让他 ...
- [ABC233G] Strongest Takahashi
Problem Statement There is a $N \times N$ grid, with blocks on some squares. The grid is described b ...
- svn、git服务器配置进程方式网关不生效常见处理方法
过华企盾DSC防泄密系统配置svn或者git服务器的时候,网关不生效如何解决? 1.先在cmd中运行一下命令netstat -ano|findstr "8080" 找到svn.gi ...
- Bert-vits2最终版Bert-vits2-2.3云端训练和推理(Colab免费GPU算力平台)
对于深度学习初学者来说,JupyterNoteBook的脚本运行形式显然更加友好,依托Python语言的跨平台特性,JupyterNoteBook既可以在本地线下环境运行,也可以在线上服务器上运行.G ...
- 面试官:说说MVCC的执行原理?
MVCC(Multi-Version Concurrency Control)是一种并发控制机制,用于解决数据库并发访问中,数据一致性问题.它通过在读写操作期间保存多个数据版本,以提供并发事务间的隔离 ...
- 基于QT环境下,实现客户端红外采集人体向服务端通信。
一.本次测试目的 基于QT环境下STM32人体红外检测,实现客户端红外采集到信息向服务端通信. 二.功能 (1).传入音乐,当服务端接收到信息时,打开音乐 (2).在服务端上面显示图片,当接收到 ...
- 【难受】SpirngCloud-Alibaba-nacos跨服务器访问接口的问题
原想法:我首先准备了 一个网关 2个服务 分别将两个服务部署到不同的远程服务器当中 实现跨服务器访问接口 网关为本地调用--这里就不一一介绍了 问题 利用gateway做路由时出现服务不可用的情况,看 ...
- static、final、private是否可以修饰抽象方法?
1.static和abstract:是不能共存的.static是为了方便调用,abstract是为了给子类重写,没有方法体. 2.final和abstract:是互相冲突的,final修饰的方法不能重 ...
- Nginx unexpected end of file 配置证书遇到问题,如何解决?
原文链接 https://bysocket.com/nginx-unexpected-end-of-file-expecting-in-key-file/ 一.Nginx unexpected end ...
- 千年荒漠变绿洲,看沙漠“卫士”携手昇腾AI植起绿色希望
摘要:风沙肆虐,沙漠侵蚀神州大地,华东师范大学基于昇腾AI基础软硬件平台研制的种树机器人成为沙漠"卫士",穿越戈壁,跨越千里,为荒漠治理贡献力量!华师大携手昇腾AI共同植起绿色希望 ...