UOJ 164【清華集訓2015】V Solution

Description

給定序列 a = ( a 1 , a 2 , ? , a n ) a=(a_1,a_2,\cdots,a_n) a=(a1?,a2?,?,an?),另有序列 h h h,初始時 h = a h=a h=a.
m m m 個操作分五種:

  • add ? ( l , r , v ) \operatorname{add}(l,r,v) add(l,r,v):對每個 i ∈ [ l , r ] i\in[l,r] i[l,r] 執行 a i ← a i + v a_i\gets a_i+v ai?ai?+v.
  • subtract ? ( l , r , v ) \operatorname{subtract}(l,r,v) subtract(l,r,v):對每個 i ∈ [ l , r ] i\in[l,r] i[l,r] 執行 a i ← max ? ( 0 , a i ? v ) a_i\gets \max(0, a_i-v) ai?max(0,ai??v).
  • assign ? ( l , r , v ) \operatorname{assign}(l,r,v) assign(l,r,v):對每個 i ∈ [ l , r ] i\in[l,r] i[l,r] 執行 a i ← v a_i\gets v ai?v.
  • get ? ( i ) \operatorname{get}(i) get(i):求 a i a_i ai?.
  • geth ? ( i ) \operatorname{geth}(i) geth(i):求 h i h_i hi?.

每次修改后,對每個 i ∈ [ 1 , n ] i\in[1,n] i[1,n] 執行 h i ← max ? ( h i , a i ) h_i\gets \max(h_i,a_i) hi?max(hi?,ai?).

Limitations

1 ≤ n , m ≤ 5 × 1 0 5 1\le n,m\le 5\times 10^5 1n,m5×105
0 ≤ a i , v ≤ 1 0 9 0\le a_i,v\le 10^9 0ai?,v109
1 ≤ l , r , i ≤ n 1\le l,r,i\le n 1l,r,in
2 s , 128 MB 2\text{s},128\text{MB} 2s,128MB

Solution

顯然使用線段樹.
由于帶有 chmax ? \operatorname{chmax} chmax,每個節點維護標記 ( k , b ) (k,b) (k,b) 表示 x x x 變為 max ? ( x + k , b ) \max(x+k,b) max(x+k,b).
那么三種修改可以如下表示:

  • add ? \operatorname{add} add 操作: ( v , ? ∞ ) (v,-\infty) (v,?).
  • subtract ? \operatorname{subtract} subtract 操作: ( ? v , 0 ) (-v,0) (?v,0).
  • assign ? \operatorname{assign} assign 操作: ( ? ∞ , v ) (-\infty,v) (?,v).

由于需要求 h i h_i hi?,還需要維護歷史值的標記 ( hk , hb ) (\textit{hk},\textit{hb}) (hk,hb).
考慮合并,畫出圖像(我畫不好不獻丑了),可得:

  • ( k 0 , b 0 ) + ( k 1 , b 1 ) = ( k 0 + k 1 , max ? ( b 0 + k 1 , b 1 ) ) (k_0,b_0)+(k_1,b_1)=(k_0+k_1,\max(b_0+k_1,b_1)) (k0?,b0?)+(k1?,b1?)=(k0?+k1?,max(b0?+k1?,b1?)).
  • ( hk 0 , hb 0 ) + ( hk 1 , hb 1 ) = ( max ? ( hk 0 , k 0 + hk 1 ) , max ? ( hb 0 , hb 1 , b 0 + hk 1 ) ) (\textit{hk}_0,\textit{hb}_0)+(\textit{hk}_1,\textit{hb}_1)=(\max(\textit{hk}_0,k_0+\textit{hk}_1),\max(\textit{hb}_0,\textit{hb}_1,b_0+\textit{hk}_1)) (hk0?,hb0?)+(hk1?,hb1?)=(max(hk0?,k0?+hk1?),max(hb0?,hb1?,b0?+hk1?)).

查詢時直接取出點 i i i 的標記,計算即可.
注意幺元 e = ( 0 , ? ∞ ) e=(0,-\infty) e=(0,?),合并 k k k 時需要和 ? ∞ -\infty ? max ? \max max,以及開 long long.

