從這題似乎感悟到了點線段樹對區間操作的lazy思想,即只需要找到合適區間對其更新並標記,子區間暫不更新。通過畫圖模擬更加直觀。
#include <iostream> using namespace std; const int Max = 100000; // 對象 struct TreeNode { int l, r; long long c; // 增量 long long sum; // 區間和 }tree[Max*4]; //-----------------線段樹操作-------------------// void Build( const int l, const int r, const int id ) { tree[id].l = l; tree[id].r = r; tree[id].c = 0; tree[id].sum = 0; if( r - l == 1 ) return; int mid = ( l + r ) >> 1; Build( l, mid, id * 2 ); Build( mid, r, id * 2 + 1 ); } void Update( const int l, const int r, const int v, const int id ) { if( tree[id].l == l && tree[id].r == r ) { tree[id].sum += ( r - l ) * v; // 區間每個元素加v tree[id].c += v; // lazy思想,記錄該區間的增量,供求子區間和時使用 return; } if( tree[id].c != 0 ) { tree[ id*2 ].sum += ( tree[ id*2 ].r - tree[ id*2 ].l ) * tree[id].c; tree[ id*2+1 ].sum += ( tree[ id*2+1 ].r - tree[ id*2+1 ].l ) * tree[id].c; tree[ id*2 ].c += tree[id].c; tree[ id*2+1 ].c += tree[id].c; tree[id].c = 0; } int mid = ( tree[id].l + tree[id].r ) >> 1; if( r <= mid ) Update( l, r, v, id * 2 ); else if( l >= mid ) Update( l, r, v, id * 2 + 1 ); else { Update( l, mid, v, id * 2 ); Update( mid, r, v, id * 2 + 1 ); } // 合併 tree[id].sum = tree[ id*2 ].sum + tree[ id*2+1 ].sum; } long long Query( const int l, const int r, const int id ) { if( tree[id].l == l && tree[id].r == r ) { return tree[id].sum; } if( tree[id].c != 0 ) { tree[ id*2 ].sum += ( tree[ id*2 ].r - tree[ id*2 ].l ) * tree[id].c; tree[ id*2+1 ].sum += ( tree[ id*2+1 ].r - tree[ id*2+1 ].l ) * tree[id].c; tree[ id*2 ].c += tree[id].c; tree[ id*2+1 ].c += tree[id].c; tree[id].c = 0; } int mid = ( tree[id].l + tree[id].r ) >> 1; if( r <= mid ) return Query( l, r, id * 2 ); else if( l >= mid ) return Query( l, r, id * 2 + 1 ); else return Query( l, mid, id * 2 ) + Query( mid, r, id * 2 + 1 ); } //-----------------------------------------------------// int main() { int N, M, a, b, v; while( scanf( "%d%d", & N, & M ) == 2 ) { Build( 1, N + 1, 1 ); for( int i = 1; i <= N; ++ i ) { scanf( "%d", & v ); Update( i, i + 1, v, 1 ); } char ch; while( M-- ) { getchar(); scanf( "%c%d%d", & ch, & a, & b ); if( ch == 'Q' ) { long long sum = Query( a, b + 1, 1 ); printf( "%lld/n", sum ); } else { scanf( "%d", & v ); Update( a, b + 1, v, 1 ); } } } system( "pause" ); return 0; }
二叉樹 「二叉樹 binary tree」是一種非線性數據結構,代表“祖先”與“後代”之間的派生關係,體現了“一分爲二” 的分治邏輯。與鏈表類似,二叉樹的基本單元是節點,每個節點包含值、左子節點引用和右子節點引用。 每個節點都有兩個引
1. 以管理員身份運行命令提示符並執行命令 cmd ----------------->chcp 437 2. 該命令將返回損壞的任務計劃程序名稱. 輸入命令: schtasks /query /v | find /i "ERROR:
本文分享自華爲雲社區《【昇騰開發全流程】AscendCL開發板模型推理》,作者:沉迷sk。 前言 學會如何安裝配置華爲雲ModelArts、開發板Atlas 200I DK A2。 並打通一個Ascend910訓練到Ascend310推理
大家好,我是每天分享AI應用的螢火君! 今天繼續給大家分享ComfyUI的入門必備技能:ControlNet。 ControlNet 提供了十幾種生成圖片的控制方式,有的可以控制畫面的結構,有的可以控制人物的姿勢,還有的可以控制圖片的畫
作者:張添翼、董藝荃 引子 OpenAI 發佈了最新的 GPT-4o 模型,通義千問也在前不久剛發佈通義千問 2.5,已經和 GPT-4-Turbo 不分伯仲: 既然目前還沒有和 GPT-4o 文本生成能力的對比數據,就讓我們來和大模型一
原文:https://blog.fengjx.com/pages/d6f092 介紹 go-kit的分層設計可以看成是一個洋蔥,有許多層。這些層可以劃分爲我們的三個領域。 Service: 最內部的服務領域是基於你特定服務定義的,也是
原文:https://blog.fengjx.com/pages/40737e 介紹 go-kit 是一個微服務開發工具集,並不算一個完整的框架。根據工程實踐總結的一套開發規範,解決分佈式開發中的常見問題,它同樣也適用於單體服務開發。
1. 背景 ZooKeeper(ZK)是一個誕生於 2007 年的分佈式應用程序協調服務。儘管出於一些特殊的歷史原因,許多業務場景仍然不得不依賴它。比如,Kafka、任務調度等。特別是在 Flink 混合部署 ETCD 解耦 時,業務方曾
本文分享自華爲雲社區《【MySQL技術專欄】GaussDB(for MySQL) Big IN查詢優化》,作者:GaussDB 數據庫。 背景介紹 在生產環境中,經常會遇到客戶業務的SQL語句進行過濾查詢
千帆AppBuilder的工作流編排功能上線後,爲了讓用戶能夠更快地熟悉操作,我們請到了AppBuilder的產品經理爲大家直播講解。 在這次直播中,PM小姐姐深入介紹並演示了工作流編排功能,通過創建多個組件,生動展示了AppBui
引言 隨着大數據時代的到來,網頁爬蟲作爲一種高效的數據收集工具,被廣泛應用於互聯網數據抓取和信息抽取。而知乎是一個知識分享平臺,擁有大量的用戶生成內容。通過爬蟲獲取知乎數據,企業和研究人員可以進行深入的數據分析和市場研究,瞭解用戶的需求
本文分享自華爲雲社區《【MySQL技術專欄】MySQL8.0直方圖介紹》,作者:GaussDB 數據庫。 背景 數據庫查詢優化器負責將SQL查詢轉換爲儘可能高效的執行計劃,但因爲數據環境不斷變化導致優化器對查詢數據瞭解的不夠充足,可能無法
本文分享自華爲雲社區《npm install -g 和 npm install --save-dev 的關係》,作者: SHQ5785。 一、npm install 本地安裝 將安裝包放在 ./node_modules 下(運行 npm
一、簡單介紹: CaffeineCache和Guava的Cache是應用廣泛的本地緩存。 在開發中,爲了達到降低依賴、提高訪問速度的目的。會使用它存儲一些維表接口的返回值和數據庫查詢結果,在有些場景下也會在分佈式緩存上再加上一層本地緩存,
前言 linux下安裝nginx比較繁瑣,遇到內網部署環境更是麻煩,所以研究了下nginx綠色免安裝版的部署包製作,開箱即用,特此記錄分享,一下操作在centos8環境下安裝,如果需要其他內核系統的安裝(Debian/Ubuntu等),請在