传送门

Description

给你一个长度为\(n\)的整数数列,要求修改最少的数字使得数列单调递增

Input

第一行为\(n\)

第二行\(n\)个数代表数列

Output

输出一行代表答案

Hint

\(For~All:\)

\(1~\leq~n~\leq~10^5\)

Solution

看了下题目的意思貌似允许修改成实数,所以这里求一个LIS就完事了。但是发现\(n^2\)的LIS会爆炸,然而我又不会用单调性二分的\(O(nlogn)\)的做法,于是自己口胡了一个树状数组的做法。

在此声明一下这个做法有点水所以不能确定是不是有人提出过。但我确实口胡出来了

显然读入可以离散化。离散化以后把DP的状态定义改变一下,设\(f_i\)为当前算到的以\(i\)为结尾的LIS的ans。

考虑转移,显然正向DP时对于一个新位置\(f_i=\max\{f_j\}+1\),其中\(j~<~i\)。发现\(f_i\)转移是由一个小于\(i\)的前缀\(\max\)转移来的。

于是可以树状数组维护这个前缀\(\max\),更新\(f_i\)以后在树状数组上更新一下就好

Code

#include<cmath>
#include<cstdio>
#include<algorithm>
#define rg register
#define ci const int
#define cl const long long int typedef long long int ll; namespace IO {
char buf[300];
} template <typename T>
inline void qr(T &x) {
rg char ch=getchar(),lst=' ';
while((ch > '9') || (ch < '0')) lst=ch,ch=getchar();
while((ch >= '0') && (ch <= '9')) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
if(lst == '-') x=-x;
} template <typename T>
inline void qw(T x,const char aft,const bool pt) {
if(x < 0) {putchar('-');x=-x;}
rg int top=0;
do {
IO::buf[++top]=x%10+'0';
} while(x/=10);
while(top) putchar(IO::buf[top--]);
if(pt) putchar(aft);
} template <typename T>
inline T mmax(const T a,const T b) {return a > b ? a : b;}
template <typename T>
inline T mmin(const T a,const T b) {return a < b ? a : b;}
template <typename T>
inline T mabs(const T a) {return a < 0 ? -a : a;} template <typename T>
inline void mswap(T &a,T &b) {
T _temp=a;a=b;b=_temp;
} const int maxn = 100010; int n;
int MU[maxn],tree[maxn],frog[maxn],temp[maxn]; int ask(int);
void init_hash();
void change(int,ci); inline int lowbit(ci x) {return x&(-x);} int main() {
qr(n);
for(rg int i=1;i<=n;++i) {qr(MU[i]);temp[i]=MU[i];}
init_hash();
for(rg int i=1;i<=n;++i) {
frog[MU[i]]=ask(MU[i]-1)+1;
change(MU[i],frog[MU[i]]);
}
qw(n-ask(n),'\n',true);
return 0;
} void init_hash() {
std::sort(temp+1,temp+1+n);
int *ed=std::unique(temp+1,temp+1+n);
for(rg int i=1;i<=n;++i) MU[i]=std::lower_bound(temp+1,ed,MU[i])-temp;
} int ask(int x) {
int _ans=0;
while(x) {
_ans=mmax(_ans,tree[x]);
x-=lowbit(x);
}
return _ans;
} void change(int x,ci v) {
while(x <= n) {
tree[x]=mmax(tree[x],v);
x+=lowbit(x);
}
}

Summary

以后麻麻再也不用担心我不会\(O(nlogn)\)求LIS辣!

