树形数据结构之树状基础-算法赛

今天给分享的是一道算法决赛的题目,这道题目的综合要求比较高,希望大家可以好好理解,同时这道题用到的是树状树形结构的有关知识。可以用这几天学的相关内容结合起来。

问题描述

给定两个长度为 N的排列 A 和 B。若一对二元组下标 (i,j) 满足以下关系则被称之为压制二元组:

  • 1≤i<j≤N。
  • pAi​​<pAj​​,其中 px​ 表示值 x在数组 B 中的下标。

一对压制二元组的价值被定义为 j−ij−i,请你计算出所有压制二元组的价值之和。

排列的定义:长度为 N 的排列表示一个长度为 NN 的数组,其中 [1,N][1,N] 每个数都恰好出现一次。

输入格式

第一行输入一个整数 N(1≤N≤2×105)N(1≤N≤2×105) 表示排列的长度。

第二行输入 N 个整数A1​,A2​,A3​,⋯,AN​ 表示排列 A。

第三行输入 N 个整数B1​,B2​,B3​,⋯,BN​ 表示排列 B。

保证 A,B 是一个排列。

输出格式

输出一个整数表示答案。

输入案例:

4
2 4 1 3
4 1 2 3

输出案例:

7

说明

样例中有效的压制二元组有 1,4),(2,3),(2,4),(3,4),总价值为 4−1+3−2+4−2+4−3=7。

注意:二元组指的是下标对。

代码答案:

#include<iostream>
using namespace std;
typedef long long LL;
const int N = 200010;
int n;
int a[N],h[N]; // h[]存储每个数在B数组中的下标位置
LL b[N],c[N]; // b[]数组存储数量,c[]数组存储下标之和int lowbit(int x)
{return x & -x;
}void update(int pos,int x,LL d[])
{for(int i = pos;i <= n;i+=lowbit(i))d[i] += x;
}LL query(int pos,LL d[])
{LL res = 0;for(int i = pos;i;i-=lowbit(i)) res += d[i];return res;
}int main()
{scanf("%d", &n);for(int i = 1;i<=n;i++) scanf("%d",&a[i]);for(int i = 1;i<=n;i++){int x;scanf("%d",&x);h[x] = i;}LL ans = 0;for(int i = 1;i<=n;i++){update(h[a[i]],1,b);update(h[a[i]],i,c);ans += i * query(h[a[i]] - 1,b) - query(h[a[i]] - 1,c);}printf("%lld\n",ans);return 0;
}

1.首先需要理解题目中所求的价值对应的是a中的坐标,即

对于当前元素i,所有符合条件的j(j<i且p[A[j]]<p[A[i]])的总价值是:
sum(i-j) = i * 符合条件的j的数量 - sum(符合条件的j的具体值)

2.两个树状数组b和c的作用:

  1. b数组:记录「在某个位置上有多少个历史元素」。

    • 当我们处理元素j时,会在b数组中h[A[j]]的位置加 1(表示该位置新增了一个元素)。
    • query(pos-1, b)的结果是:所有「位置小于当前pos」的历史元素的总数量(即满足p[A[j]] < p[A[i]]j的个数)。
  2. c数组:记录「在某个位置上所有历史元素的下标之和」。

    • 当我们处理元素j时,会在c数组中h[A[j]]的位置加j(表示该位置新增元素的下标是j)。
    • query(pos-1, c)的结果是:所有「位置小于当前pos」的历史元素的下标总和(即满足p[A[j]] < p[A[i]]j的总和)。

3.根据案例的具体实现流程:

步骤 1:处理i=1A[1]=2
  • pos = h[A[1]] = h[2] = 3A[1]=2B中的位置是 3)。
  • 更新bc:在位置 3 分别加 1 和 1(i=1)。
    • b数组状态:b[3] = 1(其他位置 0)。
    • c数组状态:c[3] = 1(其他位置 0)。
  • 计算贡献:query(2, b) = 0(没有位置小于 3 的历史元素),所以ans += 1*0 - 0 = 0
  • 当前ans = 0
步骤 2:处理i=2A[2]=4
  • pos = h[A[2]] = h[4] = 1A[2]=4B中的位置是 1)。
  • 更新bc:在位置 1 分别加 1 和 2(i=2)。
    • b数组状态:b[1]=1b[3]=1
    • c数组状态:c[1]=2c[3]=1
  • 计算贡献:query(0, b) = 0(没有位置小于 1 的历史元素),所以ans += 2*0 - 0 = 0
  • 当前ans = 0
