HDU 4604
来源:互联网 发布:windows pe u盘版 iso 编辑:程序博客网 时间:2024/05/24 06:31
求双队列的最长非递减序列
考虑题目的一个简化版本:使双端队列单调上升。
找到队列中最早出现的数组Ax,则Ax将Q分成的两个部分分别是原序列中以Ax开始的最长上升子序列和最长下降子序列。
答案即为这两者之和的最大值,而对于本题,由于存在相同元素,所以只要找到以Ax为起点的最长不下降序列和最长不上升序列的和,
然后减去两个里面Ax次数的最小值。(比如1 2 3 1 1。最长不下降1 2 3,最长不上升1 1 1,只有开头的1被共用)
STL 的使用
upper_bound对从小到大排序的数组进行二分查找
equal_range其实就是upper-lower
#include<cstdio>#include<iostream>#include<vector>#include<algorithm>using namespace std;const int N=100002;int n,a[N],dp_up[N],dp_down[N],num_up[N],num_down[N];vector<int> v;vector<int>::iterator iter;void getdp(int dp[],int num[]){v.clear();v.push_back(a[n-1]);for(int i=n-2;i>=0;i--){int sz=v.size();if(a[i]>v[sz-1]){v.push_back(a[i]);dp[i]=sz+1;num[i]=1;}else if(a[i]==v[sz-1]){v.push_back(a[i]);dp[i]=sz+1;pair<vector<int>::iterator,vector<int>::iterator> bound;bound=equal_range(v.begin(),v.end(),a[i]);num[i]=bound.second-bound.first;}else{iter=upper_bound(v.begin(),v.end(),a[i]);dp[i]=iter-v.begin()+1;*iter=a[i];pair<vector<int>::iterator,vector<int>::iterator> bound;bound=equal_range(v.begin(),v.end(),a[i]);num[i]=bound.second-bound.first;}}}int main(){int tt,i,tmp;for(cin>>tt;tt>0;tt--){cin>>n;for(i=0;i<n;i++)scanf("%d",&a[i]);getdp(dp_down,num_down);for(int i=0;i<n;i++)a[i]=-a[i];getdp(dp_up,num_up);int ans=0;for(int i=0;i<n;i++){int tot=dp_up[i]+dp_down[i]-min(num_up[i],num_down[i]);if(tot>ans)ans=tot;}printf("%d\n",ans);}return 0;}不用动态数组实现
int stack[N],cnt;void getdp(int dp[],int num[]){//O(nlogn)cnt=0;stack[cnt++]=a[n-1];for(int i=n-2;i>=0;i--){if(a[i]>stack[cnt-1]){stack[cnt++]=a[i];dp[i]=cnt;num[i]=1;}else if(a[i]==stack[cnt-1]){stack[cnt++]=a[i];dp[i]=cnt;pair<int*,int*> bound;bound=equal_range(stack,stack+cnt,a[i]);num[i]=bound.second-bound.first;}else{int iter=upper_bound(stack,stack+cnt,a[i])-stack;dp[i]=iter+1;stack[iter]=a[i];pair<int*,int*> bound;bound=equal_range(stack,stack+cnt,a[i]);num[i]=bound.second-bound.first;}}}
0 0
- hdu 4604
- HDU 4604
- HDU 4604
- hdu 4604 Deque
- hdu 4604 二分+dp
- hdu 4604 2013多校
- hdu 4604 Deque
- HDU 4604 Deque
- Hdu 4604 DP
- HDU 4604 Deque
- HDU 4604 Deque
- HDU 4604 Deque
- hdu 4604 Deque
- hdu 4604 DP
- hdu 4604 Deque
- HDU 4604 lower_bound,LIS
- HDU 4604 Deque
- HDU 4604 (树状数组)
- Linux服务器rsync自动备份
- 深入浅出游戏算法(1)-配置opengl、glut在codeblocks和vs2012(3)
- 通过递归遍历n位2进制数的所有情况
- Linux、Windows、Mac文本文件转换
- 如何让你的Mac Lion朗读中文
- HDU 4604
- 基础练习 十六进制转十进制
- java关键字
- return返回空
- Linux下nginx生成日志自动切割
- 2014.2.3布局
- UVa:471 Magic Numbers
- 哎~老是忘发博客
- Linux下安装vnstat流量统计