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

UVA 11990 “Dynamic‘‘ Inversion 区域树 + 树状数组

一、题目大意

我们有 1 2 3 ... n 这些数字组成的一个排列数组 a ,需要从这个排列中取出m个数字,要求计算出出每次取出数字之前,数组中的逆序数(逆序数就是 i < j,但是 ai > aj的数)

二、解题思路

我们以数组为基础构建一颗区域树,每个节点保存下标在 [l , r)的元素,并按照元素的值排序。

针对于题目的开始,我们可以计算 0<=i<n 的所有ai,j < i 但 aj > ai的个数,这个数量求和即最初的逆序数,计算的方式就是去区域树上查到 [0 , i)区间内的节点,每个节点 lower_bound计数,求出sum。(因为每个元素都循环,所以仅考虑它前面的元素即可,后面的元素会在循环时计算到)

然后针对每次要移除的数字 ai,只需要去 [0 , i)区间的树节点依次进行二分即可知道 j < i,且 aj > ai的个数 x,然后去 [i+1 , n)的数节点进行二分,即可知道 j > i,且aj < ai的个数 y,sum=sum-x-y

每次移除数字之前,输出sum

同时数字被移除了,下次要避免重复计算,所以可以对区域上每个节点建立一个树状数组,每次移除一个数字时,需要去当前数字的节点和它的父节点上,用过二分找到这个数组的下标,将下标+1的位置更新1(树状数组的有效下标从1开始),注意也要循环更新父节点 ( p = (p - 1)/2)

这样每次去区域树上lower_bound得到idx时,通过树状数组求和两次([1,idx],[1,l-r]),去掉那些已经被移除的数字,即可避免重复计算。

三、代码

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int *bit[524288];
int *dat[524288];
int datL[524288], datR[524288];
int n, m, num[200007], seq[200007], num2Idx[200007];
int _current, _currentLt, _currentGt;
char opType;
void input()
{for (int i = 0; i < n; i++){scanf("%d", &num[i]);num2Idx[num[i]] = i;}for (int i = 0; i < m; i++){scanf("%d", &seq[i]);}
}
int calcSize(int _size)
{int size = 1;while (size < _size){size = size * 2;}return size;
}
void build(int i, int l, int r)
{if (r - l == 1){dat[i] = new int[1];dat[i][0] = num[l];}else{int lch = i * 2 + 1;int rch = i * 2 + 2;int mid = (l + r) / 2;build(lch, l, mid);build(rch, mid, r);dat[i] = new int[r - l];merge(dat[lch], dat[lch] + (mid - l), dat[rch], dat[rch] + (r - mid), dat[i]);}datL[i] = l;datR[i] = r;int size = calcSize(r - l);bit[i] = new int[size + 1];for (int j = 0; j <= size; j++){bit[i][j] = 0;}
}
int sum(int idx, int i)
{int res = 0;for (int j = i; j > 0; j = j - (j & (-j))){res = res + bit[idx][j];}return res;
}
void update(int idx, int i, int x, int size)
{if (i <= 0){return;}for (int j = i; j <= size; j = j + (j & (-j))){bit[idx][j] = bit[idx][j] + x;}
}
void queryCnt(int i, int l, int r)
{int lt = lower_bound(dat[i], dat[i] + (r - l), _current) - dat[i];int size = calcSize(r - l);int realLt = lt - sum(i, lt);int realAll = (r - l) - sum(i, size);int realGt = realAll - realLt;_currentLt = _currentLt + realLt;_currentGt = _currentGt + realGt;
}
void updateTree(int i)
{update(i, 1, 1, 1);int j = i;while (j > 0){j = (j - 1) / 2;int idx = lower_bound(dat[j], dat[j] + (datR[j] - datL[j]), _current) - dat[j];int size = calcSize(datR[j] - datL[j]);update(j, idx + 1, 1, size);}
}
void query(int _l, int _r, int i, int l, int r, char opType)
{if (_l >= r || _r <= l){}else if (l >= _l && r <= _r){if (opType == 'q'){queryCnt(i, l, r);}if (opType == 'u'){updateTree(i);}}else{query(_l, _r, i * 2 + 1, l, (l + r) / 2, opType);query(_l, _r, i * 2 + 2, (l + r) / 2, r, opType);}
}
void solve()
{ll val = 0LL;for (int i = 0; i < n; i++){_current = num[i];_currentLt = 0, _currentGt = 0;query(0, i, 0, 0, n, 'q');val = val + _currentGt;}for (int i = 0; i < m; i++){printf("%lld\n", val);_current = seq[i];_currentLt = 0, _currentGt = 0;query(0, num2Idx[seq[i]], 0, 0, n, 'q');val = val - _currentGt;_currentLt = 0, _currentGt = 0;query(num2Idx[seq[i]] + 1, n, 0, 0, n, 'q');val = val - _currentLt;query(num2Idx[seq[i]], num2Idx[seq[i]] + 1, 0, 0, n, 'u');}
}
int main()
{while (~scanf("%d%d", &n, &m)){input();build(0, 0, n);solve();}return 0;
}