Code

3 KB , 2.93 s , 45.11 MB (in total, C++ 20) 3\text{KB},2.93\text{s},45.11\text{MB}\;\texttt{(in total, C++ 20)} 3KB,2.93s,45.11MB(in?total,?C++?20)

#include <bits/stdc++.h>
using namespace std;using i64 = long long;
using ui64 = unsigned long long;
using i128 = __int128;
using ui128 = unsigned __int128;
using f4 = float;
using f8 = double;
using f16 = long double;template<class T>
bool chmax(T &a, const T &b){if(a < b){ a = b; return true; }return false;
}template<class T>
bool chmin(T &a, const T &b){if(a > b){ a = b; return true; }return false;
}constexpr i64 inf = 2e18;
namespace seg_tree {struct Tag {i64 hk, hb, k, b;inline Tag() : hk(0), hb(-inf), k(0), b(-inf) {}inline Tag(i64 _hk, i64 _hb, i64 _k, i64 _b) : hk(_hk), hb(_hb), k(_k), b(_b) {}inline void apply(const Tag& t) {hk = max(hk, k + t.hk);hb = max(hb, max(b + t.hk, t.hb));k = max(k + t.k, -inf);b = max(b + t.k, t.b);}inline i64 f(i64 x) { return max(k + x, b); }inline i64 g(i64 x) { return max(hk + x, hb); }};struct Node {int l, r;Tag tag;};inline int ls(int u) { return 2 * u + 1; }inline int rs(int u) { return 2 * u + 2; }struct SegTree {vector<Node> tr;inline SegTree() {}inline SegTree(int n) : tr(n << 1) { build(0, 0, n - 1); }inline void pushdown(int u, int mid) {tr[ls(mid)].tag.apply(tr[u].tag);tr[rs(mid)].tag.apply(tr[u].tag);tr[u].tag = Tag();}inline void build(int u, int l, int r) {tr[u].l = l, tr[u].r = r, tr[u].tag = Tag();if (l == r) return;const int mid = (l + r) >> 1;build(ls(mid), l, mid), build(rs(mid), mid + 1, r);}inline void update(int u, int l, int r, i64 k, i64 b) {if (l <= tr[u].l && tr[u].r <= r) return tr[u].tag.apply(Tag(k, b, k, b));const int mid = (tr[u].l + tr[u].r) >> 1;pushdown(u, mid);if (l <= mid) update(ls(mid), l, r, k, b);if (r > mid) update(rs(mid), l, r, k, b);}inline Tag get(int u, int p) {if (tr[u].l == tr[u].r) return tr[u].tag;const int mid = (tr[u].l + tr[u].r) >> 1;pushdown(u, mid);if (p <= mid) return get(ls(mid), p);else return get(rs(mid), p);}inline void range_add(int l, int r, i64 x) { update(0, l, r, x, -inf); }inline void range_sub(int l, int r, i64 x) { update(0, l, r, -x, 0); }inline void range_assign(int l, int r, i64 x) { update(0, l, r, -inf, x); }inline Tag get(int p) { return get(0, p); }};
}
using seg_tree::SegTree;signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, m;scanf("%d %d", &n, &m);vector<i64> a(n);for (int i = 0; i < n; i++) scanf("%lld", &a[i]);SegTree sgt(n);for (int i = 0, op; i < m; i++) {scanf("%d", &op);if (op <= 3) {int l, r; i64 k;scanf("%d %d %lld", &l, &r, &k), l--, r--;if (op == 1) sgt.range_add(l, r, k);if (op == 2) sgt.range_sub(l, r, k);if (op == 3) sgt.range_assign(l, r, k);}else {int x; scanf("%d", &x), x--;auto tag = sgt.get(x);if (op == 4) printf("%lld\n", tag.f(a[x]));if (op == 5) printf("%lld\n", tag.g(a[x]));}}return 0;
}

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

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

相關文章

C++開發過程中的注意事項詳解

