http://acm.hdu.edu.cn/showproblem.php?pid=4604

将原数组根据其大小关系处理后 使其大小全在10^5内

处理后为 a1,a2,a3.....an

最优deque   b1,b2,b3....bm

先不考虑有相等的情况

假设bj在数组a中出现的最早 对应到a数组中为ai

那么从bj到bm为  以ai为起点到an的最长递增序列(必须包括ai) 用(ai,L)表示

以及从bj到b1为  以ai为起点到an的最长递减序列(必须包括ai)  用(ai,R)表示

但这样没有考虑b中有相等的情况 不过思路有了 剩下处理相等既可以了

把(ai,L)改为非递减  把(ai,R)改为非递增 最后把重复加的减掉 这样又会出错 比如说 a(1,1,2,1,1)

所以在把(ai,L)改为非递减  把(ai,R)改为非递增后    要枚举(ai,L)+(以一个比ai小的数为端点,R) 和 (以一个比ai大的数为端点,L)+(ai,R) 两种情况

其中 一个比ai大/小的数 是在ai之后的数 要求是所以满足要求的数中使( ,L)/( ,R)最大的那个

剩下的是DP思想  需要用线段树优化(其它优化也可)

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<algorithm>
#include<queue>
#include<stdexcept>
#include<bitset>
#include<cassert>
#include<deque>
#include<numeric> using namespace std; typedef long long ll;
typedef unsigned int uint;
const double eps=1e-12;
const int INF=0x3f3f3f3f;
const ll MOD=1000000007;
const int N=100005;
struct node
{
int l,r,L,R;
}tree[N*4];
int num[N];
int a[N],b[N];
map<int,int>mt;
void dfsb(int x,int l,int r)
{
tree[x].l=l;
tree[x].r=r;
tree[x].L=0;
tree[x].R=0;
if(l==r) return ;
int mid=(l+r)>>1;
dfsb((x<<1),l,mid);
dfsb((x<<1)|1,mid+1,r);
}
void dfsm(int x,int l,int r,int &L,int &R)
{
if(l>r) return;
if(tree[x].l==l&&tree[x].r==r)
{
L=max(tree[x].L,L);
R=max(tree[x].R,R);
return ;
}
int mid=(tree[x].l+tree[x].r)>>1;
if(r<=mid)
dfsm((x<<1),l,r,L,R);
else if(l>mid)
dfsm((x<<1)|1,l,r,L,R);
else
{
dfsm((x<<1),l,mid,L,R);
dfsm((x<<1)|1,mid+1,r,L,R);
}
}
void dfsu(int x,int k,int L,int R)
{
tree[x].L=max(tree[x].L,L);
tree[x].R=max(tree[x].R,R);
if(tree[x].l==tree[x].r)
return ;
int mid=(tree[x].l+tree[x].r)>>1;
if(k<=mid)
dfsu((x<<1),k,L,R);
else
dfsu((x<<1)|1,k,L,R);
}
int solve(int *a,int n)
{
memset(num,0,sizeof(num));
int ans=0;
dfsb(1,1,n);
for(int i=n-1;i>=0;--i)
{
int k=a[i];
int L=0,R=0;
L=0;
dfsm(1,1,k,L,R);
int s1=L+1;
L=0;
dfsm(1,1,k-1,L,R);
int r1=L;
R=0;
dfsm(1,k,n,L,R);
int s2=R+1;
R=0;
dfsm(1,k+1,n,L,R);
int r2=R;
++num[k];
ans=max(ans,max(s1+r2,s2+r1));
dfsu(1,k,s1,s2);
}
return ans;
}
int main()
{
//freopen("data.in","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
mt.clear();
sort(b,b+n);
int l=0;
for(int i=0;i<n;++i)
{
if(i==0||b[i]!=b[i-1])
b[l++]=b[i];
}
int ln=l;
for(int i=0;i<ln;++i)
mt[b[i]]=i+1;
for(int i=0;i<n;++i)
a[i]=mt[a[i]];
printf("%d\n",solve(a,n));
}
return 0;
}

hdu 4604 Deque的更多相关文章

  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 这个题解有点问题,暂时没时间改,还是参考别人的吧 #include <cstdio> ...

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

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

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

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

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

  7. hdu 4604 动态规划

    思路:这题的感觉就是最长上升子序列的升级版.首先对于最长上升子序列要用n*log(n)的算法才行,这个复杂度的算法可以从hdu1025得到启发.然后就是什么情况下最优问题了.对于序列中某个数i,找出其 ...

  8. 【 2013 Multi-University Training Contest 1 】

    HDU 4602 Partition f[i]表示和为i的方案数.已知f[i]=2i-1. dp[i]表示和为i,k有多少个.那么dp[i]=dp[1]+dp[2]+...+dp[i-1]+f[i-k ...

  9. HDU 5818:Joint Stacks(stack + deque)

    http://acm.hdu.edu.cn/showproblem.php?pid=5818 Joint Stacks Problem Description   A stack is a data ...

随机推荐

  1. 04 SQL是关于集合的

    面向集合去思考 要想成为写SQL语句的高级专家, 最困难的是一个转变就是从面相过程的思维方式转变到面相集合的思维方式. 首先要停止那些一次处理一行数据的过程化步骤思维, 试着把思路转移到使用类似于 “ ...

  2. 用命令访问D:\python学习\wendjia教程\aa.py

    用命令访问D:\python学习\wendjia教程\aa.py d:                                -----------切换到D盘 cd python学习\wend ...

  3. 关于图片加载非常爽的一个三方控件 fresco,一个三fresco

    Hi  EveryBody 今天来玩一个非常爽的控件 fresco 到底有多爽呢 接着看就知道了 首先 来看看fresco 是个神马东西 https://github.com/facebook/fre ...

  4. Python语言及其应用 - 知识点遍历

    遍历python语法     2.基本元素:数字.字符串和变量 2.1 python有哪些基本类型? 布尔型(True, False),整型(42,100000),浮点型(3.14159,1.0e8) ...

  5. XP系统电脑带安卓手机上网教程(无需adhoc补丁)

    XP系统电脑带安卓手机上网教程(无需adhoc补丁) WIN7系统可以虚拟wifi热点,安卓手机连上这个热点就能上网.XP系统虚拟出来的wifi热点是adhoc形式的,原生的安卓系统并不支持adhoc ...

  6. Windows文本文件编码

    目录 1 ANSI编码    2 2 UTF16BE编码    2 3 UTF16LE编码    2 4 UTF-8编码    2 5 BOM    3 6 乱码    3 7 总结    5 如下图 ...

  7. 如何设计一个RPC系统

    版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qclou ...

  8. 界面显示这个时间格式的js代码: 2016年1月19日 星期二 乙未(羊)年 腊月初十

    today=new Date();function initArray(){ this.length=initArray.arguments.length for(var i=0;i<this. ...

  9. Java虚拟机类加载机制——案例分析

    转载: Java虚拟机类加载机制--案例分析   在<Java虚拟机类加载机制>一文中详细阐述了类加载的过程,并举了几个例子进行了简要分析,在文章的最后留了一个悬念给各位,这里来揭开这个悬 ...

  10. [redis] 征服Redis系列

    征服 Redis:简介+安装+调优+测试+主从+集群 征服 Redis + Jedis:简单Jedis+池化Jedis+集群Jedis 征服 Redis + Jedis + Spring (一)—— ...