藍橋杯 20. 壓縮變換

壓縮變換

原題目鏈接

題目描述

小明最近在研究壓縮算法。他知道,壓縮時如果能夠使數值很小,就能通過熵編碼得到較高的壓縮比。然而,要使數值變小是一個挑戰。

最近,小明需要壓縮一些正整數序列,這些序列的特點是:后面出現的數字,很可能是剛出現過不久的數字。為了壓縮這些特殊序列,小明設計了一種變換規則,來減小數值大小。


變換規則如下:

從左到右枚舉序列,對每個數字進行如下操作:

  • 如果該數字沒有出現過,將其變換為它的相反數
  • 如果該數字出現過,則找到它上一次出現的位置,計算從那次出現之后到當前位置之間出現了多少種不同的數字,并將這個種類數替換原來的數字。

示例說明:

給定序列 (1, 2, 2, 1, 2),變換過程如下:

原序列位置說明變換后值
a?1首次出現-1
a?2首次出現-2
a?2上次出現在 a?,a? 到 a? 之間無新數字0
a?1上次出現在 a?,a? 到 a? 之間有 1 個不同數字(2)1
a?2上次出現在 a?,a? 到 a? 之間有 1 個不同數字(1)1

變換后序列為:-1 -2 0 1 1


輸入描述

  • 第一行包含一個整數 n,表示序列的長度。
  • 第二行包含 n 個正整數,表示原始序列。

數據范圍

  • 1 ≤ n ≤ 10?
  • 1 ≤ a? ≤ 10?

輸出描述

輸出一行包含 n 個整數,表示變換后的序列,用空格分隔。


輸入樣例

5
1 2 2 1 2

輸出樣例

-1 -2 0 1 1

c++代碼

#include<bits/stdc++.h>
#include<stdio.h>using namespace std;class query {
public:int l, r, key;
};int n, m;
vector<int> trees, arr;
vector<query> querys;
vector<vector<int>> end_by_r;
unordered_map<int, int> mp;
vector<string> temp;
unordered_map<string, int> ans;bool mycom(query a, query b) { return a.r < b.r; }void build(int p, int l, int r) {if (l == r) {trees[p] = 1;return;}int mid = (l + r) / 2;build(2 * p, l, mid);build(2 * p + 1, mid + 1, r);trees[p] = trees[2 * p] + trees[2 * p + 1];
}void update(int p, int l, int r, int k) {if (l == r && l == k) {trees[p] = 0;return;}int mid = (l + r) / 2;if (k <= mid) update(2 * p, l, mid, k);else update(2 * p + 1, mid + 1, r, k);trees[p] = trees[2 * p] + trees[2 * p + 1];
}int ask(int p, int l, int r, int range_l, int range_r) {if (range_l <= l && range_r >= r) return trees[p];int mid = (l + r) / 2, ans = 0;if (mid >= range_l) ans += ask(2 * p, l, mid, range_l, range_r);if (mid < range_r) ans += ask(2 * p + 1, mid + 1, r, range_l, range_r);return ans;
}int main() {scanf("%d", &n);trees = vector<int>(4 * n), arr = vector<int>(n + 1), end_by_r = vector<vector<int>>(n + 1);for (int i = 1; i <= n; i++) scanf("%d", &arr[i]);build(1, 1, n);for (int i = 1; i <= n; i++) {if (mp.find(arr[i]) != mp.end()) {int x = mp[arr[i]], y = i;x++, y--;if (x <= y) {query q;q.l = x, q.r = y, q.key = querys.size();querys.push_back(q);}}mp[arr[i]] = i;}mp.clear();m = querys.size();sort(querys.begin(), querys.end(), mycom);for (int i = 0; i < m; i++) end_by_r[querys[i].r].push_back(i);for (int i = 1; i <= n; i++) {if (mp.find(arr[i]) != mp.end()) update(1, 1, n, mp[arr[i]]);mp[arr[i]] = i;for (int x : end_by_r[i]) {string s = to_string(querys[x].l) + " " + to_string(querys[x].r);ans[s] = ask(1, 1, n, querys[x].l, querys[x].r);}}mp.clear();for (int i = 1; i <= n; i++) {if (mp.find(arr[i]) == mp.end()) {mp[arr[i]] = i;arr[i] = -arr[i];}else {int x = mp[arr[i]], y = i;mp[arr[i]] = i;x++, y--;if (x > y) arr[i] = 0;else arr[i] = ans[to_string(x) + " " + to_string(y)];}}for (int i = 1; i <= n; i++) {printf("%d", arr[i]);if (i != n) printf(" ");}return 0;
}//by wqs

