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 ...
随机推荐
- Linux 磁盘的组成
基本结构 磁道,扇区,柱面和磁头数 硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等.每个盘片有两面,都可记录信息. 每个磁道被分成许多扇形的区域,每个区域叫一个 ...
- HDOJ 1075
字典树 9890974 2013-12-25 15:31:06 Accepted 1075 468MS 59832K 1342 B G++ 泽泽 #include<stdio.h> #in ...
- A PHP extension for Facebook's RocksDB
A PHP extension for Facebook's RocksDB 31 commits 2 branches 0 releases 2 contributors C++ 90.5% C 8 ...
- win7系统扩展双屏幕时,如何在两个屏幕下都显示任务栏
扩展屏幕下都显示任务栏!!! win7系统本身无法设置该功能(目前我是不知道) 但可以下载第三方软件来解决该问题. 第一步:Dual Monitor Taskbar 下载软件 下载链接:http:// ...
- ASP.NET MVC 的URL路由介绍
在这个教程中,向你介绍每个ASP.NET MVC一个重要的特点叫做URL路由.URL路由模块是负责映射从浏览器请求到特定的控制器动作. 在教程的第一部分,你将学习标准路由表如何映射到控制器的动作.在教 ...
- Subarray Sum & Maximum Size Subarray Sum Equals K
Subarray Sum Given an integer array, find a subarray where the sum of numbers is zero. Your code sho ...
- 【转】Spring Quartz的原理
Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便. 一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可. 1.Job 表示 ...
- 【转】php json_encode中文为空的解决办法
转自:http://www.cnblogs.com/oldphper/p/4123415.html 本文列举3个方法,实现json_encode()后的string显示中文问题. 做接口时不需要,但存 ...
- DroidDraw - Android的界面设计工具
ADT中的界面开发工具实在是很烂,通常情况下都需要硬编码,对于程序员来说不但效率比较低下,而且调试起来极其不方便,还好在Google未推出GUI的"所见即所得"的工具之前,我们找到 ...
- HDU 4310 Hero (贪心算法)
A - Hero Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Sta ...