当前位置: 首页 > article >正文

【最长不下降子序列——树状数组、线段树、LIS】

题目

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int a[N], b[N], tr[N];//a保存权值,b保存索引,tr保存f,g前缀属性最大值
int f[N], g[N];
int n, m;
bool cmp(int x, int y)
{
    if(a[x] != a[y]) return a[x] < a[y]; //不下降,因此值递增
    return x < y; //不下降,允许重复,保留等于号(不保留是x > y,代表逆序,自然不成序列)
}
void modify(int x, int val)
{
    for(; x <= n; x += x & -x)
    {
        tr[x] = max(tr[x], val);
    }
}
int query(int x)
{
    int retv = 0;
    for(; x; x -= x & -x)
    {
        retv = max(retv, tr[x]);
    }
    
    return retv;
}
int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        cin >> a[i], b[i] = i;
    
    sort(b+1, b+n+1, cmp);
    
    int ans = 0, tmp;
    for(int i = 1; i <= n; i++)
    {
        int p = b[i];
        f[p] = query(p-1) + 1;
        tmp = 0;
        if(p + m <= n) tmp = m;
        ans = max(ans, f[p] + tmp);
        modify(p, f[p]);
    }
    
    memset(tr, 0, sizeof tr);
    for(int i = n; i >= 1; i--)
    {
        int p = n + 1 - b[i];
        g[b[i]] = query(p-1) + 1;
        tmp = 0;
        if(b[i] - m >= 1) tmp = m;
        ans = max(ans, tmp + g[b[i]]);
        modify(p, g[b[i]]);
    }
    
    memset(tr, 0, sizeof tr);
    for(int i = 1; i <= n; i++)
    {
        int p = b[i];
        if(p > m+1) ans = max(ans, query(p - m - 2) + m + g[p]);
        modify(p, f[p]);
    }
    
    cout << ans;
}


http://www.kler.cn/a/529902.html

相关文章:

  • C# 继承与多态详解
  • 小程序的协同工作与发布
  • 机器学习优化算法:从梯度下降到Adam及其变种
  • python-leetcode-相同的树
  • C++【深入底层,手撕vector】
  • model.eval() model.train()
  • 图像分割任务的数据预处理
  • 012-51单片机CLD1602显示万年历+闹钟+农历+整点报时
  • XML DOM 浏览器差异
  • 【AI】人工智能没那么神秘!
  • 基于WiFi的智能照明控制系统的设计与实现(论文+源码)
  • 46【什么是原生开发】
  • Vue3 表单:全面解析与最佳实践
  • C++基础学习
  • Baklib构建高效协同的基于云的内容中台解决方案
  • 《苍穹外卖》项目学习记录-Day11订单统计
  • React中useState()钩子和函数式组件底层渲染流程详解
  • 【Linux系统】进程间通信:浅谈 SystemV 标准的消息队列和信号量
  • Python - pyautogui库 模拟鼠标和键盘执行GUI任务
  • 测试中的质量度量与评估方法
  • PVE 中 Debian 虚拟机崩溃后,硬盘数据怎么恢复
  • 【大数据技术】教程02:搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn)
  • C#面试常考随笔11:Dictionary<K, V>、Hashtable的内部实现原理是什么?效率如何?
  • deepseek的两种本地使用方式
  • 【MySQL】语言连接
  • LVM 逻辑卷管理