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 ...
随机推荐
- 【Spring】Spring系列3之Spring AOP
3.Spring AOP 3.1.AOP概述 3.2.前置通知 3.3.后置通知 3.4.返回通知.异常通知.环绕通知 3.5.指定切面优先级 3.6.重用切入点表达式 3.7.引入通知 3.8.基于 ...
- Expected MultipartHttpServletRequest: is a MultipartResolver configured?
2015-05-05 19:09:47.510::WARN: /purchase/long-term-contract/uploading.htmjava.lang.IllegalArgumentEx ...
- Android PopupWindow 消失后的回掉方法
popupwindow 会在点击屏幕其他地方消失,但是这个消失时的回掉方法一直没有找到,困扰了一个多月,差了不少百度,没有很好解决,今天偶然看到了setOnDismissListener这个方法!没想 ...
- HDU4870 Rating(概率)
第一场多校,感觉自己都跳去看坑自己的题目里去了,很多自己可能会比较擅长一点的题目没看,然后写一下其中一道概率题的题解吧,感觉和自己前几天做的概率dp的思路是一样的.下面先来看题意:一个人有两个TC的账 ...
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- Heap:Expedition(POJ 2431)
远征队 题目大意:一部车要从一个地方走到另一个地方,开始的时候车的油箱有P升油,汽车每走1个距离消耗1升油,没有油汽车无法行驶,路上有加油站,可以为汽车加油,设汽车的油缸是无限大小的,问你汽车能否走到 ...
- NEFU 2016省赛演练一 I题 (模拟题)
这题没名字 Problem:I Time Limit:2000ms Memory Limit:65535K Description Now give you an interger m and a s ...
- LESS学习笔记1
个人理解:less是一个可以写函数的css
- css3学习总结9--CSS3过渡
CSS3 过渡 通过 CSS3,我们可以在不使用 Flash 动画或 JavaScript 的情况下,当元素从一种样式变换为另一种样式时为元素添加效果. 过渡属性 属性 描述 CSS transiti ...
- Linux多台服务器之间的文件共享
由于项目有个图片上传和导入导出的模块,所以当项目通过集群方式部署的时候就要考虑文件共享问题. 文件共享要么就是通过统一的文件系统来管理,要么就是在系统之间做文件共享,前者扩展性比较好,可以随时随地加服 ...