HDU 4604 Deque(最长上升子序)

时间:2022-03-03 09:34:10

题目链接

本来就对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&lpar;最长上升与下降子序列-能够重复&rpar;

    题目链接: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&plus;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. UIDynamic&lpar;简单介绍&rpar;

    一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如:重力.弹性碰撞等现 ...

  2. Yii2&period;0 URL美化

    1. 程序初始化注册文件,加入如下: 'urlManager' =>[ 'class' => 'yii\web\UrlManager', 'showScriptName' =>fal ...

  3. JAVA&excl; static什么作用&quest;

    是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只 ...

  4. Java编程思想(1)

    0:什么是JavaEE Java技术是个平台,在这个平台上跳舞 1:开发环境的搭建 jdk1.7.* JAVA_HOME  jdk的安装路径 如:C:\Java\jdk1.7.0_72 PATH:%J ...

  5. 变形属性 transform

    transform功能可以实现文字或图像的旋转.绽放.倾斜.与移动: 注意点:1.其移动.旋转.倾斜.与绽放这4种效果的使用先后顺序不同,页面会显示不同的结果: 2.属性值有一个参数与有多个参数的别: ...

  6. Linux唤醒抢占----Linux进程的管理与调度&lpar;二十三)

    1. 唤醒抢占 当在try_to_wake_up/wake_up_process和wake_up_new_task中唤醒进程时, 内核使用全局check_preempt_curr看看是否进程可以抢占当 ...

  7. ActivityThread

    /** * This manages the execution of the main thread in an * application process, scheduling and exec ...

  8. leecode第五十四题(螺旋矩阵)

    class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) ...

  9. 每天CSS学习之text-align

    text-align是CSS的一个属性,其作用是设置文本的对齐方式.其值如下所示: 1.left:文本左对齐.如下所示: div{ text-align:left; } 结果: 2.right:文本右 ...

  10. JS日期转换

    用js将从后台得到的时间戳(毫秒数)转换为想要的日期格式 得到后台从数据库中拿到的数据我们希望格式是 2016年10月25日 17时37分30秒 或者 2016/10/25 17:37:30 然而我们 ...