【树状数组】【P3902】 递增的更多相关文章

  1. Codeforces 961 容斥叉积判共线 树状数组递增思想题

    A B C D 给你N个点 问你能不能有两条直线穿过这N个点 首先假设这N个点是可以被两条直线穿过的 所以两条直线就把这N个点划分成两个集合 我们取1 2 3三个点这样必定会有两个点在一个集合内 ch ...

  2. codeforces 597C C. Subsequences(dp+树状数组)

    题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...

  3. [noip科普]关于LIS和一类可以用树状数组优化的DP

    预备知识 DP(Dynamic Programming):一种以无后效性的状态转移为基础的算法,我们可以将其不严谨地先理解为递推.例如斐波那契数列的递推求法可以不严谨地认为是DP.当然DP的状态也可以 ...

  4. Codeforces 486E LIS of Sequence --树状数组求LIS

    题意: 一个序列可能有多个最长子序列,现在问每个元素是以下三个种类的哪一类: 1.不属于任何一个最长子序列 2.属于其中某些但不是全部最长子序列 3.属于全部最长子序列 解法: 我们先求出dp1[i] ...

  5. hdu 4000Fruit Ninja 树状数组

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  6. HDU3333 Turing Tree 树状数组+离线处理

    Turing Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. POJ 2299 树状数组+离散化求逆序对

    给出一个序列 相邻的两个数可以进行交换 问最少交换多少次可以让他变成递增序列 每个数都是独一无二的 其实就是问冒泡往后 最多多少次 但是按普通冒泡记录次数一定会超时 冒泡记录次数的本质是每个数的逆序数 ...

  8. 树状数组POJ2352星星

    http://poj.org/problem?id=2352 这道题的题意对于住学者应该比较难理解,但是如果弄明白他的意思的话,你就会发现这就是赤裸裸的树状数组,哎,欺负我不懂是吧,当时读题读啦好久, ...

  9. hdu 5654 xiaoxin and his watermelon candy 树状数组维护区间唯一元组

    题目链接 题意:序列长度为n(1<= n <= 200,000)的序列,有Q(<=200,000)次区间查询,问区间[l,r]中有多少个不同的连续递增的三元组. 思路:连续三元组-& ...

随机推荐

  1. linux ——使用find如何快速替换所有相同参数

    在生成环境上有时候需要大规模修改某一配置里的参数,但是该参数存在多个地方,比如IP地址 端口 项目名等,特别是项目名称混乱想统一 find  /项目地址 -type f |xargs grep &qu ...

  2. PKI(Public Key Infrastucture)介绍

    PKI(Public Key Infrastucture)介绍 根据Wikipedia PKI词条整理. PKI(Public Key Infrastucture)是一系列的规则.策略以及过程,可以用 ...

  3. 扩展Lucas定理 扩展Lucas板子

    题意概述:多组询问,给出N,K,M,要求回答C(N,K)%M,1<=N<=10^18,1<=K<=N,2<=M<=10^6 分析: 模数不为质数只能用扩展Lucas ...

  4. 【探路者】团队Alpha周贡献分数分配结果

    经本组成员商议,根据老师提供的分数,(每人携带10分进入团队,[探路者]团队7人,共计35分). 本周每位同学携带10分进入组内,7人共计70分.分数公布如下: 吴雨丹 15分 贾雅杰 12分 蔺依铭 ...

  5. Beta阶段第三次网络会议

    Beta阶段第三次网络会议 第二次会议问题解决情况 不同等级城堡不同图片,移动动画解决,阴影效果添加 小地图信息添加城堡和士兵信息 新AI设计失败,在存在科技树的情况下,如果将所有可能操作全部纳入考虑 ...

  6. 遇到Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so问题的解决方法

    运行一个基于tensorflow的模型时,遇到Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so问题. 解决方法:打开 ...

  7. Alpha冲刺——第六天

    Alpha第六天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...

  8. 用javascript代码拼html

    公司新来的同事说,他们是用javascript代码拼html代码的,如果要修改值,就是修改对象的属性. 交代下,我们现在都是用拼字符串的方式拼html代码的.他提到如果写在单独的javascript文 ...

  9. form表单元素中disabled的元素的值不会提交到服务器

    1.表单元素中disabled的元素的值不会提交到服务器,后台获取的值为null <form id="myForm" action="#" method= ...

  10. django的第一个问题

    /usr/local/lib/python2.7/dist-packages/allauth/account/utils.py in setup_user_email, line 258 /usr/l ...