CSP認證準備第三天-差分及第36次CCF認證(BFS)

基礎知識參考:

csp突擊前兩題常用算法代碼_ccf csp常用優化算法-CSDN博客

差分

什么是差分數組?

差分數組是原數組相鄰元素之間的差值構成的數組。對于原數組?a,其差分數組?b?定義為:

  • b[1] = a[1]?(假設?a[0] = 0)

  • b[i] = a[i] - a[i-1]?(對于 i > 1)

為什么差分數組有用?

差分數組的神奇之處在于:對原數組的區間加減操作可以轉化為對差分數組的兩個單點操作

差分例題

一個長度為n的整數序列。
對其進行m次操作,每個操作包含三個整數l, r, c,表示將序列中[l, r]之間的每個數加上c。
請你輸出進行完所有操作后的序列。

###輸入格式
第一行包含兩個整數n和m。
第二行包含n個整數,表示整數序列。
接下來m行,每行包含三個整數l,r,c,表示一個操作。
###輸出格式
共一行,包含n個整數,表示最終序列。
###數據范圍
1≤n,m≤100000,
1≤l≤r≤n,
?1000≤c≤1000,
?1000≤整數序列中元素的值≤1000

如果用暴力做法每次都循環一遍區間的值然后操作的話時間肯定會超限
所以用一種巧妙地方法就是構造差分數組,
對區間[l,r]進行+c操作時只需要在差分數組里對b[l] += c,b[r+1] -= c
然后累和恢復數組時就可對區間內所有數+c

區間更新原理

當我們要對原數組?a?的區間?[l, r]?中每個元素加?c?時:

  1. 對差分數組?b[l] += c:這使得?a[l]?及之后的所有元素都增加了?c

  2. 對差分數組?b[r+1] -= c:這抵消了?a[r+1]?及之后元素的增加,使得只有?[l, r]?區間內的元素增加了?c

恢復原數組

通過計算差分數組的前綴和,我們可以恢復出更新后的原數組:

  • a'[i] = b[1] + b[2] + ... + b[i]

或者下標直接從1開始比較好:

#include<iostream>
using namespace std;
int a[100010], b[100010];
int main(){int n, m;cin>>n>>m;for(int i = 1; i <= n; i ++){cin>>a[i];b[i] = a[i] - a[i - 1];	//構造差分數組}while(m --){int l, r, c;cin>>l>>r>>c;b[l] += c;	b[r + 1] -= c;}for(int i = 1; i <= n; i ++){b[i] = b[i] + b[i - 1];cout<<b[i]<<" ";}return 0;
}

第36次CCF認證-第四題

?參考題解:

CCF-CSP第36次認證第四題——跳房子【NA!巧妙利用BFS】_csp跳房子-CSDN博客

第36次ccf-csp題解(思維) - devoteeing - 博客園

? 應該屬于經典題,BFS尋找最短路徑,我還是不太熟悉,需要多多刷題啊。依稀記得當時有過短短的掙扎,然而確實是練少了,真的想不起來。(OK啊,后面我要系統練一下搜索算法了)

? 好吧,承認我讀完題目之后真的毫無頭緒,這種求最優解法的題目我真的束手無措。

BFS

參考資料:

BFS(圖論) - OI Wiki

第十三章 DFS與BFS(保姆級教學!!超級詳細的圖示!!)_dfs bfs-CSDN博客

BFS 全稱是?Breadth First Search,中文名是寬度優先搜索,也叫廣度優先搜索。

是圖上最基礎、最重要的搜索算法之一。

所謂寬度優先。就是每次都嘗試訪問同一層的節點。 如果同一層都訪問完了,再訪問下一層。

這樣做的結果是,BFS 算法找到的路徑是從起點開始的?最短?合法路徑。換言之,這條路徑所包含的邊數最小。

在 BFS 結束時,每個節點都是通過從起點到該點的最短路徑訪問的。

算法過程可以看做是圖上火苗傳播的過程:最開始只有起點著火了,在每一時刻,有火的節點都向它相鄰的所有節點傳播火苗。

例題1-走迷宮

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=110;
typedef pair<int,int> PII;
int map[N][N],mark[N][N];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1},n,m,ans;
void bfs()
{memset(mark,-1,sizeof mark);queue<PII>q;q.push({0,0});mark[0][0]=0;while(!q.empty()){PII top=q.front();for(int i=0;i<4;i++){int nex=top.first+dx[i],ney=top.second+dy[i];if(nex>=0&&nex<n&&ney>=0&&ney<m&&mark[nex][ney]==-1&&map[nex][ney]==0){mark[nex][ney]=mark[top.first][top.second]+1;q.push({nex,ney});}}q.pop();}cout<<mark[n-1][m-1];
}
int main()
{cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){scanf("%d",&map[i][j]);}}bfs();
}

