题目链接

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

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int d[];
int dd[];
int f[];
int a[];
int same[];
int n;
int bin1(int size,int x)
{
int l = ,r = size-,mid;
while(l <= r)
{
mid = (l+r)/;
if(x >= f[mid-]&&x < f[mid])
return mid;
else if(x < f[mid]) r = mid-;
else l = mid + ;
}
return mid;
}
int binx(int size,int x)
{
int str = ,end = size-,mid;
while(str < end)
{
mid = (str+end)/;
if(f[mid] < x)
str = mid + ;
else
end = mid;
}
return str;
}
void LIS1()
{
int i,j,size = ,k;
f[] = a[];d[] = ;
same[] = ;
for(i = ;i < n;i ++)
{
if(a[i] < f[])
{
j = ;
k = ;
}
else if(a[i] >= f[size-])
{
j = size ++;
k = binx(size,a[i]);
}
else
{
j = bin1(size,a[i]);
k = binx(size,a[i]);
}
f[j] = a[i];d[i] = j + ;
same[i] = min(same[i],j-k+);
}
}
int bin2(int size,int x)
{
int l = ,r = size-,mid;
while(l <= r)
{
mid = (l+r)/;
if(x <= f[mid-]&&x > f[mid])
return mid;
else if(x > f[mid]) r = mid-;
else l = mid + ;
}
return mid;
}
int bins(int size,int x)
{
int str = ,end = size-,mid;
while(str < end)
{
mid = (str+end)/;
if(f[mid] > x)
str = mid + ;
else
end = mid;
}
return str;
}
void LIS2()
{
int i,j,size = ,k;
f[] = a[];d[] = ;
same[] = ;
for(i = ;i < n;i ++)
{
if(a[i] > f[])
{
j = ;
k = ;
}
else if(a[i] <= f[size-])
{
j = size ++;
k = bins(size,a[i]);
}
else
{
j = bin2(size,a[i]);
k = bins(size,a[i]);
}
f[j] = a[i];d[i] = j + ;
same[i] = min(same[i],j - k + );
}
}
int main()
{
int t,i;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i = ;i < n;i ++)
{
scanf("%d",&a[i]);
same[i] = ;
}
for(i = ;i < n/;i ++)
swap(a[i],a[n-i-]);
memset(d,,sizeof(d));
memset(f,,sizeof(f));
LIS1();
for(i = ;i < n;i ++)
{
dd[i] = d[i];
}
memset(d,,sizeof(d));
memset(f,,sizeof(f));
LIS2();
int maxz = ;
/*for(i = 0;i < n;i ++)
{
printf("%d ",dd[i]);
}
printf("\n");
for(i = 0;i < n;i ++)
{
printf("%d ",d[i]);
}
printf("\n");
for(i = 0;i < n;i ++)
{
printf("%d ",same[i]);
}
printf("\n");
*/
for(i = ;i < n;i ++)
maxz = max(maxz,dd[i]+d[i]-same[i]);
printf("%d\n",maxz);
}
return ;
}

HDU 4604 Deque(最长上升子序)的更多相关文章

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

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

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

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

  3. HDU 4352 区间的有多少个数字满足数字的每一位上的数组成的最长递增子序列为K(数位DP+LIS)

    题目:区间的有多少个数字满足数字的每一位上的数组成的最长递增子序列为K 思路:用dp[i][state][j]表示到第i位状态为state,最长上升序列的长度为k的方案数.那么只要模拟nlogn写法的 ...

  4. HDU 4604 Deque 最长子序列

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

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

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

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

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

  7. hdu 4604 Deque

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

  8. 使用后缀数组寻找最长公共子字符串JavaScript版

    后缀数组很久很久以前就出现了,具体的概念读者自行搜索,小菜仅略知一二,不便讨论. 本文通过寻找两个字符串的最长公共子字符串,演示了后缀数组的经典应用. 首先需要说明,小菜实现的这个后缀数组算法,并非标 ...

  9. hdu1003 最大连续子序和

    Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub ...

随机推荐

  1. 用Python操纵MySQL

    本例用Python操纵MySQL,从指定文件读取数据,并对数据进行处理,处理之后批量插入MySQL. 贴上代码: # -*- coding: gbk -*- import re import MySQ ...

  2. 【Django】Django 如何实现 如下 联表 JOIN 查询?

    SQL语句: select distinct a.device_hash, sum(b.cmn_merge_count) from (select distinct device_hash from ...

  3. 【云计算】docker build如何支持参数化构建?

    docker 1.9.0版本之后,已经支持docker build参数化构建. docker 版本更新记录: github讨论: 参开资料: https://github.com/docker/doc ...

  4. Django的Context和RequestContext

    参考:http://www.dannysite.com/blog/38/ Django的模板渲染中,Context可以用来传递数据,一个Context是一系列变量和值的集合,它和Python的字典有点 ...

  5. 如何调试lua脚本

    首先感谢下ZeroBrane Studio. 这里拿cocos2dx/samples/Lua/HelloLua做例子来说明,其他的都是同样道理. 1.下载调试Lua所需的IDE,地址在这.有经济实力的 ...

  6. Android 和iOS 创建本地通知

    1 Android 中的发送本地通知的逻辑如下 先实例化Notification.Builder,再用builder创建出具体的Notification,创建时要指定好启动用的PendingInten ...

  7. 数据库路由器 ICX

    实时并发数据库事务处理同步复制器和负载平衡器    ———通向真正数据库高可用性,高可靠性,高性能之路 一.产品概述    数据库路由器--ICX是美国宾夕法尼亚大学计算机系施教授经过多年研究.开发出 ...

  8. codeforces A. Rook, Bishop and King 解题报告

    题目链接:http://codeforces.com/problemset/problem/370/A 题目意思:根据rook(每次可以移动垂直或水平的任意步数(>=1)),bishop(每次可 ...

  9. 原创centos7安装hadoop2.7(转载请注明出处)

    启用ip vi /etc/sysconfig/network-scripts/ifcfg-ONBOOT=yes 编辑DNS /etc/resolv.conf nameserver 114.114.11 ...

  10. Fresco 源码分析(二) Fresco客户端与服务端交互(2) Fresco.initializeDrawee()分析 续

    4.2.1.2 Fresco.initializeDrawee()的过程 续 继续上篇博客的分析Fresco.initializeDrawee() sDraweeControllerBuilderSu ...