HDU 4604 Deque(最长上升子序)
本来就对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(最长上升子序)的更多相关文章
- hdu 4604 Deque(最长上升与下降子序列-能够重复)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4604 这个题解有点问题,暂时没时间改,还是参考别人的吧 #include <cstdio> ...
- HDU 4604 deque 最长上升子序列
枚举每个位置,求以num[i]为起点的最长不下降子序列和以num[i]为结尾的最长不递增子序列. 并且把相同值的个数统计一下,最后要减去算重复了的. 比如: 1 9 4 4 2 2 2 3 3 3 7 ...
- HDU 4352 区间的有多少个数字满足数字的每一位上的数组成的最长递增子序列为K(数位DP+LIS)
题目:区间的有多少个数字满足数字的每一位上的数组成的最长递增子序列为K 思路:用dp[i][state][j]表示到第i位状态为state,最长上升序列的长度为k的方案数.那么只要模拟nlogn写法的 ...
- HDU 4604 Deque 最长子序列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4604 Deque Time Limit: 4000/2000 MS (Java/Others) ...
- HDU 4604 Deque 二分最长上升子序列
题目大意就是给一个deque 然后有n个数,依次进行操作,每种操作,你可以把这个数放在deque首部,也可以放在尾部,也可以扔掉不管,但是要保证deque中的数是非递减的.最要求deque中最长能是多 ...
- hdu 4604 Deque(最长不下降子序列)
从后向前对已搜点做两遍LIS(最长不下降子序列),分别求出已搜点的最长递增.递减子序列长度.这样一直搜到第一个点,就得到了整个序列的最长递增.递减子序列的长度,即最长递减子序列在前,最长递增子序列在后 ...
- hdu 4604 Deque
http://acm.hdu.edu.cn/showproblem.php?pid=4604 将原数组根据其大小关系处理后 使其大小全在10^5内 处理后为 a1,a2,a3.....an 最优deq ...
- 使用后缀数组寻找最长公共子字符串JavaScript版
后缀数组很久很久以前就出现了,具体的概念读者自行搜索,小菜仅略知一二,不便讨论. 本文通过寻找两个字符串的最长公共子字符串,演示了后缀数组的经典应用. 首先需要说明,小菜实现的这个后缀数组算法,并非标 ...
- hdu1003 最大连续子序和
Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub ...
随机推荐
- Sphinx 增量索引更新
是基于PHP API调用,而不是基于sphinxSE.现在看来sphinxSE比API调用更简单的多,因为之前没有想过sphinxSE,现在先把API的弄明白.涉及到的:sphinx 数据源的设置,简 ...
- 算法:comparable比较器的排序原理实现(二叉树中序排序)
Comparable比较器排序远离实现 package test.java.api.api13; /** * 手工实现二叉树的比较算法: 第一遍感觉很神秘,但是真正自己写下来,就感觉很简单,理解就好: ...
- Google Code Jam 2014 Round 1B Problem B
二进制数位DP,涉及到数字的按位与操作. 查看官方解题报告 #include <cstdio> #include <cstdlib> #include <cstring& ...
- Android 和iOS中 View的滚动
在最近的程序中用到了Android中的View的滚动,记录一下,待总结.
- hdu 1425 sort 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1425 常规的方法是对输入的数从大到小进行排序(可以用sort或qsort),然后输出前m大的数. 不过 ...
- C/C++函数参数读取顺序2
#include <stdio.h>int main(){ int a=1,b=3,c=3; printf("%d, %d, %d",(a++,b++,c++),b,c ...
- ImageLoader实现图片异步加载
ImageLoader是一个广泛使用的图片库,在向网络请求图片时,使用imageView和smartView常会产生outofmemory错误,这时ImageLoader可以起到很大的作用,主要有如下 ...
- WMI
https://wiki.jenkins-ci.org/display/JENKINS/Windows+slaves+fail+to+start+via+DCOM#Windowsslavesfailt ...
- C#的面向对象特性之封装
在C#语言中,共有五种访问修饰符:public.private.protected.internal.protected internal. public 公有访问.不受任何限制.private 私有 ...
- MySQL常用的自带函数
MySQL自带函数十分丰富,合理使用可以减少很多编码工作. >>数学函数 数学函数主要用于处理数字,包括整型.浮点数等.数学函数包括绝对值函数.正弦函数.余弦函数.获取随机数的函数等.AB ...