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 ...
随机推荐
- AntDesignBlazor示例——分页查询
本示例是AntDesign Blazor的入门示例,在学习的同时分享出来,以供新手参考. 示例代码仓库:https://gitee.com/known/BlazorDemo 1. 学习目标 分页查询框 ...
- Git提交修正
应用场景 日常开发中我们可能会遇到这样的问题 1.提交了代码有错误 2.提交的信息写错了 3.漏了一些文件没有提交 ...... 再或者我们写一个功能时,中间有很多小的提交,这中间就会产生特别多的co ...
- 推荐给前端开发的 5 款 Chrome 扩展 🚀
大家好,我是 dom 哥.这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星. 工欲善其事,必先利其器.Chrome 可能是前端开发中使用最多的浏览器.在日常开发中,下列几款 Ch ...
- django-celery-results - 使用 Django ORM/Cache 作为结果后端
https://docs.celeryq.dev/en/stable/django/first-steps-with-django.html#django-celery-results-using-t ...
- ASR项目实战-任务队列在文件转写特性中的应用
转写时长超出60秒的语音文件,业界的竞品通常会使用创建异步转写任务的方式来提供支持. 一个简单.直接的实现方案,即: 网关服务接收到来自客户的转写请求时,将任务信息持久化至任务队列中. 由算法服务的实 ...
- Python——第四章:作用域
作用域: 变量的访问权限 全局变量 -> 全局作用域 局部变量 -> 局部作用域(比如在函数内定义的变量,只能在函数内调用) a = 10 # 全局变量 -> 全局作用域 print ...
- javaGUI入门之swing(一)
javaGUI入门之swing(一) 前面学过javafx,发现他们有"异曲同工"之处,demo写起来也类似,无非是类名不一样.个人觉得实现一个桌面应用不应该只看用一种语言一种框架 ...
- 2021-01-25:redis中,哨兵如何选举?
福哥答案2021-01-25: 答案1: redis-sentinel故障转移的流程: 1.当多个sentinel发现并确认了master有问题. 2.接着会选举出一个sentinel作为领导. 3. ...
- Llama2-Chinese项目:2.2-大语言模型词表扩充
因为原生LLaMA对中文的支持很弱,一个中文汉子往往被切分成多个token,因此需要对其进行中文词表扩展.思路通常是在中文语料库上训练一个中文tokenizer模型,然后将中文tokenizer与 ...
- 使用 C# 在Word中插入图表
Word中的图表功能将数据可视化地呈现在文档中.这为展示数据和进行数据分析提供了一种方便且易于使用的工具,使作者能够以直观的方式传达信息.要通过C#代码来实现在Word中绘制图表,可以借助 Spire ...