統計子矩陣

一、題目描述

P8783 [藍橋杯 2022 省 B] 統計子矩陣

二、算法簡析

2.1 二維前綴和

我們知道,只要確定了矩陣的左上頂點和右下頂點,一個矩陣就被固定了。因此,我們可以遍歷這兩個頂點,達到遍歷所有子矩陣的目的,復雜度會達到 O ( N 2 ? M 2 ) O(N^2*M^2) O(N2?M2)。確定了子矩陣,就要判斷子矩陣的值是否不大于 K K K。 如何能高效地得到子矩陣的值呢?答案是二維前綴和
與普通的前綴和不同,二維前綴和 psum[i][j] = \text{psum[i][j]}= psum[i][j]= 左上頂點 ( 1 , 1 ) (1, 1) (1,1)、右下頂點 ( i , j ) (i, j) (i,j) 確定的子矩陣的值。通過以下表達式,可以得到二維前綴和:

psum[i][j]?=?psum[i][j?-?1]?+?psum[i?-?1][j]?-?psum[i?-?1][j?-?1]?+?A[i][j] \text{psum[i][j] = psum[i][j - 1] + psum[i - 1][j] - psum[i - 1][j - 1] + A[i][j]} psum[i][j]?=?psum[i][j?-?1]?+?psum[i?-?1][j]?-?psum[i?-?1][j?-?1]?+?A[i][j]

有了二維前綴和,就可以以 O ( 1 ) O(1) O(1) 確定左上角 ( x 1 , y 1 ) (x1, y1) (x1,y1)、右下角 ( x 2 , y 2 ) (x2, y2) (x2,y2) 的子矩陣的值:

matrix_val?=?psum[x2][y2]?-?psum[x1?-?1][y2]?-?psum[x2][y1?-?1]?+?psum[x1?-?1][y1?-?1] \text{matrix\_val = psum[x2][y2] - psum[x1 - 1][y2] - psum[x2][y1 - 1] + psum[x1 - 1][y1 - 1]} matrix_val?=?psum[x2][y2]?-?psum[x1?-?1][y2]?-?psum[x2][y1?-?1]?+?psum[x1?-?1][y1?-?1]

但是,該算法的復雜度仍然有 O ( N 2 ? M 2 ) O(N^2*M^2) O(N2?M2),會 LTE


2.2 壓縮維度 + 雙指針

壓縮維度:我們可以把二維矩陣壓縮至一維:畫兩條線,high 表示矩陣上界(左上點只能在該行)、low表示矩陣下界(右下點只能在該行)。因此,由 highlow 確定的子矩陣只能由列矩陣組合而成,所以按列壓縮,即按列求和。
圖1
通過遍歷 highlow,我們可以得到所有組成子矩陣的列矩陣。

雙指針:通過上文的壓縮,我們得到了“子矩陣的零件”。為了得到該情況下的所有子矩陣,肯定要用雙指針遍歷壓縮數組,得到所有組合方式。

int B[4];   // 壓縮后的結果for (int i = 0; i < 4; i++)for (int j = i; j < 4; j++)\\ ...

顯然,指針 j 發生了回溯,導致復雜度達到了 O ( n 2 ) O(n^2) O(n2)。如何避免發生回溯呢?利用單調性,我們可以把復雜度降為 O ( n ) O(n) O(n)
我們規定 area(left,?right)?=?B[left]?+?B[left?+?1]?+?...?+?B[right] \text{area(left, right) = B[left] + B[left + 1] + ... + B[right]} area(left,?right)?=?B[left]?+?B[left?+?1]?+?...?+?B[right]
area(left,?right)?<=?K \text{area(left, right) <= K} area(left,?right)?<=?K left?+?1?<=?right \text{left + 1 <= right} left?+?1?<=?right,則 area(left?+?1,?right)?<=?K \text{area(left + 1, right) <= K} area(left?+?1,?right)?<=?K
area(left,?right)?>?K \text{area(left, right) > K} area(left,?right)?>?K right?+?1?<=?M \text{right + 1 <= M} right?+?1?<=?M,則 area(left,?right?+?1)?>?K \text{area(left, right + 1) > K} area(left,?right?+?1)?>?K
顯然, area(left,?right) \text{area(left, right)} area(left,?right) left \text{left} left 單調遞減,隨 right \text{right} right 單調遞增

利用單調性,我們可以得到以下結果:

  • 1、隨 left \text{left} left 單調遞減,若 area(left,?right)?<=?K \text{area(left, right) <= K} area(left,?right)?<=?K,則一共有 right?-?left?+?1 \text{right - left + 1} right?-?left?+?1 種組合方式。
  • 2、我們只需要遍歷 right 就能得到所有子矩陣。因為單調性,若 area(left,?right)?>?K \text{area(left, right) > K} area(left,?right)?>?K,只需要 left++ \text{left++} left++,直到 area(left,?right)?<=?K \text{area(left, right) <= K} area(left,?right)?<=?K
