「TJOI2013」最长上升子序列

传送门

这个 \(\text{DP}\) 应该都会撒:

\[dp_i = \max_{j < i,a_j < a_i}\left\{dp_j\right\} + 1
\]

考虑一个性质:加入的数是严格单调递增的,所以我们每次插入一个点时,它之前的所有点都可以成为决策点,并且之前的点的 \(dp\) 值不会被更新,所以我们只需要做到插入点和询问前缀最大值即可,这个用平衡树很好做。

需要注意的是,由于平衡树的每一个节点就是序列中的点,所以在 \(\text{pushup}\) 的时候记得合并根的信息。

参考代码:

#include <algorithm>
#include <cstdlib>
#include <cstdio>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
} const int _ = 1e5 + 5; int n, dp[_], rt, tot, pos[_], siz[_], val[_], pri[_], ch[2][_]; inline int Newnode(int v, int x)
{ return siz[++tot] = 1, dp[pos[tot] = x] = val[tot] = v, pri[tot] = rand(), tot; } inline void pushup(int p) {
siz[p] = siz[ch[0][p]] + siz[ch[1][p]] + 1;
val[p] = max(dp[pos[p]], max(val[ch[0][p]], val[ch[1][p]]));
} inline int merge(int x, int y) {
if (!x || !y) return x + y;
if (pri[x] > pri[y])
return ch[1][x] = merge(ch[1][x], y), pushup(x), x;
else
return ch[0][y] = merge(x, ch[0][y]), pushup(y), y;
} inline void split(int p, int k, int& x, int& y) {
if (!p) { x = y = 0; return ; }
if (siz[ch[0][p]] + 1 <= k)
return x = p, split(ch[1][p], k - siz[ch[0][p]] - 1, ch[1][x], y), pushup(p);
else
return y = p, split(ch[0][p], k, x, ch[0][y]), pushup(p);
} int main() {
read(n);
for (rg int o, a, b, i = 1; i <= n; ++i) {
read(o), split(rt, o, a, b);
rt = merge(a, merge(Newnode(val[a] + 1, i), b));
printf("%d\n", val[rt]);
}
return 0;
}

「TJOI2013」最长上升子序列的更多相关文章

  1. 【LOJ】#2265. 「CTSC2017」最长上升子序列

    题解 点了一个新技能叫杨表(事实上集训的时候听过,但是一直不会 这道题就是让我们找到k个不上升子序列,要求长度加和最大 我们用杨表去维护,但是由于杨表的行数可能是n的,复杂度会炸 我们只维护前\(\s ...

  2. LOJ2265. 「CTSC2017」最长上升子序列

    题意:中文题意很清楚 LOJ2263 分析: 根据Dilworth定理,最小链覆盖=最长反链. 问题转化为求 $k$ 个最小不上升序列能覆盖的最大数的个数. 参考链接: 1. https://blog ...

  3. Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流)

    Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流) Description 问题描述: 给定正整数序列x1,...,xn . (1 ...

  4. 【刷题】LOJ 6005 「网络流 24 题」最长递增子序列

    题目描述 给定正整数序列 \(x_1 \sim x_n\) ,以下递增子序列均为非严格递增. 计算其最长递增子序列的长度 \(s\) . 计算从给定的序列中最多可取出多少个长度为 \(s\) 的递增子 ...

  5. 「BZOJ 5161」最长上升子序列「状压DP」

    题意 求一个\(1\sim n\)的排列LIS的期望长度,\(n\leq 28\) 题解 考虑朴素的LIS:\(f[i] = min(f[j]) + 1\) 记\(mx[i]\)为\(f\)的前缀最大 ...

  6. 「网络流24题」「LuoguP3358」 最长k可重区间集问题(费用流

    题目描述 对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度. 输入输出格式 输入格式: 的第 1 行有 2 个正整数 n和 k,分别表示开区间的个数和开区间的可重 ...

  7. 「TJOI2013」循环格

    题目链接 戳我 \(Solution\) 我们观察发现循环格要满足每个点的入度都为\(1\) 证明: 我们假设每个点的入读不一定为\(1\),那么必定有一个或多个点的入度为0,那么则不满足循环格的定义 ...

  8. 「TJOI2013」攻击装置

    题目链接 戳我 \(solution\) 这道题和网络24题之骑士共存问题很相似 只是输入方式不一样而已 详细见:这儿 \(Code\) #include<bits/stdc++.h> # ...

  9. 「10.19」最长不下降子序列(DP)·完全背包问题(spfa优化DP)·最近公共祖先(线段树+DFS序)

    我又被虐了... A. 最长不下降子序列 考场打的错解,成功调了两个半小时还是没A, 事实上和正解的思路很近了,只是没有想到直接将前$D$个及后$D$个直接提出来 确实当时思路有些紊乱,打的时候只是将 ...

随机推荐

  1. txt文件太大打不开怎么办

    #开始 最近在调试代码的时候,生成了一个400MB的日志文件 找了很多文本编辑器,都表示太大了打不开 QAQ #解决方案 百度下载 “txt杀手” 用这个软件把文本文件拆分成小份就可以打开了 输入如图 ...

  2. 吴裕雄 PYTHON 人工智能——智能医疗系统后台智能分诊模块及系统健康养生公告简约版代码展示

    #coding:utf-8 import sys import cx_Oracle import numpy as np import pandas as pd import tensorflow a ...

  3. 接口测试,如何构建json类型的参数值

    1.json类型参数传入,实际传输的时候是转化为一中字符串类型的格式,所以如data=”{}”,该参数用引号包含传入,“{}”里面的key都应该为双引号,value为字符串的也应该是双引号,最后一个v ...

  4. 使用JavaScript获取样式的属性值

    1 . 在js中可以使用style属性来获取样式的属性值(只能获取内联样式的属性值) 语法格式为: HTML元素.style.样式属性; 2 .   在IE浏览器中,使用currentStyle来获取 ...

  5. PHP如何实现处理过期或者超时订单的,并还原库存

    订单是我们在日常开发中经常会遇到的一个功能,最近在做一个订单过期与超时的开发.订单过期与超时就不用我解释了吧,其实两者都是同一个问题来着,就是订单未支付的处理,我们要做的是对这些未支付的订单到了一定时 ...

  6. c# 调用c++sdk时结构体与byte数组互转

    /// <summary> /// 由结构体转换为byte数组 /// </summary> public static byte[] StructureToByte<T ...

  7. spark实验(二)--scala实验(3)

    实验1,计算级数: 首先打开安装完scala ide的eclipse,在eclipse 中新建一个scala project. 然后新建一个scala的object对象 导入scala.io.StdI ...

  8. jdk基础提升

    1. treeMap,treesSet 作用:1具有对应普通的Map,Set的功能,2.能排序Map和Set  (依赖树的结构进行排序---中序循环) TreeSet<String> tr ...

  9. Perl 笔记

    目录 Perl 学习 常用记录 基础 1. 运行perl 2. 字符串 3. 变量 4. 条件 5. 循环 6. 运算符 7. 时间日期 8. 子程序(函数) 9. 引用 10. 格式化输出 11. ...

  10. GRE Over IPSec配置

    路由器GRE over IPSec站点到站点VPN         问题分析:对于前面的经典的IPSec VPN的配置来说,兼容性较好,适合于多厂商操作的时候,但是这种经典的配置方式不适合在复杂的网路 ...