算法學習——差分

在了解差分之前,我們首先需要知道前綴和的概念。

前綴和簡單介紹:

對于一個數組A,要求出A[0]~A[i]的和,我們通常的做法是遍歷一邊,加起來。但是要求m組這樣的和,我們就要花費O(mn)的時間復雜度。顯然不合理。所以我們要用到動態規劃里的備忘錄思想,創建一個新數組B,B[i]記錄的是B[0]~B[i]的和。這個數組就是A的前綴和。

差分的概念:

有前綴和就有其逆定理。那就是假設數組A是一個前綴和數組,那么怎么求原數組呢B?答案是B[i] = A[i] - A[i-1] 這很好理解。這種算法可以被視為前綴和的逆運算

現在我們獲得了差分的概念,讓我們看看怎么使用它吧。

如何使用:

差分主要用處在于:

快速將序列A[l..r]的區間每個元素加上d。

正常加我們就需要不斷遍歷這一段數組。但是我們有了差分的概念,因此我們可以得到差分數組B[l]' = A[l] + d - A[l-1] = B[l] + d

B[r+1]' = A[r+1] -A[r] -d = B[r+1] - d

差分可以將在原序列上的?“區間操作”?轉化為差分序列上的?“單點操作”

現在有了對一維數組的差分運算, 我們可以看看二維數組怎么操作。

二維差分:

二維差分要解決的問題是給原二維數組A的[x1,y1]~[x2,y2]處的所有元素加上d。

我們根據幾何關系可以得出以下公式

Bi,j = Ai,j - Ai-1,j - Ai,j-1, + Ai-1,j-1

結合前面文章中差分的用途,可以容易的想到,二維差分主要是用于快速將一個區塊中的所有元素加上 d

根據我們的公式我們很快得出一個結論:

對原數組A的[x1,y1]~[x2,y2]處的所有元素加上d等價于:

B[x1,y1] += 1

B[x1,y2+1] -= 1

B[x2+1,y1] -= 1

B[x2+1,y2+1] += 1

可以畫一張圖自己看看,推導很簡單

應用:

問題描述

小蘭擁有n*n 大小的棋盤,一開始棋盤上全是白子,小蘭進行了m?次操作,每次操作會將棋盤上某個范圍內的所有棋子的顏色取反(也就是白色棋子變為黑色,黑色棋子變為白色)。請輸出所有操作做完后棋盤上每個棋子的顏色。

輸入格式

輸入的第一行包含兩個整數 n,m,用一個空格分隔,表示棋盤大小與操作數。

接下來?m?行每行包含四個整數 x1,y1,x2,y2,相鄰整數之間使用一個空格分隔,表示將在 x1~x1行,y1~y2?列中的棋子顏色取反。

輸出格式

輸出 n?行,每行?n?個?0?或? 1?表示該位置棋子的顏色。如果是白色則輸出 0,否則1

樣例輸入
3 3
1 1 2 2
2 2 3 3
1 1 3 3
樣例輸出
001
010
100

代碼:

