HDU 5489 Removed Interval
题意:求一段序列中删掉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相关推荐
- 【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 ...
- 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]上,有多少个互不相 ...
- hdu5489 Removed Interval dp+线段树优化
现在看这题居然直接秒了...去年看的时候还以为神题.. 设以第i项为结尾的lis前缀为f[i],以第j项为结尾的lis后缀为g[i],如果求出f[i]和g[j],然后枚举i,快速找到最大的满足a[j] ...
- 【HDU 4343】Interval query(倍增)
BUPT2017 wintertraining(15) #8D 题意 给你x轴上的N个线段,M次查询,每次问你[l,r]区间里最多有多少个不相交的线段.(0<N, M<=100000) 限 ...
- 2015 ACM/ICPC Asia Regional Hefei Online题解
以下所有AC题解程序来自"仙客传奇"团队. A. Monitor the Alpacas B. The Relationship in Club C. Difference of ...
- Masonry 布局tag标签(4343排列)
广告 欢迎大家一起交流 QQ群 139852091 公众号 我是jpg 效果 image.png demo // TagAppDto dto; // List<TagAppDto> dto ...
- HDU 4343 Interval query 倍增思想, DP
题目大意: 就是现在给出N个区间(纠结了一下应该都是开区间), 区间(l, r)满足两边端点都是不超过10^9的非负整数, 现在有M次询问, 每次询问区间(L, R)中最多可以找出多少个区间(来自于N ...
- hdu 4343 Interval query
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4343 题目大意:求区间最多有多少不相交线段. 题目思路:先用倍增思想求出dp[i][j]表示左端点为j ...
- HDU 4343 Interval query(倍增思想+贪心)
题意:给定n(n<=100000)个区间(左闭右开)和m(m<=100000)次询问[l, r],问所有在[l, r]区间内最多有多少个两两不相交的区间., 思路:首先贪心的思想,去 ...
最新文章
- 在报文摘要算法MD5中,首先要进行明文分组与填充,其中分组时明文报文摘要按照(42)位分组。【答案】C
- 可以在没有main()的情况下编写C程序吗?
- 前端学习(2223):react之jsx的样式和注释(2)
- 电脑有回声_电脑连接麦克风有回音怎么办?麦克风回声的解决方法
- 容器编排技术 -- Kubernetes kubectl create service loadbalancer 命令详解
- java dojo_Dojo入门三种HelloWorld!
- NATSserver配置具体解释
- rest功能java,java – 功能翻转REST端点的注释
- 转载【C++】int转换为string的两种方法(to_string、字符串流)
- 雷达卫星测高原理、最新发展情况
- 回复 Timer008 的一个类型转换的问题 - 不是很典型, 对其他人参考价值不大
- pandas读取csv文件数据并对数据求和使用matplotlib画饼图
- charles windows版使用教程
- camshift算法的应用
- 解决apicloud中真机同步海马玩模拟器中每次都要升级apploader的问题
- python银行卡号识别_EAST+CRNN银行卡号识别,附数据集
- python 双冒号_python双冒号
- 鹏业安装算量软件支架计算
- 吴恩达:机器学习的六个核心算法
- 免费的虚拟主机 000webhost
热门文章
- npm教程:使用nrm切换镜像源
- Python3位运算符
- eureka源码:开启服务注册
- Netty使用protobuf进行消息编解码代码示例
- Spring Cloud Alibaba基础教程:Nacos 生产级版本 0.8.0
- java调试jdk源码_JDK源码调试
- ubuntu java 全屏显示_java 在ubuntu下实现全屏,上面的状态栏依然显示。如下图,不想要上面的状态栏...
- 一文总结:抽象类(abstract)与接口(interface)的特点和代码展示
- MySQL / 可重复读到底是怎么实现的?图解 ReadView 机制
- linux 控制网卡流量,如何管理和控制多网卡 Linux 虚拟机的流量走向