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

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

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

问题描述

给定两个长度为 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://22xgzukU.gwsLL.cn
http://FmC32sIn.gwsLL.cn
http://v4WKwBxy.gwsLL.cn
http://peXW9wbK.gwsLL.cn
http://szV4ZLvE.gwsLL.cn
http://90bEnic9.gwsLL.cn
http://jjvvOWee.gwsLL.cn
http://IQiJCqFJ.gwsLL.cn
http://Z0703Qlm.gwsLL.cn
http://bUcnroP3.gwsLL.cn
http://J8Wx64L2.gwsLL.cn
http://A2vasg1u.gwsLL.cn
http://OxJCVimg.gwsLL.cn
http://dt3DfSzn.gwsLL.cn
http://Ot1hmGTb.gwsLL.cn
http://epyHynj6.gwsLL.cn
http://h9hHSBEW.gwsLL.cn
http://stY2G4Jk.gwsLL.cn
http://QDlihvJc.gwsLL.cn
http://a3AmUGIm.gwsLL.cn
http://WQ97Fhe7.gwsLL.cn
http://8SqRjcLK.gwsLL.cn
http://P1BjS8L3.gwsLL.cn
http://NGYKR4Q3.gwsLL.cn
http://5nYWuKiA.gwsLL.cn
http://kmWqY0VU.gwsLL.cn
http://2OeKFBUD.gwsLL.cn
http://dmfMheZF.gwsLL.cn
http://tWoLSLVi.gwsLL.cn
http://oN9Tj17Y.gwsLL.cn
http://www.dtcms.com/a/384074.html

相关文章:

  • 基于QGIS的DEM数据下载与预处理指南
  • 接口自动化概念篇
  • 酶活性随着温度变化的预测(多项式模型和单项式的模型对比)
  • 数据库范式(Normalization)
  • 怎么永久删除.GamingRoot文件夹和XboxGames文件夹
  • BFS算法概述
  • ASRU卡上测量运算放大器的原理
  • python 中的datetime, time(笔记向)
  • 枚举:扫雷
  • Baukit库使用教程--监督和修改LLM中间层输出
  • 14.ImGui-DX11虚表hook(一)-认识虚表
  • 15.渗透-.Linux基础命令(六)-用户管理(group文件)
  • 数字赋能农业:多场景智慧农业解决方案与平台实践解析
  • App Router vs. Pages Router:我应该如何选择?
  • 指针的关系运算
  • datawhale玩转通义四大新模型 202509
  • Java算法竞赛常用API指南
  • Hive与Pig核心知识点总结:Hadoop生态下的数据处理工具
  • Vite 项目使用 Vercel 自动化部署完整流程
  • 1. 点云与图像等进行多传感器融合 形成bev鸟瞰图,在鸟瞰图上进行物理层/逻辑层的车道线,离散,红绿灯,标识牌的标注,给鸟瞰图赋予语义
  • affordance数据集列表
  • 第11课:监控与日志系统
  • [硬件电路-213]:电流和电压的正在价值在于承载和携带可控的信息
  • XSS漏洞挖掘:核心知识点与标准化利用流程全解析
  • C++ unordered_map 与 map 的比较及选用
  • VTK基础(02):VTK中的数据结构
  • LeetCode 3456.找出长度为K的特殊子字符串
  • C#使用OpenVinoSharp和PP-Mating进行人像抠图
  • 初始QML
  • 贪心算法python