目錄 C++開發過程中的注意事項詳解 一、內存管理:避免泄漏與資源浪費 1.1 使用智能指針管理動態內存 1.2 避免手動內存管理的陷阱 1.3 利用RAII機制管理資源 1.4 容器與內存分配 二、安全性:防御攻擊與未定義行為 2.1 輸入驗證與安全編碼 2.2 使用安全的通信協議 2…

Git 時光機:修改Commit信息

前言 列位看官都知道&#xff0c;Git 的每一次 git commit&#xff0c;其中會包含作者&#xff08;Author&#xff09;和提交者&#xff08;Committer&#xff09;的姓名與郵箱。有時可能會因為配置錯誤、切換了開發環境&#xff0c;或者只是單純的手滑&#xff0c;導致 commi…

QSFP+、QSFP28、QSFP-DD接口分別實現40G、100G、200G/400G以太網接口

常用的光模塊結構形式&#xff1a; 1&#xff09;QSFP等效于4個SFP&#xff0c;支持410Gbit/s通道傳輸&#xff0c;可通過4個通道實現40Gbps傳輸速率。與SFP相比&#xff0c;QSFP光模塊的傳輸速率可達SFP光模塊的四倍&#xff0c;在部署40G網絡時可直接使用QSFP光模塊&#xf…

好用的播放器推薦

以下是一些好用的播放器推薦&#xff0c;按照不同平臺和使用場景分類&#xff1a; 電腦端 VLC Media Player 特點&#xff1a;開源、跨平臺&#xff0c;支持幾乎所有的音視頻格式&#xff0c;無需額外安裝解碼器。具備強大的功能&#xff0c;如播放列表管理、視頻和音頻濾鏡、…

Vue基礎(8)_監視屬性、深度監視、監視的簡寫形式

監視屬性(watch)&#xff1a; 1.當被監視的屬性變化時&#xff0c;回調函數(handler)自動調用&#xff0c;進行相關操作。 2.監視的屬性必須存在&#xff0c;才能進行監視&#xff01;&#xff01; 3.監視的兩種寫法&#xff1a; (1).new Vue時傳入watch配置 (2).通過vm.$watc…

AI服務器的作用都有哪些?

根據網絡環境的飛速發展&#xff0c;人工智能技術逐漸入駐到各個行業當中&#xff0c;其中AI服務器則是一種專門用來運行人工智能算法和模型的硬件設備&#xff0c;通常具備高性能計算、大容量存儲和并行計算等多種功能&#xff0c;本文就來詳細講解一下AI服務器的作用&#xf…

[250508] Linux 內核瘦身:棄用 i486 及早期 586 CPU 支持

目錄 Linux 內核計劃精簡&#xff1a;將移除對古董級 CPU 的支持 Linux 內核計劃精簡&#xff1a;將移除對古董級 CPU 的支持 核心動態&#xff1a; Linux 內核開發社區正計劃一項重要的代碼清理工作&#xff0c;目標是移除對非常古老的 i486 及早期 586 (如早期奔騰) CPU 架構…

ROM詳解

一、ROM基礎原理 定義與特性 ROM&#xff08;Read-Only Memory&#xff0c;只讀存儲器&#xff09;是一種非易失性存儲器&#xff0c;數據在制造或編程后永久保存&#xff0c;斷電后不丟失。其核心特性為數據不可修改&#xff08;或需特殊條件修改&#xff09;。 存儲原理&…

解決虛擬機掛起之后的網絡問題

相信很多人都有遇到過自己在VM上面手滑點了個掛起然后就連不了網絡的情況吧&#xff0c;我也遇到了&#xff0c;下面是我的解決辦法&#xff0c;希望對大家有所幫助&#xff01; 我運行完如下&#xff1a; 基本上出現綠色的就說明網絡連上啦&#xff01;

在Star-CCM+中實現UDF并引用場數據和網格數據

在Star-CCM中實現UDF并引用場數據和網格數據 Star-CCM中的用戶自定義函數(UDF)允許用戶通過Java或C/C編程擴展軟件功能。下面我將詳細介紹如何實現UDF并引用模擬數據。 1. UDF基礎實現方法 1.1 創建UDF的步驟 在Star-CCM中&#xff0c;右鍵點擊"工具" → “用戶函…