題目解析

我們需要設計一個算法快速求出[L,R]區間上有多少個不同的數,可以用線段樹,或者樹狀數組,莫隊算法。

線段樹法

然后就是套模版進去就行。

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

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

相關文章

element-ui多個form同時驗證,以及動態循環表單注意事項

多個form同時驗證&#xff1a; validateForm(refs) {if (!refs) {return false}return new Promise((resolve, reject) > {refs.validate().then((valid) > {resolve(valid)}).catch((val) > {resolve(false)})}) }, async handleConfirm() {Promise.all([this.valid…

Spring Boot中自定義404異常處理問題學習筆記

1. 問題背景 在Spring Boot項目中&#xff0c;需要手動返回404異常給前端。為此&#xff0c;我創建了一個自定義的404異常類UnauthorizedAccessException&#xff0c;并在全局異常處理器GlobalExceptionHandler中處理該異常。然而&#xff0c;在使用Postman測試時&#xff0c;…

你學會了些什么220622?--搭建UI自動化

jenkins訪問地址&#xff1a;http://192.168.82.129:8080/ 賬號密碼&#xff1a;admin/a123456a ***** 什么是UI自動化** 使用工具或者腳本對需要測試的軟件的前端界面在預設的條件下&#xff0c;在已有的測試數據下運行系統或者應用程序&#xff0c;并獲取其前端頁面UI顯示的…

【2025計算機網絡-面試常問】http和https區別是什么,http的內容有哪些,https用的是對稱加密還是非對稱加密,流程是怎么樣的

HTTP與HTTPS全面對比及HTTPS加密流程詳解 一、HTTP與HTTPS核心區別 特性HTTPHTTPS協議基礎明文傳輸HTTP SSL/TLS加密層默認端口80443加密方式無加密混合加密&#xff08;非對稱對稱&#xff09;證書要求不需要需要CA頒發的數字證書安全性易被竊聽、篡改、冒充防竊聽、防篡改…

JavaFX 第一篇 Hello World

1、簡介 JavaFX 是一個用于構建客戶端應用程序的 Java 庫&#xff0c;作為 Java 標準庫的一部分&#xff08;JDK 8 到 10&#xff09;&#xff0c;從 JDK 11 開始&#xff0c;JavaFX 將以獨立模塊發布&#xff0c;將不再包含在 JDK標準庫中&#xff0c;他是 Java 應用程序開發的…

SQL實戰:02之連續數問題求解

文章目錄 概述題目:體育館的人流量題解步驟一&#xff1a;構造出一個連續序列步驟二&#xff1a;找出符合條件的組的序號步驟三&#xff1a;fetch結果&#xff0c;使用內連接過濾出符合條件的記錄。完整SQL 題目二&#xff1a;連續出現的數字題解步驟一&#xff1a;分區并構建連…

STM32 的 GPIO和中斷

GPIO的簡單介紹 內部結構 施密特觸發器&#xff08;TTL肖特基觸發器&#xff09; 的工作原理&#xff1a; 施密特觸發電路&#xff08;簡稱&#xff09;是一種波形整形電路&#xff0c;當任何波形的信號進入電路時&#xff0c;輸出在正、負飽和之間跳動&#xff0c;產生方波或…

Server - 優雅的配置服務器 Bash 環境(.bashrc)

歡迎關注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/147335592 免責聲明&#xff1a;本文來源于個人知識與公開資料&#xff0c;僅用于學術交流&#xff0c;歡迎討論&#xff0c;不支持轉載。 登錄服…

使用PyTorch實現圖像增廣與模型訓練實戰

本文通過完整代碼示例演示如何利用PyTorch和torchvision實現常用圖像增廣方法&#xff0c;并在CIFAR-10數據集上訓練ResNet-18模型。我們將從基礎圖像變換到復雜數據增強策略逐步講解&#xff0c;最終實現一個完整的訓練流程。 一、圖像增廣基礎操作 1.1 準備工作 #matplotli…

解決Mac 安裝 PyICU 依賴失敗