BFS模版

void bfs(int u) {while (!Q.empty()) Q.pop();Q.push(u);vis[u] = 1;d[u] = 0;p[u] = -1;while (!Q.empty()) {u = Q.front();Q.pop();for (int i = head[u]; i; i = e[i].nxt) {if (!vis[e[i].to]) {Q.push(e[i].to);vis[e[i].to] = 1;d[e[i].to] = d[u] + 1;p[e[i].to] = u;}}}
}void restore(int x) {vector<int> res;for (int v = x; v != -1; v = p[v]) {res.push_back(v);}std::reverse(res.begin(), res.end());for (int i = 0; i < res.size(); ++i) printf("%d", res[i]);puts("");
}

其中,

圖的存儲方式(鏈式前向星)

head[u]?和?e[i]?是鏈式前向星(一種圖的鄰接表存儲方式)的關鍵部分:

  • head[u]:存儲節點?u?的第一條邊的編號(索引)。

  • e[i]:是一個結構體數組,存儲第?i?條邊的信息,通常包括:

    • e[i].to:這條邊指向的節點(終點)。

    • e[i].nxt:下一條與?u?相連的邊的編號(類似于鏈表中的?next?指針)

BFS應用

例題2-密室

問題 - 173B - Codeforces

一個n*m的圖,現在有一束激光從左上角往右邊射出,每遇到 '#',你可以選擇光線往四個方向射出,或者什么都不做,問最少需要多少個 '#' 往四個方向射出才能使光線在第n行往右邊射出。

此題目正解不是 0-1BFS,但是適用 0-1BFS,減小思維強度,賽時許多大佬都是這么做的。

做法很簡單,一個方向射出不需要花費(0),而往四個方向射出需要花費(1),然后直接來就可以了。

#include <deque>
#include <iostream>
using namespace std;constexpr int INF = 1 << 29;
int n, m;
char grid[1001][1001];
int dist[1001][1001][4];
int fx[] = {1, -1, 0, 0};
int fy[] = {0, 0, 1, -1};
deque<int> q;  // 雙端隊列void add_front(int x, int y, int dir, int d) {  // 向前方加if (d < dist[x][y][dir]) {dist[x][y][dir] = d;q.push_front(dir);q.push_front(y);q.push_front(x);}
}void add_back(int x, int y, int dir, int d) {  // 向后方加if (d < dist[x][y][dir]) {dist[x][y][dir] = d;q.push_back(x);q.push_back(y);q.push_back(dir);}
}int main() {cin >> n >> m;for (int i = 0; i < n; i++) cin >> grid[i];for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)for (int k = 0; k < 4; k++) dist[i][j][k] = INF;add_front(n - 1, m - 1, 3, 0);while (!q.empty()) {  // 具體搜索的過程,可以參考上面寫的題解int x = q[0], y = q[1], dir = q[2];q.pop_front();q.pop_front();q.pop_front();int d = dist[x][y][dir];int nx = x + fx[dir], ny = y + fy[dir];if (nx >= 0 && nx < n && ny >= 0 && ny < m)add_front(nx, ny, dir, d);  // 判斷條件if (grid[x][y] == '#')for (int i = 0; i < 4; i++)if (i != dir) add_back(x, y, i, d + 1);}if (dist[0][0][3] == INF)cout << -1 << endl;elsecout << dist[0][0][3] << endl;return 0;
}

習題

  • 「NOIP2017」奶酪

雙端隊列 BFS:

  • CF1063B. Labyrinth
  • CF173B. Chamber of Secrets
  • 「BalticOI 2011 Day1」打開燈泡 Switch the Lamp On

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

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