ConnectionResetError(10054, ‘遠程主機強迫關閉了一個現有的連接,Python爬蟲

文章目錄 ConnectionResetError(10054, 遠程主機強迫關閉了一個現有的連接1.問題描述2.嘗試的解決方法&#xff08;均未生效&#xff09;2.1 請求重試機制2.2 模擬瀏覽器請求頭2.3 關閉連接資源2.4 延遲訪問 3.解決方案&#xff1a;使用 proxy_pool IP 代理池最后參考文章 Conn…

Redis相關命令詳解與原理(一)

目錄 Redis是什么&#xff1f; Redis 的特點和功能 Redis工作模式 與MySQL的區別 安裝編譯和啟動 redis的value類型編碼 string類型 基礎命令 應用 1.對象存儲 2.累加器 3.分布式鎖 4.位運算 list類型 基礎命令 應用 1.棧&#xff08;先進后出 FILO&#xff0…

Starrocks 的 ShortCircuit短路徑

背景 本文基于 Starrocks 3.3.5 本文主要來探索一下Starrocks在FE端怎么實現 短路徑&#xff0c;從而加速點查查詢速度。 在用戶層級需要設置 enable_short_circuit 為true 分析 數據流&#xff1a; 直接到StatementPlanner.createQueryPlan方法&#xff1a; ... OptExpres…

Oracle非歸檔模式遇到文件損壞怎么辦?

昨天夜里基地夜班的兄弟&#xff0c;打電話說有個報表庫連不上了&#xff0c;趕緊起來連上VPN查看一下&#xff0c;看到實例宕機了&#xff0c;先趕緊startup起來。 1.查看報錯信息 環境介紹&#xff1a;Redhat 6.9 Oracle 11.2.0.4 No Archive Mode 查看alert log 關鍵報…

關于一些平時操作系統或者軟件的步驟轉載

關于一些平時操作系統或者軟件的步驟轉載 關于python環境搭建 關于Ubuntu 1. 雙系統之Ubuntu快速卸載 2. VMware安裝Ubuntu虛擬機實現COpenCV代碼在虛擬機下運行教程 3. ubuntu 下 opencv的安裝以及配置&#xff08;親測有效&#xff09; 4. Ubuntu將c編譯成.so文件并測試 5…

hz2新建Keyword頁面

新建一個single-keywords.php即可&#xff0c;需要篩選項再建taxonomy-knowledge-category.php 參考&#xff1a;https://www.tkwlkj.com/customize-wordpress-category-pages.html WordPress中使用了ACF創建了自定義產品分類products&#xff0c;現在想實現自定義產品分類下的…

VRRP協議-IP地址冗余配置

有兩個服務器172.16.42.1和172.16.42.121&#xff0c;通過VRRP協議使兩臺設備共用一個虛擬地址172.16.42.100&#xff0c;當 172.16.42.1 可用時&#xff0c;它會作為主路由器使用虛擬 IP 地址&#xff1b;當它不可用時&#xff0c;172.16.42.121 會接管虛擬 IP 地址&#xff0…

21、DeepSeekMath論文筆記(GRPO)

DeepSeekMath論文筆記 0、研究背景與目標1、GRPO結構GRPO結構PPO知識點**1. PPO的網絡模型結構****2. GAE&#xff08;廣義優勢估計&#xff09;原理****1. 優勢函數的定義**2.GAE&#xff08;廣義優勢估計&#xff09; 2、關鍵技術與方法3、核心實驗結果4、結論與未來方向關鍵…

卡爾曼濾波算法(C語言)

此處感謝華南虎和互聯網的眾多大佬的無償分享。 入門常識 先簡單了解以下概念&#xff1a;疊加性&#xff0c;齊次性。 用大白話講&#xff0c;疊加性&#xff1a;多個輸入對輸出有影響。齊次性&#xff1a;輸入放大多少倍&#xff0c;輸出也跟著放大多少倍 卡爾曼濾波符合這…

SolidWork-2023 鼠標工程

地址 https://github.com/MartinxMax/SW2023-Project/tree/main/mouse 鼠標