题意:求一段序列中删掉L个连续元素后的LIS。

解法:我的想法很复杂= =怎么说呢……首先用nlogn的方法求LIS得到的序列dp的第i项的意义为上升子序列所有长度为i的序列结尾元素的最小值,那么先倒着用nlogn的方法求一遍最长下降子序列记为dp1,记录每一步怎么更新的dp1,再正着求一遍最长上升子序列,每次看a[i]的时候二分的在i+k到结尾的dp1中找第一个比a[i]大的数设为dp1[pos],所以当前枚举的答案即为以a[i]作为结尾的最长上升子序列+后一段以dp1[pos]开头的最长上升子序列……枚举1~n-l,就可以得到答案了TUT……

总之很艰辛……二分废又得找队友帮忙手写二分什么的……

另一队的人提出用线段树算LIS……真·大神= =不懂怎么转移的方程……

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
int inf = 1000000005;
using namespace std;
int a[100005];
LL dp1[100005], dp2[100005];
struct node
{bool isnew;int pos;int pre;
}note[100005];
bool cmp(int a, int b)
{return a > b;
}
template <class T>
int rupper_bound(T *a, T *end, T key) {int n = end - a;if(n == 0) return INT_MAX;if (a[n-1] > key) return n-1;if (a[0] <= key) return INT_MAX;int l = 0, r = n - 1;while(r - l > 1) {int m = (l+r) >> 1;if (a[m] > key) l = m;else r = m;}return l;
}
int main()
{int T;scanf("%d", &T);int cse = 1;while(T--){int n, l;scanf("%d%d", &n, &l);for(int i = 1; i <= n; i++)scanf("%d", &a[i]);a[0] = -inf;int max1 = 0, max2 = 0;for(int i = n; i > l; i--){int pos = upper_bound(dp1, dp1 + max1, a[i], cmp) - dp1;if(pos == max1){note[i].isnew = 1;note[i].pos = max1;dp1[max1++] = a[i];}else{note[i].isnew = 0;note[i].pos = pos;note[i].pre = dp1[pos];dp1[pos] = a[i];}}int ans = 0;LL s = -inf;int len = 0;for(int i = 1; i <= n - l + 1; i++){int pos = rupper_bound(dp1, dp1 + max1, s);if(pos == INT_MAX) ans = max(ans, len);else ans = max(ans, pos + 1 + len);int x = upper_bound(dp2, dp2 + max2, a[i]) - dp2;if(x == max2){len = max2 + 1;s = a[i];dp2[max2++] = a[i];}else{len = x + 1;s = a[i];dp2[x] = a[i];}if(note[i + l].isnew){max1--;}else{dp1[note[i + l].pos] = note[i + l].pre;}}printf("Case #%d: %d\n", cse++, ans);}return 0;
}

  

转载于:https://www.cnblogs.com/Apro/p/4842540.html

HDU 5489 Removed Interval相关推荐

  1. 【HDU - 5489】Removed Interval(离散化,权值线段树,思维,最长上升子序列)

    题干: Given a sequence of numbers A=a1,a2,-,aNA=a1,a2,-,aN, a subsequence b1,b2,-,bkb1,b2,-,bk of AA i ...

  2. HDU  4343 Interval query

    HDU 4343 Interval query 题目给定nn个区间(li,ri),1≤i≤n(l_i,r_i),1\leq i\leq n MM次询问.询问在区间[L,R][L,R]上,有多少个互不相 ...

  3. hdu5489 Removed Interval dp+线段树优化

    现在看这题居然直接秒了...去年看的时候还以为神题.. 设以第i项为结尾的lis前缀为f[i],以第j项为结尾的lis后缀为g[i],如果求出f[i]和g[j],然后枚举i,快速找到最大的满足a[j] ...

  4. 【HDU 4343】Interval query(倍增)

    BUPT2017 wintertraining(15) #8D 题意 给你x轴上的N个线段,M次查询,每次问你[l,r]区间里最多有多少个不相交的线段.(0<N, M<=100000) 限 ...

  5. 2015 ACM/ICPC Asia Regional Hefei Online题解

    以下所有AC题解程序来自"仙客传奇"团队. A. Monitor the Alpacas B. The Relationship in Club C. Difference of ...

  6. Masonry 布局tag标签(4343排列)

    广告 欢迎大家一起交流 QQ群 139852091 公众号 我是jpg 效果 image.png demo // TagAppDto dto; // List<TagAppDto> dto ...

  7. HDU 4343 Interval query 倍增思想, DP

    题目大意: 就是现在给出N个区间(纠结了一下应该都是开区间), 区间(l, r)满足两边端点都是不超过10^9的非负整数, 现在有M次询问, 每次询问区间(L, R)中最多可以找出多少个区间(来自于N ...

  8. hdu 4343 Interval query

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4343 题目大意:求区间最多有多少不相交线段. 题目思路:先用倍增思想求出dp[i][j]表示左端点为j ...

  9. HDU 4343 Interval query(倍增思想+贪心)

     题意:给定n(n<=100000)个区间(左闭右开)和m(m<=100000)次询问[l, r],问所有在[l, r]区间内最多有多少个两两不相交的区间., 思路:首先贪心的思想,去 ...

最新文章

  1. 在报文摘要算法MD5中,首先要进行明文分组与填充,其中分组时明文报文摘要按照(42)位分组。【答案】C
  2. 可以在没有main()的情况下编写C程序吗?
  3. 前端学习(2223):react之jsx的样式和注释(2)
  4. 电脑有回声_电脑连接麦克风有回音怎么办?麦克风回声的解决方法
  5. 容器编排技术 -- Kubernetes kubectl create service loadbalancer 命令详解
  6. java dojo_Dojo入门三种HelloWorld!
  7. NATSserver配置具体解释
  8. rest功能java,java – 功能翻转REST端点的注释
  9. 转载【C++】int转换为string的两种方法(to_string、字符串流)
  10. 雷达卫星测高原理、最新发展情况
  11. 回复 Timer008 的一个类型转换的问题 - 不是很典型, 对其他人参考价值不大
  12. pandas读取csv文件数据并对数据求和使用matplotlib画饼图
  13. charles windows版使用教程
  14. camshift算法的应用
  15. 解决apicloud中真机同步海马玩模拟器中每次都要升级apploader的问题
  16. python银行卡号识别_EAST+CRNN银行卡号识别,附数据集
  17. python 双冒号_python双冒号
  18. 鹏业安装算量软件支架计算
  19. 吴恩达:机器学习的六个核心算法
  20. 免费的虚拟主机 000webhost

热门文章

  1. npm教程:使用nrm切换镜像源
  2. Python3位运算符
  3. eureka源码:开启服务注册
  4. Netty使用protobuf进行消息编解码代码示例
  5. Spring Cloud Alibaba基础教程:Nacos 生产级版本 0.8.0
  6. java调试jdk源码_JDK源码调试
  7. ubuntu java 全屏显示_java 在ubuntu下实现全屏,上面的状态栏依然显示。如下图,不想要上面的状态栏...
  8. 一文总结:抽象类(abstract)与接口(interface)的特点和代码展示
  9. MySQL / 可重复读到底是怎么实现的?图解 ReadView 机制
  10. linux 控制网卡流量,如何管理和控制多网卡 Linux 虚拟机的流量走向