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

思路:就是模拟一下,求每一个开始的非上升和非下降序列。然后求重复的数,由于求出来可能不会是我们想要的序列如22221122233

这样的话求出来的会是2222222 222222233,而我们想要的到的是112222,所以不能用普通的,而是用N*logN(当然也是因为数列太长),而我们得到的是1122222多处一个2这个2是11之前留下的,但是因为2比1大才留下,那么2一定会留在最长上升里面,所以2是会被算作重复的减掉。

代码:

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <map>
#define MAXN 100010
#define INF 1000000007
#define FI first
#define SE second
using namespace std;
int a[MAXN],f1[MAXN],f2[MAXN],d[MAXN];
int bs(int key,int len)
{
int l,r;
l = ,r = len;
while(l <= r)
{
int mid = (l+r)>>;
if(key >= f1[mid-] && key < f1[mid]) {
//puts("yes");
return mid;
}
else if(key < f1[mid]) r = mid-;
else
l = mid+;
}
}
int bx(int key,int len)
{
int l,r;
l = ,r = len;
while(l <= r)
{
int mid = (l+r)>>;
if(key <= f2[mid-] && key > f2[mid]) return mid;
else if(key > f2[mid]) r = mid-;
else
l = mid+;
}
}
int searchlap(int b[],int val,int len,int s,int t)
{
int l,r,mid;
l = s,r = t;
mid = (l+r)/;
if(b[l] == val && b[r] == val) return r-l+;
else if(l >= r) return ;
else if(b[mid] == val) return +searchlap(b,val,len,l,mid-)+searchlap(b,val,len,mid+,r);
else if(b[mid] > val) return searchlap(b,val,len,l,mid-);
else if(b[mid] < val) return searchlap(b,val,len,mid+,r);
}
int searchlap1(int b[],int val,int len,int s,int t)
{
int l,r,mid;
l = s,r = t;
mid = (l+r)/;
if(b[l] == val && b[r] == val) return r-l+;
else if(l >= r) return ;
else if(b[mid] == val) return +searchlap1(b,val,len,l,mid-)+searchlap1(b,val,len,mid+,r);
else if(val > b[mid]) return searchlap1(b,val,len,l,mid-);
else if (b[mid] > val)return searchlap1(b,val,len,mid+,r);
}
int main()
{
int ncase,n,ans,i,j;
//freopen("text.txt","r",stdin);
scanf("%d",&ncase);
while(ncase--)
{
ans=;
scanf("%d",&n);
int len1,len2;
for( i=;i<n;++i) scanf("%d",&a[i]);
f1[] = -;
f2[] = ;
len1 = len2 = ;
int nowl1,nowl2;
int cnt = ;
int lap1,lap2;
for(i = n-;i >= ;i--)
{
cnt++;
int k;
if(a[i] < f1[]) j = ;
else if(a[i] >= f1[len1]) len1++,j = len1;
else
{
j = bs(a[i],len1);
}
f1[j] = a[i];
lap1 = searchlap(f1,a[i],len1,,len1);
nowl1 = j;
if(a[i] > f2[]) j = ;
else if(a[i] <= f2[len2]) len2++,j=len2;
else
{
j = bx(a[i],len2);
}
f2[j] = a[i];
lap2 = searchlap1(f2,a[i],len2,,len2);
nowl2 = j;
ans = max(ans,nowl1+nowl2-min(lap1,lap2));
}
cout<<ans<<endl;
}
return ;
}

