题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4604

  因为deque最后的数列是单调不降的,因此,我们可以枚举数列中的某个中间数Ai,如果从中间数Ai开始,如果后面的要和这个中间数形成单调不降的序列,那么后面的数必须是单调不降或者单调不升的序列,才能进入deque中,因此为两者长度的和,这就是一个LIS的DP。然后枚举的时候从后往前枚举,复杂度O( n*log n)。这里要注意一点,存在相同元素,因此需要减去两个里面出现Ai次数的最小值!

 //STATUS:C++_AC_281MS_3768KB
#include <functional>
#include <algorithm>
#include <iostream>
//#include <ext/rope>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
//using namespace __gnu_cxx;
//define
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define PI acos(-1.0)
//typedef
typedef __int64 LL;
typedef unsigned __int64 ULL;
//const
const int N=;
//const LL INF=0x3f3f3f3f;
//const int MOD=1000000007,STA=8000010;
const LL LNF=1LL<<;
const double EPS=1e-;
const double OO=1e15;
const int dx[]={-,,,};
const int dy[]={,,,-};
const int day[]={,,,,,,,,,,,,};
//Daily Use ...
inline int sign(double x){return (x>EPS)-(x<-EPS);}
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
//End int num[N];
int fup[N],fdown[N],dup[N],ddown[N];
int wup[N],wdown[N],cntup[N],cntdown[N];
int upk,downk;
int T,n; int search_up(int *d,int l,int r,int tar)
{
int mid;
while(l<r){
mid=(l+r)>>;
if(d[mid]<=tar)l=mid+;
else r=mid;
}
return l;
} int search_down(int *d,int l,int r,int tar)
{
int mid;
while(l<r){
mid=(l+r)>>;
if(d[mid]>=tar)l=mid+;
else r=mid;
}
return l;
} int main()
{
// freopen("in.txt","r",stdin);
int i,j,hig,w;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=;i<=n;i++){
scanf("%d",&num[i]);
}
upk=downk=;
dup[]=0x7fffffff,ddown[]=0x80000000;
hig=;
for(i=n;i>=;i--){
w=search_up(dup,,upk,num[i]);
if(w== || num[i]!=dup[w-])cntup[i]=;
else cntup[i]=cntup[wup[w-]]+;
dup[w]=num[i];wup[w]=i;
fup[i]=w;
upk=Max(upk,w+);
w=search_down(ddown,,downk,num[i]);
if(w== || num[i]!=ddown[w-])cntdown[i]=;
else cntdown[i]=cntdown[wdown[w-]]+;
ddown[w]=num[i];wdown[w]=i;
fdown[i]=w;
downk=Max(downk,w+); hig=Max(hig,fup[i]+fdown[i]-Min(cntup[i],cntdown[i]));
} printf("%d\n",hig);
}
return ;
}

HDU-4604 Deque DP的更多相关文章

  1. HDU 4604 Deque 最长子序列

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4604 Deque Time Limit: 4000/2000 MS (Java/Others)     ...

  2. hdu 4604 Deque

    http://acm.hdu.edu.cn/showproblem.php?pid=4604 将原数组根据其大小关系处理后 使其大小全在10^5内 处理后为 a1,a2,a3.....an 最优deq ...

  3. HDU 4604 Deque 二分最长上升子序列

    题目大意就是给一个deque 然后有n个数,依次进行操作,每种操作,你可以把这个数放在deque首部,也可以放在尾部,也可以扔掉不管,但是要保证deque中的数是非递减的.最要求deque中最长能是多 ...

  4. hdu 4604 Deque(最长上升与下降子序列-能够重复)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4604 这个题解有点问题,暂时没时间改,还是参考别人的吧 #include <cstdio> ...

  5. HDU 4604 deque 最长上升子序列

    枚举每个位置,求以num[i]为起点的最长不下降子序列和以num[i]为结尾的最长不递增子序列. 并且把相同值的个数统计一下,最后要减去算重复了的. 比如: 1 9 4 4 2 2 2 3 3 3 7 ...

  6. HDU 4604 Deque(最长上升子序)

    题目链接 本来就对N*log(N)算法不大会....然后各种跪了,求出最长不下降+最长不上升-最少相同元素.求相同元素,用二分求上界搞的.代码里4个二分.... #include <cstdio ...

  7. hdu 4604 Deque(最长不下降子序列)

    从后向前对已搜点做两遍LIS(最长不下降子序列),分别求出已搜点的最长递增.递减子序列长度.这样一直搜到第一个点,就得到了整个序列的最长递增.递减子序列的长度,即最长递减子序列在前,最长递增子序列在后 ...

  8. hdu 4123 树形DP+RMQ

    http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...

  9. hdu 4507 数位dp(求和,求平方和)

    http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...

  10. hdu 3709 数字dp(小思)

    http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...

随机推荐

  1. [笨木头FireFly01]入门篇1·最简单的服务端和客户端连接

    原地址:http://www.9miao.com/question-15-53938.html 最近一直在写游戏,几乎没有来写教程了,打算放慢一下脚步,学学新东西.那为嘛我要学FireFly呢? 之前 ...

  2. 安卓 DevOps:从一次推送命令到生产

    DevOps 是一种广为人知的活动,其主要目的是使软件交付自动化.的确,DevOps 的目标是持续测试.代码质量.功能开发和更轻松地进行维护更新.因此,DevOps 的终极目标之一是让开发者可以执行快 ...

  3. oracle 增加字段

    之前很多表增加很多相同的字段,一个一个添加太慢烦了,于是用了以下的方法alter table t_xmlc_batch_out_head_bak add ( SENDRECEIVEFLAG ) , S ...

  4. 拒绝卡顿——在WPF中使用多线程更新UI

    原文:拒绝卡顿--在WPF中使用多线程更新UI 有经验的程序员们都知道:不能在UI线程上进行耗时操作,那样会造成界面卡顿,如下就是一个简单的示例: public partial class MainW ...

  5. 208. Implement Trie (Prefix Tree)

    题目: Implement a trie with insert, search, and startsWith methods. 链接: http://leetcode.com/problems/i ...

  6. atoi函数的实现(考虑不同进制、溢出)

    2013-07-08 16:21:15 atio就是将ASCII码表示的字符为int型数据,看似简单的问题,实际上需要考虑的很多.对于简单的问题,考虑是否全面就显得特别重要. 小结: 对于该函数的实现 ...

  7. annotatedClasses和component-scan冲突吗

    annotatedClasses:配置在sessionFactory下面表示的是,哪些实体需要映射,代码如下: <bean id="sessionFactory" class ...

  8. memcpy与memmove区别

    头文件:#include <string.h> memmove() 用来复制内存内容,其原型为:    void * memmove(void *dest, const void *src ...

  9. Javascript获取最近若干个月

    整理: 如果需要获取最近若干个月,牵扯到跨年的话,该怎么实现的问题,抽了点时间,代码如下: /**纪元时间获取最近12个月 * * @num 传入获取月的数目 **/ (function getMon ...

  10. Microsoft强大团队(源代码)管理工具--TFS2010 与vs结合

    今天看了与vs 集成原理工具 TFS 2010, 角色分配.项目管理.开发源代码管理.任务分配管理.测试文档管理及跟踪等管理流程.代码版本的分支与合并等等,功能好强大啊. 以下将其安装配置简要介绍(以 ...