相关文章:

UVA 11990 “Dynamic‘‘ Inversion 区域树 + 树状数组

一、题目大意 我们有 1 2 3 ... n 这些数字组成的一个排列数组 a &#xff0c;需要从这个排列中取出m个数字&#xff0c;要求计算出出每次取出数字之前&#xff0c;数组中的逆序数&#xff08;逆序数就是 i < j&#xff0c;但是 ai > aj的数&#xff09; 二、解题思路 …...

邮件钓鱼分析

三大协议 SPF Sender Policy Framework 的缩写&#xff0c;一种以IP地址认证电子邮件发件人身份的技术。 注&#xff1a;收信人怀疑币是假的&#xff0c;查看这个送信包裹里面记录的发出地是不是央行&#xff0c;如果是黑市有可能是黑钱 DKIM 加密签名和域名关联。 注&am…...

Android 小技巧

1. Android Studio下载地址 Android 开发者 | Android Developers (google.cn) 2.Android Aosp 在线查看地址&#xff1a; AOSPXRef 3.Android 官方文档地址&#xff1a; Android 开源项目 | Android Open Source Project (google.cn)...

Centos MySQL --skip-grant-tables详解

跳过权限验证&#xff0c;导出数据备份 主机系统&#xff1a;Centos7 64位 数据库版本&#xff1a;MySQL5.7.40 使用–skip-grant-tables场景 1、忘记管理员密码 2、修改管理员密码 mysql -uroot -p显示错误内容如下&#xff1a; ERROR 1045 (28000): Access denied for …...

Linux:进程控制的概念和理解

文章目录 进程的创建fork函数写时拷贝的原理fork函数的用法和失败原因 进程终止进程的退出进程异常的问题 进程终止进程退出 进程等待什么是进程等待&#xff1f;为什么要进行进程等待&#xff1f;如何进行进程等待&#xff1f;父进程如何知道子进程的退出信息&#xff1f; wai…...

ubuntu20.04编译安装nginx

目录 一.更新系统软件包列表二.安装编译Nginx所需的依赖三.下载Nginx源代码四.解压源代码文件五.进入解压后的Nginx目录六.配置编译选项七.编译并安装Nginx八.启动Nginx服务九.验证Nginx是否正常运行十.Nginx命令十一.配置软链接 在Ubuntu 20.04上编译安装Nginx&#xff0c;你可…...

操作系统的分页

操作系统的分页功能与内存管理密切相关。为了更好地理解这一点&#xff0c;我们先简要概述分页的基本概念&#xff0c;然后解释其与页面调度和存储效率的关系。 分页的基本概念 分页是操作系统中的一种内存管理策略。物理内存被划分为固定大小的块&#xff0c;称为“页面”或“…...

微服务环境搭建

JDK安装&#xff1a;https://blog.csdn.net/JHYPXS/article/details/134155680 mysql安装&#xff1a;https://blog.csdn.net/JHYPXS/article/details/102566304 nacos安装&#xff1a;https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html...

ffmpeg 截取命令

从00:00:03.500开始截取往后长度到结尾的mp3音频&#xff08;这个更有用&#xff0c;测试好用&#xff09; ffmpeg -i d:/c.mp3 -ss 00:00:03.500 d:/output.mp3 将两个音频合并成一个音频&#xff08;测试好用&#xff09; ffmpeg -i "concat:d:/c.mp3|d:/output.mp3&…...