int B[4];   // 壓縮后的結果int left = 1, right = 1;
ll tmp = 0;
for (; right <= 4; right++)
{tmp += B[right];if (tmp <= K)ans += right - left + 1;else{while (tmp > K){tmp -= B[left];left++;	}ans += right - left + 1;}	
} 

三、AC代碼

#include <bits/stdc++.h>using namespace std;const int MAX = 505;
typedef long long ll;int A[MAX][MAX], N, M, K;
ll ans, psum[MAX][MAX], B[MAX];int quickin(void)
{int ret = 0;char ch = getchar();while (ch < '0' || ch > '9')ch = getchar();while (ch >= '0' && ch <= '9' && ch != EOF){ret = ret * 10 + ch - '0';ch = getchar();}return ret;
}void init(void)
{for (int i = 1; i <= N; i++)for (int j = 1; j <= M; j++)psum[i][j] = psum[i - 1][j] + A[i][j];
}void solve(void)
{for (int high = 1; high <= N; high++){for (int low = high; low <= N; low++){for (int i = 1; i <= M; i++)B[i] = psum[low][i] - psum[high - 1][i];int left = 1, right = 1;ll tmp = 0;for (; right <= M; right++){tmp += B[right];if (tmp <= K)ans += right - left + 1;else{while (tmp > K){tmp -= B[left];left++;	}ans += right - left + 1;}	} }}cout << ans << endl;
}int main()
{#ifdef LOCALfreopen("test.in", "r", stdin);#endifN = quickin(), M = quickin(), K = quickin();for (int i = 1; i <= N; i++)for (int j = 1; j <= M; j++)A[i][j] = quickin();init();solve();return 0;
}

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

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

相關文章

AutoSAR(基礎入門篇)12.5-Dem

目錄 一、Dem簡介 二、Dem消抖 1、計數模式 1. 普通增減計數 2. 反向歸零增減模式

在微服務整合dubbo,以為微服務版的若依為例

在微服務整合dubbo&#xff0c;以為微服務版的若依為例 一、環境二、整合過程1、父模塊依賴2、生產者3、消費者 三、修改若依的服務調用方式為dubbo1、改造系統模塊2、改造認證授權中心 四、整合過程遇到的問題1、出現循環引用2、出現依賴沖突3、啟動出現端口號被占用4、出現某…

UVa11726 Crime Scene

題目鏈接 UVa11726 - Crime Scene 題意 給定n&#xff08;n≤100&#xff09;個物體&#xff0c;每個物體都是一個圓或者k&#xff08;k≤10&#xff09;邊形&#xff0c;用長度盡量小的繩子把它們包圍起來。 分析 孟加拉國Manzurur Rahman Khan (Sidky)大神出的難題&#xff…

MySQL 核心模塊揭秘 | 07 期 | 二階段提交 (1) prepare 階段

二階段提交的 prepare 階段&#xff0c;binlog 和 InnoDB 各自會有哪些動作&#xff1f; 本文基于 MySQL 8.0.32 源碼&#xff0c;存儲引擎為 InnoDB。 1. 二階段提交 二階段提交&#xff0c;顧名思義&#xff0c;包含兩個階段&#xff0c;它們是&#xff1a; prepare 階段。…

springboot-基礎-eclipse配置+helloword示例

備份筆記。所有代碼都是2019年測試通過的&#xff0c;如有問題請自行搜索解決&#xff01; 下一篇&#xff1a;springboot-基礎-添加model和controller的簡單例子常用注解含義 目錄 配置helloword示例新建項目創建文件 配置 spring boot官方有定制版eclipse&#xff0c;也就是…

BUUCTF AWD-Test1

打開靶場是這個有些簡陋的界面。 隨便點點&#xff0c;找到這個東西。 看到ThinkPHP&#xff0c;思路瞬間清晰&#xff0c;老熟人了。這個就是ThinkPHP漏洞。根據版本我們去找一下poc。 /index.php/?sIndex/\think\View/display&content%22%3C?%3E%3C?php%20phpinfo();…

SHELL 腳本: 導出NEO4j DUMP并上傳SFTP

前提 開通sftp賬號 安裝expect 示例 NEO4J_HOME/path/to/neo4j # neo4j 安裝目錄 DUMP_PATH/data/dump # DUMP本地保存目錄 DUMP_FILEneo4j_$(date %F).dump #導出文件名稱 UPLOAD_DIR/path/to/stfp/dump/ #上傳目錄 $NEO4J_HOME/bin/neo4j-admin dump --databaseneo4j --t…

Vue-5

Vue 3 的優勢 更容易維護&#xff08;組合式API&#xff09;更快的速度更小的體積更優的數據響應 創建 Vue 3 項目 前提環境條件&#xff1a;已安裝 16.0 或更高版本的 Node.js node -v創建一個 Vue 應用&#xff08;下面的指令將會安裝并執行 create-vue &#xff09; np…

服務端向客戶端推送數據的實現方案

在日常的開發中&#xff0c;我們經常能碰見服務端需要主動推送給客戶端數據的業務場景&#xff0c;比如數據大屏的實時數據&#xff0c;比如消息中心的未讀消息&#xff0c;比如聊天功能等等。 本文主要介紹SSE的使用場景和如何使用SSE。 服務端向客戶端推送數據的實現方案有哪…