import java.util.Scanner;public class Main extends Base{public static void main(String[] args) {int n = I(),m = I();int[][] sum = new int[n+1][n+1]; //原數組int[][] diff = new int[n+2][n+2]; //差分數組for(int k=0;k<m;k++){int x1 = I(),y1 = I(),x2 = I(),y2 = I();//每次對差分數組4個位置操作diff[x1][y1]++;diff[x1][y2+1]--;diff[x2+1][y1]--;diff[x2+1][y2+1]++;}//由差分數組得到原數組for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){sum[i][j] = sum[i-1][j]+sum[i][j-1]+diff[i][j]-sum[i-1][j-1];if(sum[i][j]%2==0) print(0);else print(1);}print("\n");}}
}
class Base {static Scanner scan = new Scanner(System.in);static int I(){return scan.nextInt();}static <T> void println(T x){System.out.println(x);}static <T> void print(T x){System.out.print(x);}
}
sum[i][j] = sum[i-1][j]+sum[i][j-1]+diff[i][j]-sum[i-1][j-1];

這一行是?

Bi,j = Ai,j - Ai-1,j - Ai,j-1, + Ai-1,j-1求Ai,j的運算變形

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

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

相關文章

【考研數學】湯家鳳1800題什么水平?

我覺得湯家鳳基礎武忠祥強化這個組合非常的不錯 湯家鳳老師的講課風格 湯家鳳老師的基礎課程是大家公認的講的詳細&#xff0c;并且非常照顧基礎不好的學生&#xff0c;會把基礎知識點掰開揉碎的講給大家聽&#xff0c;在上課過程中&#xff0c;還會把知識點寫在A4紙上&#…

試了下新型的360AI搜索

360AI搜索 試了下&#xff0c;感覺還是挺不錯的。 比如問這個問題&#xff1a; ERROR 1698 (28000): Access denied for user rootlocalhost 它的回答&#xff1a; 對于ERROR 1698 (28000): Access denied for user rootlocalhost的問題&#xff0c;這通常是由于MySQL密碼為…

【Javascript】設計模式之單例模式

文章目錄 1、實現單例模式2、透明的單例模式3、用代理實現單例模式4、JavaScript 中的單例模式5、惰性單例6、通用的惰性單例7、小結 定義&#xff1a; 保證一個類僅有一個實例&#xff0c;并提供一個訪問它的全局訪問點 單例模式是一種常用的模式&#xff0c;有一些對象我們往…

JavaScript 學習總結(16)—— 實用小函數總結

1.匹配正整數 // 匹配正整數 let isPositiveNum = val => {return /^[1-9]d*$/.test(val); }; console.log(isPositiveNum(9)) //true console.log(isPositiveNum(2.2)) //false 2.匹配負整數 // 匹配負整數let isNegativeNum = val => {return /^-[1-9]d*$/.test(val…

R750 install AMD MI210GPU

一、 查看服務器GPU卡信息 可以首先在服務器上check 當前GPU的詳細信息是否匹配 二、安裝 Ubuntu22.04操作系統 服務器CHECK 安裝的AMD GPU 是否被系統識別 #lspci | grep AMD 查看GPU信息 可以看到已經識別成功 三、安裝AMD GPU驅動 https://rocm.docs.amd.com/projec…

linux 根目錄下結構

/ 虛擬目錄的根的目錄&#xff0c;通常不會在這里放置文件 /bin&#xff1a;存放頻繁使用的命令,二進制文件&#xff0c;存放了很多用戶級的GNU實用工具。 /boot&#xff1a;引導目錄&#xff0c;存放引導文件&#xff0c;包含啟動Linux所需的核心文件。 /dev&#xff1a;設…

智能駕駛規劃控制理論學習05-車輛運動學規劃案例分析

目錄 案例一——Hybrid A*&#xff08;基于正向運動學&#xff09; 1、基本思想 2、 實現流程 3、啟發函數設計 4、分析擴張&#xff08;Analytic Expansions&#xff09; 5、分級規劃&#xff08;Hierarchical planning&#xff09; 案例二——State Lattice Planning&…

子矩陣的和 刷題筆記 {二維前綴和}

首先我們的目標是讓 s[i][j]表示為其左方和上方形成的矩陣所有元素的和 加上s[i-1][j]和s[i][j-1]后 s[i-1][j-1]部分重復了所以減去 最后加上a[i][j]即可完成目標 s[i][j]s[i-1][j]s[i][j-1]-s[i-1][j-1]a[i][j]; 然后看題目要求 要求x1,y1,x2,y2圍成的小正方形內的元素和…

C/C++工程師面試題(數據庫篇)

索引的優缺點 索引是一種支持快速查找特定行的數據結構&#xff0c;如果沒有索引&#xff0c;就需要遍歷整個表進行查找。用于提高數據檢索的速度和效率。 好處&#xff1a; 提高檢索速度&#xff1a; 索引可以加快數據的檢索速度&#xff0c;因為它們允許數據庫系統直接定位到…

Revit-二開之立面視圖創建FilledRegion-(3)

在上一篇博客中介紹了FilledRegion的創建方法,這種方法通常只在平面視圖中適用,在三維視圖中也是無法創建的(目前研究的是這樣的,如果有其他方法,請賜教)。 本片文章介紹一個下在立面視圖中創建FilledRegion的方法,主要操作是在立面視圖中拾取一個點,然后以該點為原點,…

YOLOv5 項目:推理代碼和參數詳細介紹(detect)

1、前言 本章將介紹yolov5項目的推理函數&#xff0c;關于yolov5的下載和配置環境&#xff0c;參考上一篇文章&#xff1a; YOLOv5 項目&#xff1a;環境配置-CSDN博客 pycharm 中打開的推理模塊如紅框中所示 pycharm將conda新建的虛擬環境導入&#xff0c;參考 &#xff1a;…

快速模冪(c++題解)

題目描述 試求ab%n的值&#xff0c;其中a、b、n均為整數范圍內的數。 輸入格式 三個整數即a、b、n。 輸出格式 輸出結果。 樣例 樣例輸入 復制1 1 1樣例輸出 復制0 _____________________________________________________________________________ ok呀總算學到一個…

從 AI 的爆火聊聊用戶界面(UI)的演進

目錄 用戶界面的起源與發展 用戶界面的設計原則與趨勢 用戶界面未來的方向 小結 用戶界面&#xff08;User Interface&#xff0c;簡稱 UI&#xff09;是人與計算機系統交互的媒介&#xff0c;用戶可以通過用戶界面向計算機發送指令&#xff0c;同時計算機可以通過用戶界面…

面試 Java 基礎八股文十問十答第十五期

面試 Java 基礎八股文十問十答第十五期 作者&#xff1a;程序員小白條&#xff0c;個人博客 相信看了本文后&#xff0c;對你的面試是有一定幫助的&#xff01;關注專欄后就能收到持續更新&#xff01; ?點贊?收藏?不迷路&#xff01;? 1&#xff09;BIO, NIO, AIO 有什么…

簡單實現Transformer的自注意力

簡單實現Transformer的自注意力 關注{曉理紫|小李子}&#xff0c;獲取技術推送信息&#xff0c;如感興趣&#xff0c;請轉發給有需要的同學&#xff0c;謝謝支持&#xff01;&#xff01; 如果你感覺對你有所幫助&#xff0c;請關注我。 源碼獲取&#xff1a;VX關注并回復chatg…

二叉樹的右視圖,力扣

目錄 題目&#xff1a; 我們直接看題解吧&#xff1a; 快速理解解題思路小建議&#xff1a; 審題目事例提示&#xff1a; 解題方法&#xff1a; 解題分析&#xff1a; 解題思路&#xff1a; 代碼實現(DFS)&#xff1a; 代碼1&#xff1a; 補充說明&#xff1a; 代碼2&#xff1…

Vue.js中的$nextTick

其實目前在我現有的開發經歷中&#xff0c;我還沒有實際運用過$nextTick&#xff0c;今天在看書時&#xff0c;學習到了這個東西&#xff0c;所以做個筆記記錄一下。 一、$nextTick是什么&#xff1f; $nextTick 是 Vue提供的一個方法&#xff0c;用于在 DOM 更新之后執行回調…

AI:148-開發一種智能語音助手,能夠理解和執行復雜任務

??點擊這里跳轉到本專欄,可查閱專欄頂置最新的指南寶典~ ?????? 你的技術旅程將在這里啟航! 從基礎到實踐,深入學習。無論你是初學者還是經驗豐富的老手,對于本專欄案例和項目實踐都有參考學習意義。 ??? 每一個案例都附帶關鍵代碼,詳細講解供大家學習,希望…

淺談鉤子方法

何為鉤子方法 鉤子方法&#xff08;Hook methods&#xff09;是一種在面向對象編程中常用的設計模式&#xff0c;也被稱為模板方法模式。在這種模式中&#xff0c;父類定義了一個算法的框架&#xff0c;并且將一些步驟的實現延遲到子類中。子類可以通過重寫這些“鉤子方法”來改…

[技巧]Arcgis之圖斑四至點批量計算

前言 上一篇介紹了arcgis之圖斑四至范圍計算&#xff0c;這里介紹的圖斑四至點的計算及獲取&#xff0c;兩者之間還是有差異的。 [技巧]Arcgis之圖斑四至范圍計算 這里說的四至點指的是圖斑最東、最西、最南、最北的四個地理位置點坐標&#xff0c;如下圖&#xff1a; 四至點…