干掉了去年天津赛区的一道题,还是很爽的,去年用双向链表没有做出来,今年用双端队列做出来了。
想法非常简单,把整个序列切成三段,左边一段,L-R一段,右边一段,这样移动指针就是队列之间把队头/队尾元素互相踢来踢去的问题了。增加删除元素都很简单,至于反转,只需要用一个bool记录当前是否是反转状态,然后在增加删除移动时分类讨论即可。
双端队列在STL里有,我用了STL里的是因为感觉手写不太好写,容易出错,毕竟前插可能还是挺麻烦的。记录一下deque的几个注意点:
首先要#include<deque>,然后声明就是STL声明: deque<int> q;
这个东西有一点比较好,就是它的迭代器是可以+1,+2……的,不用非得++,完全可以说l = q.begin()-1这样的话。
而且似乎还支持q[4]这样的访问,碉堡了……
哦还有就是它的q.begin() 未必和静态数组一样,不是说你在前面插了个元素q.push_front(v),之后q.begin()就往左移一个(--)了,它指不定跑哪儿去了,所以要重新取……
列举几个常用方法:
q.begin() 开头迭代器
q.end() 队尾迭代器,依旧是左闭右开,所以这个是空的
q.push_back(v) 在队尾加入v
q.push_front(v) 在队头加入v
q.front() 查询队头元素
q.back() 查询队尾元素
q.pop_front() 删掉队头元素
q.pop_back() 删掉队尾元素
之前RE了半天后来发现是q.begin()会乱动引起的,改了以后进入无限的PE,快疯了。后来才发现是每行末尾空格的问题,OJ不会每行末尾过滤空格,这一点还是要记住的,for输到最后一定要特判一下,别输出多余的空格……