考虑二分求LIS的过程,就是维护一个序列,其中第i个数表示长度为i的最小结尾,而插入操作就是查找第一个大于x的位置并替换掉

用线段树维护,二分的过程也可以用线段树来完成,对线段树可持久化即可

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 500005
4 #define mid (l+r>>1)
5 int B,V,n,p,x,y,r[N],ans[N],f[N*30],ls[N*30],rs[N*30];
6 int copy(int k){
7 f[++V]=f[k];
8 ls[V]=ls[k];
9 rs[V]=rs[k];
10 return V;
11 }
12 void build(int &k,int l,int r){
13 f[k=++V]=0x3f3f3f3f;
14 if (l==r){
15 if (!l)f[k]=-0x3f3f3f3f;
16 return;
17 }
18 build(ls[k],l,mid);
19 build(rs[k],mid+1,r);
20 f[k]=max(f[ls[k]],f[rs[k]]);
21 }
22 void update(int &k,int l,int r,int x,int y){
23 k=copy(k);
24 if (l==r){
25 f[k]=y;
26 return;
27 }
28 if (x<=mid)update(ls[k],l,mid,x,y);
29 else update(rs[k],mid+1,r,x,y);
30 f[k]=max(f[ls[k]],f[rs[k]]);
31 }
32 int query(int k,int l,int r,int x){
33 if (l==r)return l;
34 if (f[ls[k]]>x)return query(ls[k],l,mid,x);
35 return query(rs[k],mid+1,r,x);
36 }
37 int main(){
38 scanf("%d",&n);
39 build(r[0],0,n);
40 for(int i=1;i<=n;i++){
41 scanf("%d%d",&p,&x);
42 if (p)printf("%d\n",ans[B=x]);
43 else{
44 B++;
45 y=query(r[B]=r[B-1],0,n,x);
46 if (y)update(r[B],0,n,y,x);
47 printf("%d\n",ans[B]=max(ans[B-1],y));
48 }
49 }
50 }

[loj6088]可持久化最长不降子序列的更多相关文章

  1. HDU 1025-Constructing Roads In JGShining's Kingdom(最长不降子序列,线段树优化)

    分析: 最长不降子序列,n很大o(n^2)肯定超,想到了小明序列那个题用线段树维护前面的最大值即可 该题也可用二分搜索来做. 注意问题输出时的坑,路复数后加s #include <map> ...

  2. Codeforces Round #198 (Div. 2) D. Bubble Sort Graph (转化为最长非降子序列)

    D. Bubble Sort Graph time limit per test 1 second memory limit per test 256 megabytes input standard ...

  3. 最长非降子序列的O(n^2)解法

    这次我们来讲解一个叫做"最长非下降子序列"的问题及他的O(n^2)解法. 首先我们来描述一下什么是"最长非下降子序列". 给你一个长度为n的数组a,在数组a中顺 ...

  4. P1020 导弹拦截 (贪心+最长不降子序列)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  5. (最长不降子序列)最少拦截系统 -- hdu -- 1257

    http://acm.hdu.edu.cn/showproblem.php?pid=1257 最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  6. DP:凑零钱问题/最长非降子序列(C++)

    你给出一定数额的钱 i 元给我,我利用手中的硬币(m元, j元, k元...)兑换等值的钱给你,要求硬币数最少. 举例:给出1-11的钱,手中硬币有1元,3元,5元. 重点是找到状态和状态转移方程. ...

  7. hdu6537 /// DP 最长不降子序列->最长公共子序列

    题目大意: 给定一个字符串 字符为0~9 求翻转某个区间后使得串中的最长不降子序列最长 因为字符范围为0~9 假设有一个 0 1 2 3 4 5 6 7 8 9 的序列 此时翻转某个区间得到形如 0 ...

  8. 最长非降子序列的N*logN解法

    之前讲到过求最长非降子序列的O(N^2)解法. 链接 这次在原来的基础上介绍一下N*logN解法. 该解法主要是维护一个数组minValue,minValue[i]表示最长上身子序列长度为i的数的最小 ...

  9. bzoj1609 / P2896 [USACO08FEB]一起吃饭Eating Together(最长不降子序列)

    P2896 [USACO08FEB]一起吃饭Eating Together 显然的最长不升/降子序列,求出最长值,则答案为$n-$最长值(改掉剩下的). 复杂度$O(nlogn)$ (然鹅有神仙写了$ ...

随机推荐

  1. Java(46)类加载器

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201673.html 博客主页:https://www.cnblogs.com/testero ...

  2. vue.$set实现原理

    上源码: export function set (target: Array<any> | Object, key: any, val: any): any { if (process. ...

  3. 第四代富士X100F操作学习

    前言 本文为自己通过B站的UP主[阿布垃机手册]整理.原视频地址:[阿布垃机手册][布瞎BB]富士 X100F 相机外部按键 拍人像自己的设置 [X100F相机光圈大小支持F2到F16+Auto]光圈 ...

  4. Linux常用命令介绍(满足日常操作)

    大家好,今天来给大家分享一些Linux的常用命令,希望对大家有用 命令行的基本格式:   命令字 [选项] [参数]     其中,命令字.选项.参数之间用空格分开,多余的空格将被忽略.[ ]括起来的 ...

  5. 2021.9.21考试总结[NOIP模拟58]

    T1 lesson5! 开始以为是个无向图,直接不懂,跳去T2了. 之后有看了一眼发现可暴力,于是有了\(80pts\). 发现这个图是有拓扑序的,于是可以用拓扑排序找最长路径.先找原图内在最长路径上 ...

  6. DMA实现采样数据的直接搬运存储

    尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了. 找了不少例子参考,ADC和DMA的设置了解了个大概,并直接利用开发板来做一些实验来验证相关的操作 ...

  7. 【做题记录】[NOIP2011 提高组] 观光公交

    P1315 [NOIP2011 提高组] 观光公交 我们想在 \(k\) 次加速每一次都取当前最优的方案加速. 考虑怎样计算对于每一条边如果在当前情况下使用加速器能够使答案减少的大小. 如果当前到达某 ...

  8. Spring:所有依赖项注入的类型

    一.前言 Spring文档严格只定义了两种类型的注入:构造函数注入和setter注入.但是,还有更多的方式来注入依赖项,例如字段注入,查找方法注入.下面主要是讲使用Spring框架时可能发生的类型. ...

  9. Java并发:重入锁 ReentrantLock(一)

    ReentrantLock 是一种可重入的互斥锁,它不像 synchronized关键字一样支持隐式的重进入,但能够使一个线程(不同的方法)重复对资源的重复加锁而不受阻塞. ReentrantLock ...

  10. Register Abstraction(9)

    This post will explain how to use the UVM Register Abstraction Layer (RAL) to generate register tran ...