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 ...
随机推荐
- mysql的用户管理和权限控制
1.创建用户用 create user '用户名' @ 'localhost' identified by '密码'; 这串代码是创建当地用,是这台电脑的用户,因为有个localhost: creat ...
- .NET微信网页开发之通过UnionID机制解决多应用用户帐号统一问题
背景 随着公司微信相关业务场景的不断拓展,从最初的一个微信移动应用.然后发展成微信公众号应用.然后又有了微信小程序应用.但是随着应用的拓展,如何保证相同用户的微信用户在不同应用中登录的同一个账号呢?今 ...
- wife-wife【原型链污染】
wife-wife[原型链污染][难度:4] 题目界面 登录界面 注册界面 思路:在注册界面,利用原型链污染漏洞,获得管理员权限. 步骤 在注册界面输入用户名-密码-邀请码,勾选admin选项,抓包 ...
- pytest框架学习-fixture
一.fixture是什么 被@pytest.fixture()装饰器装饰的函数就是一个fixture,fixture可以灵活的为不同范围的测试用例提供前置和后置操作,以及向测试用例传递测试数据. 二. ...
- 【GIT-精讲】从零玩转Git-基础理论
关于版本控制 一.什么是版本控制 版本控制(Version Control Systems)版本控制(Revision control)是一种软件工程技巧 在开发的过程中,确保由不同人所编辑的同一档案 ...
- vulntarget-d-wp
vulntarget-d 配置信息 系统 ip kali 192.168.130.5 ubuntu 18 ip1: 192.168.130.8 ip2: 10.0.10.1 win7 10.0.10. ...
- CodeForces 1453D 概率 期望
CodeForces 1453D Checkpoints 概率 期望 原题链接 题意 现在我们可以设计n个擂台,有的是激活点,有的不是.从第一个开始挑战,每次都有1/2的概率成功,如果该点成功,则跳到 ...
- 【菜鸟必看】stm32定时器的妙用
摘要:本文为你带来关于stm32定时器的使用的便利和优势之处. 使用定时器去计算获取一条的时间 一.初步了解定时器 stm32定时器时钟图如下: 定时器2-7:普通定时器定时器1.8:高级定时器 二. ...
- MySQL数据库事务隔离性的实现
摘要:事实上在数据库引擎的实现中并不能实现完全的事务隔离,比如串行化. 本文分享自华为云社区<[数据库事务与锁机制]- 事务隔离的实现>,原文作者:技术火炬手 . 事实上在数据库引擎的实现 ...
- 解析数仓lazyagg查询重写优化规则
摘要:为了降低调优难度,提升产品易用性,GaussDB(DWS)提供了lazyagg查询重写优化规则. 本文分享自华为云社区<GaussDB(DWS) lazyagg查询重写优化解析[这次高斯不 ...