BZOJ_P3100 排列(单调栈)
2016-03-14 19:44
375 查看
BZOJ传送门
Time Limit: 10 Sec Memory Limit: 16 MB
Submit: 430 Solved: 120
[Submit][Status][Discuss]
Description
给定一个长度为n的序列a,选取连续的一段使其为1~k的一个排列。
求k的最大值。
Input
输入的第一行包含一个整数n。接下来n个数描述序列a
Output
输出一个整数表示k的最大值。
Sample Input
5
1 2 3 4 5
Sample Output
5
HINT
100%数据满足:1<=N<=1000000,1 <= ai <=n
Source
stk单调最大值
Time Limit: 10 Sec Memory Limit: 16 MB
Submit: 430 Solved: 120
[Submit][Status][Discuss]
Description
给定一个长度为n的序列a,选取连续的一段使其为1~k的一个排列。
求k的最大值。
Input
输入的第一行包含一个整数n。接下来n个数描述序列a
Output
输出一个整数表示k的最大值。
Sample Input
5
1 2 3 4 5
Sample Output
5
HINT
100%数据满足:1<=N<=1000000,1 <= ai <=n
Source
stk单调最大值
#include<cstdio> #include<iostream> using namespace std; #define N 1000005 int stk ,a ,tp ,n,s,ans,l,r; inline int in(int x=0,char ch=getchar()){while(ch>'9'||ch<'0') ch=getchar(); while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x;} inline void Check(int l,int r,int ll){if(ll>r) return;if(a[ll]>ans&&r-l+1>=a[ll]) ans=a[ll];} int main(){ n=in();stk[r+1]=N; for(int i=1;i<=n;i++){ a[i]=in(); s=max(tp[a[i]]+1,s); while(tp[a[i]]>=stk[l]) Check(stk[l]+1,i-1,stk[l+1]),l++; while(l<=r&&a[i]>=a[stk[r]]) Check(max(s,stk[r-1]+1),i-1,stk[r]),r--; tp[a[i]]=i,stk[++r]=i,stk[r+1]=N,Check(s,i,stk[l]); } while(l<=r) Check(stk[l]+1,n,stk[l+1]),l++; printf("%d\n",ans); }
相关文章推荐
- [C++] 强制类型转换static_cast、dynamic_cast、reinterpret_cast和const_cast
- autofac如何注册静态方法里的接口对象
- DataAnnotationsModelValidator-基于数据注解方式的model验证器
- autofac如何注册静态方法里的接口对象
- 【MVC框架系列】(一)——Struts,让我把你看得明明白白
- Java.作业2 myClass
- Xposed获取微信用户名密码
- iOS-绘图系统相关学习笔记(一)
- ffmpeg用法及如何使用fluent-ffmpeg
- B树与B+树
- 剑指offer——替换空格 C++
- 我理解的希尔排序
- note during using the redhat
- RethinnkDB, Flask, Backbone.js
- LightOJ 1370 Bi-shoe and Phi-shoe(素数筛)
- 游戏服务器开发和维护的一些经验
- 作业二:编写一个自动生成四则运算的程序
- python的reduce函数
- nyoj 过河问题 贪心
- 开始自己的博客