步骤 3:处理i=3A[3]=1
  • pos = h[A[3]] = h[1] = 2A[3]=1B中的位置是 2)。
  • 更新bc:在位置 2 分别加 1 和 3(i=3)。
    • b数组状态:b[1]=1b[2]=1b[3]=1
    • c数组状态:c[1]=2c[2]=3c[3]=1
  • 计算贡献:query(1, b) = 1(位置 1 有 1 个元素,即j=2),query(1, c) = 2j=2的下标和)。
    • 贡献为 3*1 - 2 = 1ans += 1
  • 当前ans = 1
步骤 4:处理i=4A[4]=3
  • pos = h[A[4]] = h[3] = 4A[4]=3B中的位置是 4)。
  • 更新bc:在位置 4 分别加 1 和 4(i=4)。
  • 计算贡献:query(3, b) = 3(位置 1、2、3 共有 3 个元素,即j=1,2,3),query(3, c) = 2+3+1=6(这些j的下标和)。
    • 贡献为 4*3 - 6 = 6ans += 6
  • 当前ans = 1 + 6 = 7(与样例输出一致)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/100335.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/100335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins 构建清理策略:自带功能 vs Discard Old Build 插件,全场景实操指南

前言&#xff1a;在 Jenkins 持续集成过程中&#xff0c;构建记录、工作空间、产物包会不断积累&#xff0c;既占用磁盘空间&#xff0c;也会让构建历史变得臃肿。Jenkins 自带的“丢弃旧的构建”功能和 Discard Old Build 插件&#xff0c;是两种常见的构建清理方案。本文将详…

Leetcode | Hot100

文章目录两数之和字母异位词分组最长连续序列移动零盛水最多的容器三数之和接雨水无重复字符的最长子串找到字符串中所有字母异位词和为 K 的子数组滑动窗口最大值最小覆盖子串最大子数组和合并区间轮转数组除自身以外数组的乘积缺失的第一个正数矩阵置零螺旋矩阵旋转图像搜索二…

【论文阅读】Uncertainty Modeling for Out-of-Distribution Generalization (ICLR 2022)

论文题目&#xff1a;Uncertainty Modeling for Out-of-Distribution Generalization 论文来源&#xff1a;ICLR 2022 论文作者&#xff1a; 论文链接&#xff1a;https://arxiv.org/pdf/2202.03958 论文源码&#xff1a;https://github.com/lixiaotong97/DSU ​ 一、摘要…

分布式系统单点登录(SSO)状态管理深度解析:从Cookie+Session到JWT的演进之路

分布式系统单点登录(SSO)状态管理深度解析&#xff1a;从CookieSession到JWT的演进之路作者&#xff1a;默语佬 | CSDN博主 在分布式微服务架构盛行的今天&#xff0c;单点登录已成为企业级应用的标准配置。本文将深入探讨SSO状态管理的技术演进&#xff0c;从传统的CookieSess…

从 WPF 到 Avalonia 的迁移系列实战篇7:EventTrigger 的迁移

从 WPF 到 Avalonia 的迁移系列实战篇7&#xff1a;EventTrigger 的迁移 在 WPF 中&#xff0c;EventTrigger 是非常常用的功能&#xff0c;它可以让我们直接在 XAML 中绑定事件与动画或动作&#xff0c;实现 UI 的交互效果。例如按钮点击时旋转、鼠标悬停时变色等。 然而&…

深圳比斯特|电池组PACK自动化生产线厂家概述

电池组PACK自动化生产线是指用于生产电池模组的一套自动化系统。这类生产线主要用于生产各类电池组&#xff0c;如锂离子电池组&#xff0c;应用于电动汽车、储能系统等领域。自动化生产线通过机械设备和计算机控制系统&#xff0c;实现电池组生产过程的自动化和高效率。整条生…

基于librdkafa C++客户端生产者发送数据失败问题处理#2

https://blog.csdn.net/qq_42896627/article/details/149025452?fromshareblogdetail&sharetypeblogdetail&sharerId149025452&sharereferPC&sharesourceqq_42896627&sharefromfrom_link 上次我们介绍了认证失败的问题。这次介绍另一个问题生产者发送失败…

pg卡死处理

[postgresapm ~]$ ps -ef|grep postgres:|grep -v grep|awk {print $2}|xargs kill -9 锁&#xff1a; 1 查找锁表的pid select pid from pg_locks l join pg_class t on l.relation t.oid where t.relkind r and t.relname lockedtable; 2 查找锁表的语句 select pid, …

Spring Boot 与 Elasticsearch 集成踩坑指南:索引映射、批量写入与查询性能

前言Elasticsearch 作为分布式搜索和分析引擎&#xff0c;凭借其高性能、可扩展性和丰富的查询能力&#xff0c;被广泛应用于日志分析、全文检索、电商搜索推荐等场景。 在 Spring Boot 项目中集成 Elasticsearch 已成为很多开发者的日常需求&#xff0c;但真正落地时往往会踩到…