失敗日志&#xff1a; 解決辦法 1、使用 homebrew 安裝相關依賴 brew install icu4c 安裝完成后&#xff0c;設置環境變量 echo export PATH"/opt/homebrew/opt/icu4c77/bin:$PATH" >> ~/.zshrcecho export PATH"/opt/homebrew/opt/icu4c77/sbin:$PATH…

Springboot后端查詢參數接收

1.實現方式 假設前端發送的接口&#xff1a; /users?nameJohn&age30 后端怎么接收里面的name和age呢&#xff1f;以及再發別的參數后端怎么接收呢&#xff1f; 1.比較簡單的方式 當控制器方法的參數類型是簡單類型&#xff08;如 String、Integer、Long 等&#xff09…

桌面應用中VUE使用新瀏覽器窗口打開頁面

1、瀏覽器應用忽略此方式&#xff0c;可任意方式打開。針對桌面應用設置 newWindowClick(){try {this.fileUrl "";this.params.year ""this.params.date ""axios({method: post,url: /url/pdf/preview,data: this.params,}).then(res> {t…

華為手機怎么進行音頻降噪?音頻降噪技巧分享:提升聽覺體驗

在當今數字化時代&#xff0c;音頻質量對于提升用戶體驗至關重要&#xff0c;無論是在通話、視頻錄制還是音頻文件播放中&#xff0c;清晰的音頻都能帶來更佳的聽覺享受。 而華為手機憑借其強大的音頻處理技術&#xff0c;為用戶提供了多種音頻降噪功能&#xff0c;幫助用戶在…

【數據可視化-22】脫發因素探索的可視化分析

?? 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN人工智能領域的優質創作者,提供AI相關的技術咨詢、項目開發和個…

青少年編程與數學 02-018 C++數據結構與算法 06課題、樹

青少年編程與數學 02-018 C數據結構與算法 06課題、樹 一、樹(Tree)1. 樹的定義2. 樹的基本術語3. 常見的樹類型4. 樹的主要操作5. 樹的應用 二、二叉樹(Binary Tree)1. 二叉樹的定義2. 二叉樹的基本術語3. 二叉樹的常見類型4. 二叉樹的主要操作5. 二叉樹的實現代碼說明輸出示例…

【論文閱讀】Visual Instruction Tuning

文章目錄 導言1、論文簡介2、論文主要方法3、論文針對的問題4、論文創新點總結 導言 本論文介紹了一個新興的多模態模型——LLaVA&#xff08;Large Language and Vision Assistant&#xff09;&#xff0c;旨在通過指令調優提升大型語言模型&#xff08;LLM&#xff09;在視覺…

【學習筆記】Cadence電子設計全流程(三)Capture CIS 原理圖繪制(下)

【學習筆記】Cadence電子設計全流程&#xff08;三&#xff09;Capture CIS 原理圖繪制&#xff08;下&#xff09; 3.16 原理圖中元件的編輯與更新3.17 原理圖元件跳轉與查找3.18 原理圖常見錯誤設置于編譯檢查3.19 低版本原理圖文件輸出3.20 原理圖文件的鎖定與解鎖3.21 Orca…

js使用IntersectionObserver實現目標元素可見度的交互

文章目錄 1、前言2、代碼實現3、使用場景4、兼容性5、成熟的Hooks推薦 1、前言 IntersectionObserver 是瀏覽器原生提供的一個Api。可以"觀察"我們的元素是否可見&#xff0c;原理是判斷目標元素與可見區域的交叉比例&#xff0c;所以也被稱為"交叉觀察器"…

linux 中斷子系統 層級中斷編程

虛擬中斷控制器代碼&#xff1a; #include<linux/kernel.h> #include<linux/module.h> #include<linux/clk.h> #include<linux/err.h> #include<linux/init.h> #include<linux/interrupt.h> #include<linux/io.h> #include<linu…

蝦皮(Shopee)商品詳情 API 接口概述及 JSON 數據返回參考

前言 一、接口概述 Shopee 商品詳情 API 接口是 Shopee 平臺為開發者提供的&#xff0c;用于獲取商品詳細信息的接口服務。通過該接口&#xff0c;開發者可以獲取商品的標題、價格、庫存、描述、圖片、規格參數、銷量、評價等詳細信息。這些數據為電商數據分析、商品比價工具…