zoukankan      html  css  js  c++  java
  • CodeForces

    (和南京那题很像,比赛的时候就两个队A了。我们队找到了思路,但是花了1个多小时没有写出来,emmmm,我的锅,当时线段树写丑了。

    题意:给定数组,Q次询问,假设把第i个大小hi改为b,求最长上升子序列LIS,(Q次询问是独立的)。

    思路:对于原来的数组,假设ans=LIS。那么改一个数字,ans1或=ans,或者=ans-1,或者ans+1。

    (LIS1i表示以i为终点的最长上升子序列。LIS2i表示以i为起点的最长上升子序列。

    考虑两种情况,用到b和不用b。

    1,用到b,那么找左边hi<b而且LIS1最大,找到右边hi>b而且LIS2最大。

    2,不用b,那么验证是否原来的所有最长LIS都经过i。

          对于1,我们需要满足找到j<i,hj<hi,的最大LIS1。我们建立N棵线段树,每棵树记录对应高度的LIS1。然后在1到j-1这几棵线段树上去找高度在1到hi-1范围的最大值。 转化一下,这N棵树可以转化为主席树。没棵树从root[j]跑,去更新对应高度的最大值(高度离散化)。   

  • 相关阅读:
    1、一条sql查询语句的执行过程
    go 内存分配
    GO Json
    gorm CRUD:读写数据
    go 基于切片的队列实现
    go的错误处理
    grpc
    sqlalchemy 判断字段是否存在
    定时函数
    用Python获取Linux资源信息的三种方法
  • 原文地址:https://www.cnblogs.com/hua-dong/p/9107854.html
Copyright © 2011-2022 走看看