相關文章

[案例四] 智能填寫屬性工具(支持裝配組件還有建模實體屬性的批量創建、編輯)

論文盲審結果要出來了,渣渣超沒有心情繼續寫了,過一段時間再說吧,今天宣布五一結束,哈哈哈。寫完這篇博客開始搞科研了,有時間再進NX開發學習。本次案例主要是對上次導出自動導出BOM的一個前處理,要想導出屬性,首先的有屬性。于是本著學習的態度進行制作,可能有些功能有…

四核RK3566多媒體控制板技術分享(RK3566如何實現7個串口同時進行)

四核RK3566多媒體控制板技術分享: 今天分享一款近期接觸到的四核RK3566多媒體控制板&#xff08;產品型號&#xff1a;ZK-R36A&#xff09;&#xff0c;這款產品在工業控制和智能設備領域有不錯的表現&#xff0c;特此整理了一些技術參數供大家參考。 產品概述: 這款控制板采用…

多線程代碼案例-1 單例模式

單例模式 單例模式是開發中常見的設計模式。 設計模式&#xff0c;是我們在編寫代碼時候的一種軟性的規定&#xff0c;也就是說&#xff0c;我們遵守了設計模式&#xff0c;代碼的下限就有了一定的保證。設計模式有很多種&#xff0c;在不同的語言中&#xff0c;也有不同的設計…

【計算機組成原理】第二部分 存儲器--分類、層次結構

文章目錄 分類&層次結構0x01 分類按存儲介質分類按存取方式分類按在計算機中的作用分類 0x02 層次結構 分類&層次結構 0x01 分類 按存儲介質分類 半導體存儲器磁表面存儲器磁芯存儲器光盤存儲器 按存取方式分類 存取時間與物理地址無關&#xff08;隨機訪問&#…

迅為RK3588開發板安卓GPIO調用APP運行測試

將網盤上的安卓工程文件復制到 Windows 電腦上。確保工程路徑中使用英文字符&#xff0c;不包含中文。接著&#xff0c;啟動 Android Studio&#xff0c;點擊“Open”按鈕選擇應用工程文件夾&#xff0c;然后點擊“OK”。由于下載 Gradle 和各種 Jar 包可能需要一段時間&#x…

BFS算法篇——打開智慧之門,BFS算法在拓撲排序中的詩意探索(下)

文章目錄 引言一、課程表1.1 題目鏈接&#xff1a;https://leetcode.cn/problems/course-schedule/description/1.2 題目分析&#xff1a;1.3 思路講解&#xff1a;1.4 代碼實現&#xff1a; 二、課程表||2.1 題目鏈接&#xff1a;https://leetcode.cn/problems/course-schedul…

計數循環java