hdu4604 deque的更多相关文章

  1. HDU-4604 Deque DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4604 因为deque最后的数列是单调不降的,因此,我们可以枚举数列中的某个中间数Ai,如果从中间数Ai ...

  2. hdu4604 Deque(最长上升子序列变形)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4604 题意:一个含有n个数栈,每次取出一个数,可以把这个数放在deque(双向队列)首部,放在尾部,或 ...

  3. C++ std::deque

    std::deque template < class T, class Alloc = allocator > class deque; Double ended queue deque ...

  4. collections 模块(namedtuple, deque, Counter )

    基本介绍 我们都知道,Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型 ...

  5. vector、list、deque三者比较

    1.vector是一段连续的内存块,而deque是多个连续的内存块,list是所有数据元素分开保存,可以是任何两个元素都没有连续. 2.vector的查询性能最好,并且的末端增加数据也很好,除非它重新 ...

  6. STL之deque

    deque是一种优化了的,对序列两段进行添加和删除操作的基本序列容器.它允许较为快速的随机访问,但它不像vector把所有对象保存在一块连续的内存块,而是采用多个连续的存储块.向deque两段添加或删 ...

  7. Deque的部分成员函数 解析,关于这个类,百度有很多解析,唯独没有其函数介绍

    函数 描述 c.assign(beg,end) c.assign(n,elem) 将[beg; end)区间中的数据赋值给c. 将n个elem的拷贝赋值给c. c.at(idx) 传回索引idx所指的 ...

  8. Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)

    Counter(计数器) 是一个字典的子类,存储形式同样为字典,其中存储的键为字典的元素,值为元素出现的次数,在使用之前我们需要先导入文件 import collections 初始化一个计数器 im ...

  9. 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)

    Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuq ...

随机推荐

  1. SEO网站优化方案

    学习许多前辈的经验,看到一些比较有价值的seo优化方案,特记录一下,对照自己的操作之路,新人也可借鉴一二,下面是从卢松松博客看到的文章.高手直接跳过,请勿喷水. 一个完整的SEO优化方案主要由四个小组 ...

  2. POJ 1001 Exponentiation(JAVA,BigDecimal->String)

    题目 计算实数a的n次方,具体输出格式看案例 import java.util.*; import java.math.*; public class Main { public static voi ...

  3. (转)約瑟夫問題的兩個O(log n)解法

    約瑟夫問題的兩個O(log n)解法 這個是學習編程時的一個耳熟能詳的問題了: n個人(編號爲0,1,...,n-1)圍成一個圈子,從0號開始依次報數,每數到第m個人,這個人就得自殺, 之後從下個人開 ...

  4. http协议本身能获取客户端Mac地址问题

    http 位于网络应用程 应用层 会话层 表示层 传输层 网络层 数据链路层 物理层 数据在最高层开始传输 没经历下面一层加一层的头,然后传入目的电脑再进行一层层的解刨,所以http本来没有mac而接 ...

  5. poj 3662(经典最短路)

    题目链接:http://poj.org/problem?id=3662 思路:这题较多的有两种做法: 方法1:二分枚举最大边长limit,如果图中的边大于limit,则将图中的边当作1,表示免费使用一 ...

  6. mysql之select(二)

    union 联合 作用: 把2次或多次查询结果合并起来. 要求:两次查询的列数一致.推荐:查询的每一列,相对应得列类型也一样. 可以来自于多张表.多次sql语句取出的列名可以不一致,此时,以第1个sq ...

  7. 用Python+Django在Eclipse环境下开发web网站【转】

    一.创建一个项目如果这是你第一次使用Django,那么你必须进行一些初始设置.也就是通过自动生成代码来建立一个Django项目--一个Django项目的设置集,包含了数据库配置.Django详细选项设 ...

  8. sql server 2008 评估期已过期解决办法

    开始-->所有程序-->Microsoft SQL Server 2008-->配置工具-->SQL Server 安装中心-->维护-->版本升级,接着按照提示一 ...

  9. 叠罗汉II

    叠罗汉是一个著名的游戏,游戏中一个人要站在另一个人的肩膀上.为了使叠成的罗汉更稳固,我们应该让上面的人比下面的人更轻一点.现在一个马戏团要表演这个节目,为了视觉效果,我们还要求下面的人的身高比上面的人 ...

  10. Android核心分析之十八Android电话系统之RIL-Java

    Android RIL-Java 123.jpg (2.09 KB, 下载次数: 1) 下载附件  保存到相册 2012-3-21 10:47 上传   RIL-Java在本质上就是一个RIL代理,起 ...