首页 > 其他分享 >P11208 解题报告

P11208 解题报告

时间:2024-10-22 19:43:34浏览次数:1  
标签:报告 int P11208 invension 减一 解题 操作 对数 逆序

题目传送门

将题意转化一下:将序列变为单调上升等价于逆序对总数量为 \(0\)。

首先看到交换相邻两个数,立马反应过来这种操作最好情况会使逆序对总数减一。

为什么呢?

首先肯定要前面大于后面才交换,否则一定不优。

假设前为 \(i\),后为 \(j\),钦定我们计算逆序对的方式是从后往前,依次看每个数后方有多少个小于它的数,并假设 \(i\) 产生的逆序对个数是 \(b_i\),\(j\) 产生 \(b_j\),那么交换后,根据逆序对的定义,\(i\) 前方和 \(j\) 后方的逆序对数都不会改变,\(i\) 的逆序对数减一,\(j\) 不变。如下图所示:

其次发现操作 \(2\) 是个非常硬核的操作:最多操作 \(n - 1\) 次该序列就必定单调递增(毕竟删得只剩一个数了)。

那么可以先设立一个操作次数的上界:\(n - 1\)。

然后,来考虑两种操作结合的情况。

首先不难发现,删除一个数对它后面数的逆序对数不会造成影响,只会将它前面且大于它的数的逆序对数减一,又由于每次只能删除最小的数,所以相当于对所有前面存在的数都要减一。

所以思路就很明了了:建立两个树状数组,一个用来维护逆序对数量,一个用来维护前缀剩下的数的个数,枚举删除那些数然后依次更新答案即可。

(可能只有我傻到去写两个树状数组吧)

\(\texttt{Code:}\)

#include <iostream>

using namespace std;

const int N = 100010;

int n;
int a[N], pos[N];
int invension[N];
//invension[i] 表示第 $i$ 个位置产生多少个逆序对
struct BIT{
    int c[N];
    #define lowbit(x) (x & -x)
    inline void add(int x, int v) {
        for(; x <= n; x += lowbit(x)) c[x] += v;
    }
    inline int ask(int x) {
        int res = 0;
        for(; x; x -= lowbit(x)) res += c[x];
        return res;
    }
}tr1, tr2; //封装数据结构
//tr1 维护逆序对,tr2 维护前缀和

int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        pos[a[i]] = i; //记录每个数出现在哪个位置
    }
    long long sum = 0;
    //计算逆序对
    for(int i = n; i; i--) {
        invension[i] = tr1.ask(a[i] - 1);
        sum += invension[i];
        tr1.add(a[i], 1);
    }
    long long ans = min(sum, (long long)n - 1);
    //枚举删除哪些数
    for(int i = 1; i <= n; i++)
        tr2.add(i, 1); //一开始每个位置上都有数
    for(int i = 1; i < n; i++) {
        int cnt = tr2.ask(pos[i] - 1);
        sum -= cnt;
        ans = min(ans, (long long)sum + i);
        tr2.add(pos[i], -1); //删掉后这个位置上就没有数了
    }
    printf("%lld", ans);
    return 0;
}

标签:报告,int,P11208,invension,减一,解题,操作,对数,逆序
From: https://www.cnblogs.com/Brilliant11001/p/18493608

相关文章

  • springboot vue前后端分离:网上生鲜商城系统设计与实现计算机毕业设计作品和开题报告
      博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开......
  • 【可答疑】基于51单片机的智能空调(含仿真、代码、报告、演示视频等)
     ✨哈喽大家好,这里是@每天一杯冰美式oh,985电子本硕,大厂嵌入式在职0.3年,业余时间做做单片机小项目,有需要也可以提供就业指导(免费)~......
  • 【可答疑】基于51单片机的智能电饭煲(含仿真、代码、报告、演示视频等)
     ✨哈喽大家好,这里是@每天一杯冰美式oh,985电子本硕,大厂嵌入式在职0.3年,业余时间做做单片机小项目,有需要也可以提供就业指导(免费)~......
  • Qwen2技术报告解读
    论文:https://arxiv.org/pdf/2407.10671摘要本报告介绍了最新的大型语言模型和多模态模型Qwen2系列。该系列包括参数范围从0.5亿到720亿的基础型和指令微调型语言模型,涵盖密集模型和混合专家模型。Qwen2在多个基准测试中表现优异,超越了之前的开源模型,并在语言理解、生成、多语......
  • 如何将MySQL巡检内容转换成PDF格式报告呢?
    一、背景:最近在运维一个历史项目,没有任何的运维工具,甲方要求每日进行数据库的运维,而且必须进行相关的巡检项的截图并输出报告。为了节省时间,我们可以把原来的巡检脚本修改成HTML格式输出后,进行PDF的转换。二、脚本内容:[root@postgresql~]#chmod+xmysqlcheckhtml.s......
  • 2009年国赛高教杯数学建模B题眼科病床的合理安排解题全过程文档及程序
    2009年国赛高教杯数学建模B题眼科病床的合理安排  医院就医排队是大家都非常熟悉的现象,它以这样或那样的形式出现在我们面前,例如,患者到门诊就诊、到收费处划价、到药房取药、到注射室打针、等待住院等,往往需要排队等待接受某种服务。  我们考虑某医院眼科病床的合理......
  • 20222426 2024-2025-1 《网络与系统攻防技术》实验三实验报告
    1.实验内容·免杀原理免杀技术的核心原理是通过修改病毒、木马的内容,改变其特征码,从而躲避杀毒软件的查杀。杀毒软件通常使用特征码识别技术来检测和清除恶意软件,因此,通过修改恶意软件的特征码,可以使其绕过杀毒软件的检测。·免杀技术1.修改特征码。·直接修改:将特征码所对应......
  • 20222321 2024-2025-1 《网络与系统攻防技术》实验二实验报告
    一.实验内容(1)使用netcat获取主机操作Shell,cron启动某项任务(任务自定)(2)使用socat获取主机操作Shell,任务计划启动(3)使用MSFmeterpreter(或其他软件)生成可执行文件,利用ncat或socat传送到主机并运行获取主机Shell(4)使用MSFmeterpreter(或其他软件)生成获取目标主机音频、摄......
  • 20222406 2024-2025-1 《网络与系统攻防技术》实验三实验报告
    202224062024-2025-1《网络与系统攻防技术》实验三实验报告1.实验内容1.1实践内容正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧通过组合应用各种技术实现恶意代码免杀用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本......
  • 20222427 2024-2025-1 《网络与系统攻防技术》实验三实验报告
    1.实践内容1.1本周知识总结深入学习关于缓冲区溢出的基础知识。学习了关于后门的一些基础知识。1.2回答问题(1)杀软是如何检测出恶意代码的?病毒特征码检测加密文件分析基于行为检测的主动防御病毒云查杀(2)免杀是做什么?免杀,即Anti-AntiVirus(简写VirusAV......