MySQL 自增列解析(Auto_increment)

MySQL數據庫為列提供了一種自增屬性&#xff0c;當列被定義為自增時。Insert語句對該列即使不提供值&#xff0c;MySQL也會自動為該列生成遞增的唯一標識&#xff0c;因此這個特性廣泛用于主鍵的自動生成。 一、自增列的用法 自增列具有自動生成序列值&#xff0c;整型&#…

職責鏈模式(Chain of Responsibility Pattern)

定義 職責鏈模式&#xff08;Chain of Responsibility Pattern&#xff09;是一種行為設計模式&#xff0c;它允許對象接收請求并將其沿著處理者鏈傳遞&#xff0c;直到有一個處理者處理它為止。職責鏈模式通過將請求的處理邏輯分布 在職責鏈模式中&#xff0c;通常包含以下幾…

MYSQL04高級_邏輯架構剖析、查詢緩存、解析器、優化器、執行器、存儲引擎

文章目錄 ①. 邏輯架構剖析②. 服務層 - 查詢緩存③. 服務層 - 解析器④. 服務層 - 優化器⑤. 服務層 - 執行器⑥. MySQL8執行原理 ①. 邏輯架構剖析 ①. 服務器處理客戶端請求 ②. 連接層 系統(客戶端)訪問MySQL服務器前,做的第一件事就是建立TCP連接經過三次握手建立連接成…

Linux使用C語言實現通過互斥鎖限制對共享資源的訪問

互斥鎖限制共享資源的訪問 主線程中有兩個線程&#xff0c;分別輸出信息。 #include <stdio.h> #include <pthread.h> #include <unistd.h>int g_data0;void* fun1(void *arg) {printf("t1&#xff1a;%ld thread is create\n", (unsigned long)…

大宋咨詢數據研究在汽車新品上市中的核心作用

隨著汽車行業的快速變革&#xff0c;數據研究已經成為新品上市流程中的不可或缺的一環。從市場定位、產品規劃到營銷策略&#xff0c;數據研究不僅為汽車企業提供了獨特的洞察&#xff0c;還為其提供了決策依據&#xff0c;確保新品在競爭激烈的市場中取得優勢。在這一領域&…

Kubernetes IoTDB系列 | IoTDB搭建 | v1.3.0

目錄 一、IoTDB 介紹二、k8s 部署 IoTDB一、IoTDB 介紹 IoTDB 是一種面向物聯網(IoT)場景的開源時序數據庫。它專門設計用于高效地存儲和查詢大規模物聯網設備產生的時序數據。IoTDB 提供了高吞吐量、低延遲、靈活的數據模型以及多種數據查詢和存儲引擎等特性,使其成為處理…

稀疏圖帶負邊的全源最短路Johnson算法

BellmanFord算法 Johnson算法解決的問題 帶負權的稀疏圖的全源最短路 算法流程 重新設置的每條邊的權重都大于或等于0&#xff0c;跑完Djikstra后得到的全源最短路&#xff0c;記得要還原&#xff0c;即&#xff1a;f(u,v) d(u,v) - h[u] h[v] 例題

45、WEB攻防——通用漏洞PHP反序列化POP鏈構造魔術方法原生類

文章目錄 序列化&#xff1a;將java、php等代碼中的對象轉化為數組或字符串等格式。代表函數serialize()&#xff0c;將一個對象轉換成一個字符&#xff1b;反序列化&#xff1a;將數組或字符串等格式還成對象。代表函數unserialize()&#xff0c;將字符串還原成一個對象。 P…

MWC 2024丨Smart Health搭載高通Aware平臺—美格發布智能健康看護解決方案,開啟健康管理新體驗

2月29日&#xff0c;在MWC 2024世界移動通信大會上&#xff0c;全球領先的無線通信模組及解決方案提供商——美格智能正式發布了新一代Cat.1模組SLM336Q&#xff0c;是中低速物聯網應用場景的高性價比之選。本次還發布了首款搭載高通Aware?平臺的智能看護解決方案MC303&#x…

[萬字長文] 從 Vue 3 的項目模板學習 tsconfig 配置

文章目錄 一、tsconfig.json 的作用二、基本介紹三、Vue 3 的 tsconfig.json 的結構分析1. 總配置 tsconfig.json2. Web 側 tsconfig.app.jsona. 繼承基礎配置b. 包含和排除的文件c. 編譯器選項 3. 測試 tsconfig.vitest.jsona. 繼承的基礎配置b. 包含和排除的文件c. 編譯器選項…

OD(13)之Mermaid餅圖和象限圖

OD(13)之Mermaid餅圖和象限圖使用詳解 Author: Once Day Date: 2024年2月29日 漫漫長路才剛剛開始… 全系列文章可參考專欄: Mermaid使用指南_Once_day的博客-CSDN博客 參考文章: 關于 Mermaid | Mermaid 中文網 (nodejs.cn)Mermaid | Diagramming and charting tool???…