windows 10打开虚拟机平台时,出现错误“找不到引用的汇编”解决办法

通过dism.exe开启虚拟机平台时&#xff0c;出现了以下错误&#xff1a;找不到引用的汇编&#xff0c;如下图所示 通过以下命令进行修复均无效&#xff1a; dism /online /cleanup-image /scanhealth sfc /scannow 最后通过加载windows系统的安装光盘iso, 双击setup.exe以【保…

设计模式(C++)详解——建造者模式(1)

<摘要> 建造者模式是一种创建型设计模式&#xff0c;通过将复杂对象的构建过程分解为多个步骤&#xff0c;使相同的构建过程能够创建不同的表示形式。本文从背景起源、核心概念、设计意图等角度深入解析该模式&#xff0c;结合电脑组装、文档生成等实际案例展示其实现方式…

移动端触摸事件与鼠标事件的触发机制详解

移动端触摸事件与鼠标事件的触发机制详解 在移动端开发中&#xff0c;我们经常会遇到一个现象&#xff1a;一次简单的触摸操作&#xff0c;不仅会触发touch系列事件&#xff0c;还会触发一系列mouse事件&#xff0c;最终甚至会触发click事件。这其实是浏览器为了兼容传统桌面端…

如何科学评估CMS系统性能优化效果?

为什么要评估性能优化效果&#xff1f; 在投入时间精力优化CMS系统后&#xff0c;很多开发者只凭"感觉"判断网站变快了&#xff0c;但这种主观判断往往不可靠。科学评估性能优化效果可以帮助我们&#xff1a; 量化优化成果&#xff1a;用数据证明优化的价值发现潜在问…

中控平台数据监控大屏

中控平台数据监控大屏前言&#xff1a;什么是数据大屏&#xff1f; 数据大屏就像是一个"数字仪表盘"&#xff0c;把复杂的数据用图表、动画等方式直观展示出来。想象一下汽车的仪表盘&#xff0c;能让你一眼看到速度、油量、转速等信息——数据大屏也是这个原理&…

【Vue2手录13】路由Vue Router

一、Vue Router 基础概念与核心原理 1.1 路由本质与核心要素 本质定义&#xff1a;路由是URL路径与页面组件的对应关系&#xff0c;通过路径变化控制视图切换&#xff0c;实现单页应用&#xff08;SPA&#xff09;的无刷新页面切换。核心三要素&#xff1a; router-link&#x…

【Git】零基础入门:配置与初始操作实战指南

目录 1.前言 插播一条消息~ 2.正文 2.1概念 2.2安装与配置 2.3基础操作 2.3.1创建本地仓库 2.3.2配置Git 2.3.3认识工作区&#xff0c;暂存区&#xff0c;版本库 2.3.4版本回退 2.3.5撤销修改 2.3.6删除文件 3.小结 1.前言 在 Java 开发场景中&#xff0c;团队协…

CAD多面体密堆积_圆柱体试件3D插件

插件介绍 CAD多面体密堆积_圆柱体试件3D插件可在AutoCAD内基于重力堆积算法在圆柱体容器内进行多面体的密堆积三维建模。插件采取堆积可视化交互界面&#xff0c;可观察多面体颗粒的堆积动态&#xff0c;并可采用鼠标进行多面体位置的局部微调。插件可设置重力堆积模拟时长参数…

机器学习-模型调参、超参数优化

模型调参 手工超参数微调 以一个好的baseline开始&#xff0c;即&#xff1a;在一些高质量的工具包中的默认设置&#xff0c;论文中的值调一个值&#xff0c;重新训练这个模型来观察变化重复很多次获得对以下的insight&#xff1a; 1、哪个超参数重要 2、模型对超参数的敏感度是…

STM32 单片机开发 - I2C 总线

一、IIC(I2C) 线的作用UART总线 PC端(CPU) <----------> 开发板(STM32U575RIT6)IIC总线 主控芯片(STM32U575RIT6) <---------> 传感器驱动芯片(SHT20/SI7006空气温湿度传感器)二、I2C 总线的概念图 1 I2C 总线示意图图 2 多主机多从机模式示意图I2C 总…

Redis 数据结构源码剖析(SDS、Dict、Skiplist、Quicklist、Ziplist)

Redis 数据结构源码剖析&#xff08;SDS、Dict、Skiplist、Quicklist、Ziplist&#xff09;1. 前言 Redis 的高性能与丰富数据结构密切相关。 核心数据结构包括&#xff1a; SDS&#xff08;Simple Dynamic String&#xff09;&#xff1a;字符串底层实现。Dict&#xff08;哈希…