【一百一十】【算法分析與設計】[SDOI2009] HH的項鏈,樹狀數組應用,查詢區間的種類數,樹狀數組查詢區間種類數

P1972 [SDOI2009] HH的項鏈

[SDOI2009] HH的項鏈

題目描述

HH 有一串由各種漂亮的貝殼組成的項鏈。HH 相信不同的貝殼會帶來好運,所以每次散步完后,他都會隨意取出一段貝殼,思考它們所表達的含義。HH
不斷地收集新的貝殼,因此,他的項鏈變得越來越長。

有一天,他突然提出了一個問題:某一段貝殼中,包含了多少種不同的貝殼?這個問題很難回答……
因為項鏈實在是太長了。于是,他只好求助睿智的你,來解決這個問題。

輸入格式

一行一個正整數 n n n,表示項鏈長度。 第二行 n n n 個正整數 a i a_i ai?,表示項鏈中第 i i i 個貝殼的種類。

第三行一個整數 m m m,表示 HH 詢問的個數。 接下來 m m m 行,每行兩個整數 l , r l,r l,r,表示詢問的區間。

輸出格式

輸出 m m m 行,每行一個整數,依次表示詢問對應的答案。

樣例 #1

樣例輸入 #1

6 1 2 3 4 3 5 3 1 2 3 5 2 6

樣例輸出 #1

2 2 4

提示

【數據范圍】

對于 20 % 20\% 20% 的數據, 1 ≤ n , m ≤ 5000 1\le n,m\leq 5000 1n,m5000; 對于 40 % 40\% 40% 的數據, 1 ≤ n , m ≤ 1 0 5 1\le n,m\leq 10^5 1n,m105; 對于 60 % 60\% 60% 的數據, 1 ≤ n , m ≤ 5 × 1 0 5 1\le n,m\leq 5\times 10^5 1n,m5×105; 對于 100 % 100\% 100%
的數據, 1 ≤ n , m , a i ≤ 1 0 6 1\le n,m,a_i \leq 10^6 1n,m,ai?106 1 ≤ l ≤ r ≤ n 1\le l \le r \le n 1lrn

本題可能需要較快的讀入方式,最大數據點讀入數據約 20MB

在這里插入圖片描述
用count數組記錄每一個位置種類數,實際上每一個位置都算作是1.
如果每一個位置都是1.
在這里插入圖片描述
計算1~ 4區間的種類數是1~ 4區間count數組的累加和結果.
因為1~ 4區間中的種類數全部都沒有出現重復的情況.
但是如果要計算3~ 5區間的種類數是多少,那么就需要對3和5哪一個位置進行去重的處理.

如果我們查詢的區間是l~ r.
在這里插入圖片描述
1表示重復的種類的1出現的位置,那么打叉的地方是需要進行去重的,打勾的地方是可以選擇保留的地方.
針對于第三種情況,r右邊出現的1我們并不關心,因為一定不在查詢區間中.
因此可以按照查詢的右區間從小到大排序,只維護r左邊count值即可.
現在我們就只需要維護好r左邊的count值就可以了.
也就是第一種情況和第二種情況,第二種情況因為都在區間內,所以不管去掉哪一個都可以,但是第一種情況只能去掉左邊的.
因此我們可以按照這樣的規則,只保留最右邊的1.因為如果包含最右邊的1,其他的可以被代替,如果沒有包含最右邊的1,其他的1也沒有意義.
所以只需要關心最右邊的1即可.

按照查詢的右區間進行排序,然后只維護r左邊的count值.
當前位置是i=1位置,然后維護1~ r區間的count值,每一次都添加1,但是每一次遍歷i位置的時候需要考慮是否需要去重操作.
也就是需要查詢arr[i]元素最右側的1是否出現,如果出現了就需要先減少1.

在這里插入圖片描述
第一次查詢結果是count數組1~ 2累加和,答案是2
在這里插入圖片描述
當i遍歷到5的時候,我們查詢map_left發現5位置的元素3之前出現過,位置是3,所以需要進行去重操作,將3位置count值減少1,然后5位置count值增加1.并且將維護arr_left值,元素3最右邊的下標是5.
在這里插入圖片描述
此時查詢3~ 5區間的種類數是count3~ 5區間累加和,答案是2.
在這里插入圖片描述
查詢2~ 6區間的種類數,也就是count2~ 6區間累加和,答案是4.