import java.util.Scanner;public class Hello {public static void main(String[] args) {Scanner in new Scanner(System.in);int count 10;while(count > 0) {count count -1;System.out.println(count);}System.out.println(count);System.out.println("發射&am…

11. CSS從基礎樣式到盒模型與形狀繪制

在前端開發中&#xff0c;CSS&#xff08;層疊樣式表&#xff09;是控制網頁樣式和布局的核心技術。整理了關于 CSS 基礎樣式、文本樣式、盒模型以及形狀繪制的一些心得。以下是詳細的學習筆記。 一、基礎樣式設置 1. 字體樣式 字體樣式是網頁視覺呈現的重要組成部分&#xf…

雙種群進化算法:動態約束處理與資源分配解決約束多目標優化問題

雙種群進化算法&#xff1a;動態約束處理與資源分配解決約束多目標優化問題 一、引言 約束多目標優化問題&#xff08;CMOPs&#xff09;在工程設計、資源分配等領域廣泛存在&#xff0c;其核心是在滿足多個約束條件的同時優化多個目標函數。傳統方法往往難以平衡約束滿足與目…

【Qt】pro工程文件轉CMakeLists文件

1、簡述 Qt6以后默認使用cmake來管理工程,之前已經一直習慣使用pro,pro的語法確實很簡單、方便。 很多項目都是cmake來管理,將它們加入到Qt項目中,cmake確實是大勢所趨。比如,最近將要開發的ROS項目,也是使用的cmake語法。 以前總結的一些Qt代碼,已經編寫成pro、pri等…

手機換地方ip地址會變化嗎?深入解析

在移動互聯網時代&#xff0c;我們經常帶著手機穿梭于不同地點&#xff0c;無論是出差旅行還是日常通勤。許多用戶都好奇&#xff1a;當手機更換使用地點時&#xff0c;IP地址會隨之改變嗎&#xff1f;本文將深入解析手機IP地址的變化機制&#xff0c;幫助您全面了解這一常見但…

【Canda】常用命令+虛擬環境創建到選擇

目錄 一、conda常用命令 二、conda 環境 2.1 創建虛擬環境 2.2 conda環境切換 2.3 查看conda環境 2.4 刪除某個conda環境 2.5 克隆環境 三、依賴包管理 3.1 安裝命令 3.2 更新包 3.3 卸載包 3.4 查看環境中所有包 3.5 查看某個包的版本信息 3.6 搜索包 四、環境…

目標檢測任務常用腳本1——將YOLO格式的數據集轉換成VOC格式的數據集

在目標檢測任務中&#xff0c;不同框架使用的標注格式各不相同。常見的框架中&#xff0c;YOLO 使用 .txt 文件進行標注&#xff0c;而 PASCAL VOC 則使用 .xml 文件。如果你需要將一個 YOLO 格式的數據集轉換為 VOC 格式以便適配其他模型&#xff0c;本文提供了一個結構清晰、…

Python作業練習2

任務簡述 if_name__main_的含義&#xff0c;why? 問題解答 在Python中&#xff0c;if __name__ __main__:是一種常見的慣用法&#xff0c;用于檢查當前模塊是否是主程序入口點。要理解其含義和用途&#xff0c;首先需要了解兩個概念&#xff1a; 1. __name__: 這是一個特…

ppy/osu構建

下載 .NET (Linux、macOS 和 Windows) | .NET dotnet還行 構建&#xff1a;f5 運行&#xff1a;dotnet run --project osu.Desktop -c Debug

NY182NY183美光固態顆粒NY186NY188

NY182NY183美光固態顆粒NY186NY188 在存儲技術的競技場上&#xff0c;美光科技&#xff08;Micron&#xff09;始終扮演著革新者的角色。其NY系列固態顆粒憑借前沿的3D NAND架構和精準的工藝控制&#xff0c;成為企業級存儲和數據中心的關鍵支柱。本文將圍繞NY182、NY183、NY1…

C++的歷史與發展

目錄 一、C 的誕生與早期發展 &#xff08;一&#xff09;C 語言的興起與局限 &#xff08;二&#xff09;C 的雛形&#xff1a;C with Classes &#xff08;三&#xff09;C 命名與早期特性豐富 二、C 的主要發展歷程 &#xff08;一&#xff09;1985 年&#xff1a;經典…

DedeCMS-Develop-5.8.1.13-referer命令注入研究分析 CVE-2024-0002

本次文章給大家帶來代碼審計漏洞挖掘的思路&#xff0c;從已知可控變量出發或從函數功能可能照成的隱患出發&#xff0c;追蹤參數調用及過濾。最終完成代碼的隱患漏洞利用過程。 代碼審計挖掘思路 首先flink.php文件的代碼執行邏輯&#xff0c;可以使用php的調試功能輔助審計 …

計算機網絡|| 常用網絡命令的作用及工作原理

1.hostname 作用&#xff1a;顯示計算機的完整計算機名的主機名部分。僅當 Internet 協議 (TCP/IP) 協議作為組件安裝在網絡的網絡適配器的屬性中時&#xff0c;此命令才可用。 2.ping 作用&#xff1a; 1.用來檢測網絡的連通情況和分析網絡速度 2.根據域名得到服務器 IP …

用戶態到內核態:Linux信號傳遞的九重門(二)

1. 保存信號 1.1. 信號其他相關常見概念 實際執?信號的處理動作稱為信號遞達(Delivery)。 信號從產?到遞達之間的狀態,稱為信號未決(Pending)。 進程可以選擇阻塞 (Block )某個信號。 被阻塞的信號產?時將保持在未決狀態,直到進程解除對此信號的阻塞,才執?遞達的動作。 1.…