51NOD 1952 栈 【单调队列】
来源:互联网 发布:辐射4女角色捏脸数据 编辑:程序博客网 时间:2024/06/05 18:57
传送门
动态维护一个非严格单调递增队列即可
这样队列尾就是最大值
每个元素只可能进出队列各一次
O(n)
#include<stdio.h>#include<bits/stdc++.h>#define ll long long#define pii pair<int,int>#define pll pair<ll,ll>#define MEM(a,x) memset(a,x,sizeof(a))#define lowbit(x) ((x)&-(x))using namespace std;const int INF = 1e9+7;const int inf=INF;struct S{ deque<int>que;//原数据 deque<int>incrQue;//非严格单调递增队列 void init(){ que.clear(); incrQue.clear(); } void push_back(int x){ que.push_back(x); if(incrQue.empty()||x>=incrQue.back()){ incrQue.push_back(x); } } void push_front(int x){ que.push_front(x); while(!incrQue.empty()&&incrQue.front()<x){ incrQue.pop_front(); } incrQue.push_front(x); } void pop_back(){ if(que.back()==incrQue.back()){ incrQue.pop_back(); } que.pop_back(); } int maxVal(){ return incrQue.back(); } int size()const{ return que.size(); }}myStack;int main(){ //freopen("/home/lu/code/r.txt","r",stdin); //freopen("/home/lu/code/w.txt","w",stdout); int n,A,B,C,x0,a,b,MOD; while(~scanf("%d%d%d%d%d%d%d%d",&n,&A,&B,&C,&x0,&a,&b,&MOD)){ myStack.init(); int ans=0; int ta,tb; for(int i=1;i<=n;++i){ int xi=((ll)x0*a+b)%MOD; if(xi%(A+B+C)<A||myStack.size()<=1){ ta=0; tb=xi; } else{ if(A<=xi%(A+B+C)&&xi%(A+B+C)<A+B){ ta=1; tb=xi; } else{ if(A+B<=xi%(A+B+C)){ ta=2; } } } switch (ta) { case 0: myStack.push_back(tb); break; case 1: myStack.push_front(tb); break; case 2: myStack.pop_back(); default: break; } ans=(ans+myStack.maxVal())%inf; x0=xi; } printf("%d\n",ans); } return 0;}
阅读全文
0 0
- 51NOD 1952 栈 【单调队列】
- 51nod 1952 栈【单调队列】
- [单调队列]51 Nod 1952——栈
- 51Nod - 1050 单调队列
- 51Nod - 1272 单调队列 + 二分
- [分治 || 单调栈 单调队列] 51Nod 1215 数组的宽度
- 51nod 1102 单调栈
- 51nod 1102 【单调栈】
- 51Nod - 1102 单调栈
- 51nod 1102单调栈
- 51nod 1275:连续子段的差异 单调队列
- 51nod-1275 连续子段的差异(单调队列)
- [单调队列] 51Nod 1275 连续子段的差异
- 【单调队列】51nod 1275 连续子段的差异
- 51 nod 1275 连续子段的差异(单调队列)
- 51nod 1561 另一种括号序列 单调队列+hash+二分
- 【51Nod】1275 连续子段的差异 单调队列
- 单调栈 单调队列
- 程序员把妹从入门到精通(一)
- bzoj1977 [BeiJing2010]次小生成树 Tree(kruskal+树上倍增)
- LED_1_1(流水灯)
- HDU1251(静态维护字典树模板题)
- c++设计一个分数类。要求:1.分类包含的分数运算有:连个分数的加、减、乘、除运算。
- 51NOD 1952 栈 【单调队列】
- 计算组合数的几种方法
- 真真感受到了c语言的古老!
- [总结]----Hive数据导入 六种方式
- 【Python】【matplotlib】绘图
- 测试工程师之bug的定位
- cocos2dx luabinding C/C++/LUA部分
- 符号配对
- sublime text 3 教程(2)