TypeScript深度剖析:TypeScript 中枚举类型应用场景?

文章目录 一、是什么二、使用数字枚举字符串枚举异构枚举本质 三、应用场景 一、是什么 枚举是一个被命名的整型常数的集合&#xff0c;用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型 通俗来说&#xff0c;枚举就是一个对象的所有可能取值的集…...

[推荐]SpringBoot,邮件发送附件含Excel文件(含源码)。

在阅读本文前&#xff0c;可以先阅读我的上一篇文章&#xff1a; SpringBoot&#xff0c;使用JavaMailSender发送邮件(含源码)。 &#xff0c;本文使用的代码案例涉及到的 jar包、application.properties配置与它相同。 先看一下效果。 图一 图二 在下方代码案例中&#xff0c;…...

node学习之包管理器

一、概念介绍 **1.1 包是什么 ** 『包』英文单词是 package &#xff0c;代表了一组特定功能的源码集合 **1.2 包管理工具 ** 管理『包』的应用软件&#xff0c;可以对「包」进行 下载安装 &#xff0c; 更新 &#xff0c; 删除 &#xff0c; 上传 等操作 借助包管理工具&…...

自动驾驶车辆轨迹跟踪

相对于传统的模型预测控制&#xff08;MPC&#xff09;&#xff0c;简化的车辆模型通常会导致预测结果不准确&#xff0c;这对车辆的转弯等行为具有负面影响。因此作者提出了一种轨迹规划和跟踪框架&#xff1a; 该框架应用人工势场来获得目标轨迹&#xff1b;并利用具有PID反…...

React的useEvent 和 ahooks 的 useMemorizedFn 的深度分析和对比

父组件 const TestParent: React.FC<any> () > {const [State, setState] useState(0);const changeFun useCallback(() > {console.log(useCallback closure 里的 State, State);}, [State]);const changeFun_useEvent useEvent(() > {console.log(useEv…...

基于goframe2.5.4、vue3、tdesign-vue-next开发的全栈前后端分离的管理系统

goframe-admin goframe-admin V1.0.0 平台简介 基于goframe2.5.4、vue3、tdesign-vue-next开发的全栈前后端分离的管理系统。前端采用tdesign-vue-next-starter 、vue3、pinia、tdesign-vue-next。 特征 高生产率&#xff1a;几分钟即可搭建一个后台管理系统认证机制&#x…...

LInux之在同一Tomcat下使用不同的端口号访问不同的项目

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《LInux实战开发》。&#x1f3af;&#x1f3af; …...

梦百合上榜2023鼎革奖数字化转型先锋榜

10月26日,第六届“鼎革奖”数字化转型先锋榜单揭晓,梦百合家居凭借数字化生产的卓越成果——SAP管理平台及供应链项目,入选2023【鼎革奖】数字化转型先锋榜年度供应链转型典范,梦百合家居COO 崔慧明同步入选2023【鼎革奖】数字化转型先锋榜年度首席运营官。 据了解,「鼎革奖」数…...

沉痛悼念科研分公司

今天上班途中&#xff0c;遇到了上家公司的同事王强。他正准备去体检中心体检。几句寒暄之后&#xff0c;得知他是要入职选煤公司了。 我们所在的公司比较大&#xff0c;总公司下设有几十个分、子公司&#xff0c;我和他曾经在一家子公司——科研分公司。现在的科研分公司解散…...

Django的网站项目开发好了,该用何种方案在Centos上部署【答:Gunicorn(uWSGI)+Nginx】

问&#xff1a;用Django开发的网站开发好了&#xff0c;现在要部署上线。 系统为Centos 7.x 现在我安装好Django和相关依赖后&#xff0c;我用命令 python manage.py runserver 127.0.0.1:8010 启动Django 然后安装配置好Nginx,并把用的请求转发到 127.0.0.1:8010 。 请问这样的…...

基于PyTorch的中文情绪分析器设计与开发

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、相关基础理论2.1 主流深度学习框架2.2 神经网络2.2.1 神经网络基础 二、中文情感分类模型构建3.1 开发环境3.2 数据部分3.3 文本特征提取3.3.1、过滤标点符号3.3.2 中文分词、单词过滤 三 运行结果与分析五 结…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...