#include<bits/stdc++.h>
using namespace std;#define int long long // 將 int 定義為 long long 類型
#define endl '\n' // 將 endl 定義為換行符int n; // 定義整數 n,表示數組長度
vector<int>arr; // 定義一個整型向量 arr,用于存儲數組元素
int q; // 定義整數 q,表示查詢次數
struct node {int l, r, index; // 定義結構體 node,包含三個整型變量 l, r 和 index
};
vector<node>readd; // 定義一個 node 類型的向量 readd,用于存儲查詢
map<int, int>arr_left; // 定義一個映射 arr_left,用于記錄元素上次出現的位置
class Tree {
public:vector<int>tree; // 定義一個整型向量 tree,用于樹狀數組int lowbit(int i) { // 返回 i 的最低位 1 的值return i & -i;}void sett(int i, int v) { // 在樹狀數組中更新值while (i < tree.size()) {tree[i] += v;i += lowbit(i);}}int gett(int i) { // 獲取前 i 項的和int ret = 0;while (i > 0) {ret += tree[i];i -= lowbit(i);}return ret;}int range(int l, int r) { // 獲取區間 [l, r] 的和return gett(r) - gett(l - 1);}
};
Tree t1; // 定義一個 Tree 類的對象 t1
void init() { // 初始化函數cin >> n; // 輸入數組長度arr.assign(n + 1, 0); // 將數組大小設為 n+1,并初始化為 0for (int i = 1; i <= n; i++) {cin >> arr[i]; // 輸入數組元素}readd.clear(); // 清空 readd 向量cin >> q; // 輸入查詢次數for (int i = 1; i <= q; i++) {int l, r;cin >> l >> r; // 輸入每個查詢的左右邊界readd.push_back({ l,r,i }); // 將查詢添加到 readd 向量中}
}
vector<int>ret; // 定義整型向量 ret,用于存儲結果
void solve() {sort(readd.begin(), readd.end(), [](const node& a, const node& b) { // 按照查詢的右邊界 r 進行排序return a.r < b.r;});ret.assign(q + 1, -1); // 將 ret 大小設為 q+1,并初始化為 -1t1.tree.assign(arr.size() + 1, 0); // 初始化樹狀數組arr_left.clear(); // 清空 arr_left 映射int i = 1;for (auto& xx : readd) {int l = xx.l, r = xx.r, index = xx.index; // 取出每個查詢的 l, r 和 indexwhile (i <= r) {if (arr_left.count(arr[i])) { // 如果元素已在 arr_left 中記錄過int index1 = arr_left[arr[i]]; // 取出上次出現的位置t1.sett(index1, -1); // 在樹狀數組中將該位置的值減 1}arr_left[arr[i]] = i; // 更新 arr_left 中該元素的最新位置t1.sett(i, 1); // 在樹狀數組中將當前元素位置的值加 1i++;}ret[index] = t1.range(l, r); // 計算區間 [l, r] 的和并存儲在 ret 中}for (int i = 1; i < ret.size(); i++) {cout << ret[i] << endl; // 輸出每個查詢的結果}}signed main() {ios::sync_with_stdio(0), cin.tie(), cout.tie(0); // 加速輸入輸出init(); // 調用初始化函數solve(); // 調用解決函數
}

結尾

最后,感謝您閱讀我的文章,希望這些內容能夠對您有所啟發和幫助。如果您有任何問題或想要分享您的觀點,請隨時在評論區留言。
同時,不要忘記訂閱我的博客以獲取更多有趣的內容。在未來的文章中,我將繼續探討這個話題的不同方面,為您呈現更多深度和見解。
謝謝您的支持,期待與您在下一篇文章中再次相遇!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24515.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24515.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24515.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SMS - 基于阿里云實現手機短信驗證碼登錄(無需備案,非測試)

目錄 SMS 環境調試 從阿里云云市場中購買第三方短信服務 調試短信驗證碼功能 實戰開發 封裝組件 對外接口 調用演示 SMS 環境調試 從阿里云云市場中購買第三方短信服務 a&#xff09;進入阿里云首頁&#xff0c;然后從云市場中找到 “短信” &#xff08;一定要從 云…

如何實現網站HTTPS訪問

在當今網絡安全至關重要的時代&#xff0c;HTTPS已經成為網站安全的基本標準。HTTPS&#xff08;超文本傳輸安全協議&#xff09;通過在HTTP協議基礎上加入SSL加密層&#xff0c;確保了數據在用戶瀏覽器和服務器之間的傳輸是加密的&#xff0c;有效防止數據被竊取或篡改&#x…

calico node一直not ready

背景 我司某個大數據集群在做完添加到集群聯邦管理后&#xff0c;該集群的calico-node全部處于not ready 狀態&#xff0c;導致集群中節點之前的跨節點容器網絡不通。 操作 將大數據所在的k8s集群添加到集群聯邦的控制平面后&#xff0c;我們為了做各個子集群之間的容器網絡…

換熱器設計參數的選用

1 換熱管類型 光管&#xff1a;適用于任何條件&#xff1b;應用面廣 螺紋管&#xff1a;殼程流體的膜傳熱系數相當于管程傳熱系數1/3~3/5的場合&#xff1b;強化殼程傳熱系數&#xff0c;提高總傳熱系數&#xff1b;結垢速率低&#xff0c;結垢周期長。 波紋管&#xff1a;管…

使用 PAI-DSW x Free Prompt Editing圖像編輯算法,開發個人AIGC繪圖小助理

教程簡述 在本教程中&#xff0c;您將學習在阿里云交互式建模平臺PAI-DSW x Free Prompt Editing&#xff08;CVPR2024中選論文算法&#xff09;圖像編輯算法&#xff0c;開發個人AIGC繪圖小助理&#xff0c;實現文本驅動的圖像編輯功能單卡即可完成AIGC圖片風格變化、背景變化…

Java 的分支

分支控制有三種&#xff1a;單分支&#xff0c;雙分支&#xff0c;多分支。 單分支 基本語法&#xff1a; if (條件表達式){執行代碼塊; }程序示例&#xff1a; import java.util.Scanner;public class If01 {public static void main(String[] args) {Scanner sc new Sca…

【JAVA WEB實用技巧與優化方案】如何通過javacore、heapdump來排查JVM線程和內存問題

文章目錄 介紹什么是javacore ? javacore可以用來做哪些分析?什么是HeapDump?一、輸出JAVACORE 和 DUMP文件1.輸出JAVACORE通過`kill -3 [pid]` 來輸出javacore通過jstack 輸出Javacore文件2.輸出 dump 文件二、javacore文件和heapdump文件的分析工具使用詳情javacore 工具i…

Cesium開發環境搭建(一)

1.下載安裝Node.js 進入官網地址下載安裝包 Node.js — Download Node.js https://cdn.npmmirror.com/binaries/node/ 選擇對應你系統的Node.js版本&#xff0c;這里我選擇的是Windows系統、64位 安裝完成后&#xff0c;WINR&#xff0c;輸入node --version&#xff0c;顯示…

React + SpringBoot實現圖片預覽和視頻在線播放,其中視頻實現切片保存和分段播放

圖片預覽和視頻在線播放 需求描述 實現播放視頻的需求時&#xff0c;往往是前端直接加載一個mp4文件&#xff0c;這樣做法在遇到視頻文件較大時&#xff0c;容易造成卡頓&#xff0c;不能及時加載出來。我們可以將視頻進行切片&#xff0c;然后分段加載。播放一點加載一點&am…

tcp aimd 窗口的推導

舊事重提&#xff0c;今天用微分方程的數值解觀測 tcp aimd 窗口值。 設系統 AI&#xff0c;MD 參數分別為 a 1&#xff0c;b 0.5&#xff0c;丟包率由 buffer 大小&#xff0c;red 配置以及線路誤碼率共同決定&#xff0c;設為 p&#xff0c;窗口為 W&#xff0c;則有&…

云原生技術助力某國際化商業集團打造數字化轉型新引擎

某國際化商業集團&#xff08;以下簡稱&#xff1a;集團&#xff09;&#xff0c;成立于1988年&#xff0c;現已發展成為擁有總資產800多億元&#xff0c;員工13000多人&#xff0c;涵蓋港口碼頭、石油化工、國際貿易等產業于一體的國際化現代化企業集團&#xff0c;連續多年進…

HAL STM32F1 通過查表方式實現SVPWM驅動無刷電機測試

HAL STM32F1 通過查表方式實現SVPWM驅動無刷電機測試 &#x1f4cd;相關篇《基于開源項目HAL STM32F4 DSP庫跑SVPWM開環速度測試》 ?針對STM32F1系列&#xff0c;沒有專門的可依賴的DSP庫&#xff0c;為了實現特定函數的浮點運算快速計算&#xff0c;通過查表方式來實現&#…

番外篇 | 利用華為2023最新Gold-YOLO中的Gatherand-Distribute對特征融合模塊進行改進

前言:Hello大家好,我是小哥談。論文提出一種改進的信息融合機制Gather-and-Distribute (GD) ,通過全局融合多層特征并將全局信息注入高層,以提高YOLO系列模型的信息融合能力和檢測性能。通過引入MAE-style預訓練方法,進一步提高模型的準確性。?? 目錄 ??1.論文解…

如何解鎖植物大戰僵尸雜交版v2.0.88所有植物

如何解鎖植物大戰僵尸雜交版v2.0.88所有植物 前言安裝相關軟件快速解鎖方法 前言 經過探索植物大戰僵尸雜交版植物解鎖和關卡有關&#xff0c;所以通過所有關卡就可以解鎖所有植物。 安裝相關軟件 1.安裝植物大戰僵尸 2.安裝Hex Editor Neo 快速解鎖方法 本文參考如何修改…

<vs2022><問題記錄>visual studio 2022使用console打印輸出時,輸出窗口不顯示內容

前言 本文為問題記錄。 問題概述 在使用visual studio 2022編寫代碼時&#xff0c;如C#&#xff0c;在代碼中使用console.writeline來打印某些內容&#xff0c;以便于觀察&#xff0c;但發現輸出窗口不顯示&#xff0c;而代碼是完全沒有問題的。 解決辦法 根據網上提供的辦法…

深入解析力扣183題:從不訂購的客戶(LEFT JOIN與子查詢方法詳解)

在本篇文章中&#xff0c;我們將詳細解讀力扣第183題“從不訂購的客戶”。通過學習本篇文章&#xff0c;讀者將掌握如何使用SQL語句來解決這一問題&#xff0c;并了解相關的復雜度分析和模擬面試問答。每種方法都將配以詳細的解釋&#xff0c;以便于理解。 問題描述 力扣第18…

Java Web學習筆記23——Vue項目簡介

Vue項目簡介&#xff1a; Vue項目-創建&#xff1a; 命令行&#xff1a;vue create vue-project01 圖形化界面&#xff1a;vue ui 在命令行中切換到項目文件夾中&#xff0c;然后執行vue ui命令。 只需要路由功能。這個路由功能&#xff0c;開始不是很理解。 創建項目部保存…

html+css示例

HTML HTML&#xff08;超文本標記語言&#xff09;和CSS&#xff08;層疊樣式表&#xff09;是構建和設計網頁的兩種主要技術。HTML用于創建網頁的結構和內容&#xff0c;而CSS用于控制其外觀和布局。 HTML基礎 HTML使用標簽來標記網頁中的不同部分。每個標簽通常有一個開始…

【原創】海為PLC與RS-WS-ETH-6傳感器的MUDBUS_TCP通訊

點擊“藍字”關注我們吧 一、關于RS-WS-ETH-6傳感器的準備工作 要完成MODBUS_TCP通訊,我們必須要知道設備的IP地址如何分配,只有PLC和設備的IP在同一網段上,才能建立通訊。然后還要選擇TCP的工作模式,來建立設備端和PC端的端口號。接下來了解設備的報文格式,方便之后發送…

前端:快捷 復制chrome 控制臺打印出來的 數組對象

程序中console.log出來的對象。按照以下步驟操作 1.右鍵點擊需要處理的對象&#xff0c;會出現Store as global variable&#xff0c;點擊 2.點擊 Store as global variable 控制臺會出現 3.在控制臺 輸入 copy(temp1) 這樣對象就復制到了你的黏貼面板里面 在代碼中直接 c…