樹形數據結構之樹狀基礎-算法賽

今天給分享的是一道算法決賽的題目,這道題目的綜合要求比較高,希望大家可以好好理解,同時這道題用到的是樹狀樹形結構的有關知識。可以用這幾天學的相關內容結合起來。

問題描述

給定兩個長度為?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
英文地址,請注明出處:http://en.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;哈希…