P2572 [SCOI2010] 序列操作 Solution

Description

給定 01 01 01 序列 a = ( a 1 , a 2 , ? , a n ) a=(a_1,a_2,\cdots,a_n) a=(a1?,a2?,?,an?),并定義 f ( l , r ) = [ ( ∑ i = l r a i ) = r ? l + 1 ] f(l,r)=[(\sum\limits_{i=l}^r a_i)=r-l+1] f(l,r)=[(i=lr?ai?)=r?l+1].
執行 m m m 個操作,分五種:

  • reset ? ( l , r ) \operatorname{reset}(l,r) reset(l,r):對每個 i ∈ [ l , r ] i\in[l,r] i[l,r] 執行 a i ← 0 a_i\gets 0 ai?0.
  • set ? ( l , r ) \operatorname{set}(l,r) set(l,r):對每個 i ∈ [ l , r ] i\in[l,r] i[l,r] 執行 a i ← 1 a_i\gets 1 ai?1.
  • negate ? ( l , r ) \operatorname{negate}(l,r) negate(l,r):對每個 i ∈ [ l , r ] i\in[l,r] i[l,r] 執行 a i ← 1 ? a i a_i\gets 1-a_i ai?1?ai?.
  • sum ? ( l , r ) \operatorname{sum}(l,r) sum(l,r):求 ∑ i = l r a i \sum\limits_{i=l}^r a_i i=lr?ai?.
  • gss ? ( l , r ) \operatorname{gss}(l,r) gss(l,r):求 max ? [ s , t ] ∈ [ l , r ] ( t ? s + 1 ) × f ( s , t ) \max\limits_{[s,t]\in[l,r]}(t-s+1)\times f(s,t) [s,t][l,r]max?(t?s+1)×f(s,t).

Limitations

1 ≤ n , m ≤ 1 0 5 1\le n,m\le 10^5 1n,m105
1 ≤ l ≤ r ≤ n 1\le l\le r\le n 1lrn
1 s , 128 MB 1\text{s},128\text{MB} 1s,128MB

Solution

線段樹做法.
節點上維護 S = ( sum , lsum , rsum , tsum , len ) S=(\textit{sum},\textit{lsum},\textit{rsum},\textit{tsum},\textit{len}) S=(sum,lsum,rsum,tsum,len),用類似最大子段和的方法更新.
由于要取反, 0 0 0 1 1 1 都分別需要一個 S S S(下記為 S 0 S_0 S0? S 1 S_1 S1?) .
然后需要標記 T T T,顯然 T = ( cov , rev ) T=(\textit{cov},\textit{rev}) T=(cov,rev)(分別為賦值和取反標記)

  • 考慮賦值,我們直接將 S c o v S_{cov} Scov? 全部填上 len \textit{len} len S 1 ? c o v S_{1-cov} S1?cov? 全部清零( len \textit{len} len 要不變)
  • 考慮翻轉,我們直接交換 S 0 S_0 S0? S 1 S_1 S1?.

然后需要考慮 T + T T+T T+T

  • 賦值可以直接打標記.
  • 對于取反,當一個區間賦值后,取反就相當于賦值 ( 1 ? cov ) (1-\textit{cov}) (1?cov),那么我們可以將 cov \textit{cov} cov 取反(此時 rev \textit{rev} rev 沒用,要置為 0 0 0),否則,直接更新 rev \textit{rev} rev.

有不少坑點:

  • 下標從 0 0 0 開始.
  • 沒有被賦值的節點, cov \textit{cov} cov 要置為 ? 1 -1 ?1 表示沒有賦值.
  • 更新 S S S 時,左半區間滿了, lsum \textit{lsum} lsum 才能跨越中點, rsum \textit{rsum} rsum 同理.
  • 先處理 cov \textit{cov} cov 再處理 rev \textit{rev} rev.
  • rev \textit{rev} rev 標記時 ^= 1 不要寫成 = 1.

Code

3.9 KB , 0.45 s , 11.63 MB (in total, C++20 with O2) 3.9\text{KB},0.45\text{s},11.63\text{MB}\;\texttt{(in total, C++20 with O2)} 3.9KB,0.45s,11.63MB(in?total,?C++20?with?O2)
建議封裝 S S S(見代碼中的 Data),會好寫不少.

#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;
}namespace seg_tree {struct Data {int sum, lsum, rsum, tsum, len;inline Data() {}inline Data(int x) : sum(x), lsum(x), rsum(x), tsum(x), len(1) {}inline Data(int _sum, int _lsum, int _rsum, int _tsum, int _len): sum(_sum), lsum(_lsum), rsum(_rsum), tsum(_tsum), len(_len) {}};inline Data operator+(const Data& lhs, const Data& rhs) {const int _sum = lhs.sum + rhs.sum;const int _lsum = lhs.lsum + (lhs.sum == lhs.len) * rhs.lsum;const int _rsum = rhs.rsum + (rhs.sum == rhs.len) * lhs.rsum;const int _tsum = std::max({lhs.tsum, rhs.tsum, lhs.rsum + rhs.lsum});const int _len = lhs.len + rhs.len;return Data(_sum, _lsum, _rsum, _tsum, _len);}struct Node {int l, r;array<Data, 2> dat;int cov, rev;inline Data& operator[](int i) { return dat[i]; }inline Data operator[](int i) const { return dat[i]; }};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(const vector<int>& a) {const int n = a.size();tr.resize(n << 1);build(0, 0, n - 1, a);}inline void pushup(int u, int mid) {for (int i = 0; i < 2; i++) tr[u][i] = tr[ls(mid)][i] + tr[rs(mid)][i];}inline void apply(int u, int cov, int rev) {if (~cov) {const int len = tr[u][cov].len;tr[u][cov] = Data(len, len, len, len, len);tr[u][cov ^ 1] = Data(0, 0, 0, 0, len);tr[u].cov = cov;tr[u].rev = 0;return;}if (rev) {swap(tr[u][0], tr[u][1]);if (~tr[u].cov) tr[u].cov ^= 1;else tr[u].rev ^= 1;}}inline void pushdown(int u, int mid) {apply(ls(mid), tr[u].cov, tr[u].rev);apply(rs(mid), tr[u].cov, tr[u].rev);tr[u].cov = -1, tr[u].rev = 0;}void build(int u, int l, int r, const vector<int>& a) {tr[u].l = l, tr[u].r = r, tr[u].cov = -1;if (l == r) {for (int i = 0; i < 2; i++) tr[u][i] = Data(a[l] == i);return;}const int mid = (l + r) >> 1;build(ls(mid), l, mid, a);build(rs(mid), mid + 1, r, a);pushup(u, mid);}void update(int u, int l, int r, int cov, int rev) {if (l <= tr[u].l && tr[u].r <= r) return apply(u, cov, rev);const int mid = (tr[u].l + tr[u].r) >> 1;pushdown(u, mid);if (l <= mid) update(ls(mid), l, r, cov, rev);if (r > mid) update(rs(mid), l, r, cov, rev);pushup(u, mid);}Data query(int u, int l, int r) {if (l <= tr[u].l && tr[u].r <= r) return tr[u][1];const int mid = (tr[u].l + tr[u].r) >> 1;pushdown(u, mid);if (r <= mid) return query(ls(mid), l, r);else if (l > mid) return query(rs(mid), l, r);else return query(ls(mid), l, r) + query(rs(mid), l, r);}inline void range_cover(int l, int r, int v) { update(0, l, r, v, 0); }inline void range_negate(int l, int r) { update(0, l, r, -1, 1); }inline int range_sum(int l, int r) { return query(0, l, r).sum; }inline int range_gss(int l, int r) { return query(0, l, r).tsum; }};
}
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<int> a(n);for (int i = 0; i < n; i++) scanf("%d", &a[i]);SegTree sgt(a);for (int i = 0, op, l, r; i < m; i++) {scanf("%d %d %d", &op, &l, &r);if (op == 0) sgt.range_cover(l, r, 0);if (op == 1) sgt.range_cover(l, r, 1);if (op == 2) sgt.range_negate(l, r);if (op == 3) printf("%d\n", sgt.range_sum(l, r));if (op == 4) printf("%d\n", sgt.range_gss(l, r));}return 0;
}

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

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

相關文章

RAG 2.0 深入解讀

作者&#xff1a;阿里云開發者 原文&#xff1a;https://zhuanlan.zhihu.com/p/1903437079603545114? 一、Introduction 過去一年可謂是RAG元年&#xff0c;檢索增強生成技術迅速發展與深刻變革&#xff0c;其創新與應用已深刻重塑了大模型落地的技術范式。站在2025年&#x…

代碼隨想錄第41天:圖論2(島嶼系列)

一、島嶼數量&#xff08;Kamacoder 99&#xff09; 深度優先搜索&#xff1a; # 定義四個方向&#xff1a;右、下、左、上&#xff0c;用于 DFS 中四向遍歷 direction [[0, 1], [1, 0], [0, -1], [-1, 0]]def dfs(grid, visited, x, y):"""對一塊陸地進行深度…

基于CNN的貓狗圖像分類系統

一、系統概述 本系統是基于PyTorch框架構建的智能圖像分類系統&#xff0c;專門針對CIFAR-10數據集中的貓&#xff08;類別3&#xff09;和狗&#xff08;類別5&#xff09;進行分類任務。系統采用卷積神經網絡&#xff08;CNN&#xff09;作為核心算法&#xff0c;結合圖形用…

linux搭建hadoop學習

linux搭建hadoop學習 下載安裝包: 海外資源可能需要翻墻或者找國內資源 cd /opt wget https://dlcdn.apache.org/hadoop/common/hadoop-2.10.2/hadoop-2.10.2.tar.gz tar -zxvf hadoop-2.10.2.tar.gz mv hadoop-2.10.2 hadoop配置環境變量 # 在/etc/profile文件中添加下面內…

Kubernetes生產實戰(十六):集群安全加固全攻略

Kubernetes集群安全加固全攻略&#xff1a;生產環境必備的12個關鍵策略 在容器化時代&#xff0c;Kubernetes已成為企業應用部署的核心基礎設施。但根據CNCF 2023年云原生安全報告顯示&#xff0c;75%的安全事件源于K8s配置錯誤。本文將基于生產環境實踐&#xff0c;系統講解集…

類加載機制詳解:雙親委派模型與打破它的方式

在復雜的 Java 系統中&#xff0c;類加載是最基礎卻常被忽略的一環。理解 JVM 的類加載機制&#xff0c;特別是 雙親委派模型&#xff08;Parent Delegation Model&#xff09;&#xff0c;是我們深入掌握熱部署、插件機制、ClassLoader 隔離、ClassNotFound 錯誤等問題的關鍵。…

Android SDK 開發中的 AAR 與 JAR 區別詳解

在 Android SDK 開發中&#xff0c;構建項目時我們常常會看到生成兩個不同的文件&#xff1a;一個是 build/outputs/aar/*.aar&#xff0c;另一個是 build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar。很多初學者會疑惑&#xff1a;它們之間有什么區別&am…

服務器配置錯誤導致SSL/TLS出現安全漏洞,如何進行排查?

SSL/TLS 安全漏洞排查與修復指南 一、常見配置錯誤類型? 弱加密算法與密鑰問題? 使用弱密碼套件&#xff08;如DES、RC4&#xff09;或密鑰長度不足&#xff08;如RSA密鑰長度<2048位&#xff09;&#xff0c;導致加密強度不足。 密鑰管理不當&#xff08;如私鑰未加密存…

Day20打卡-奇異值SVD分解

今天學習非特征篩選的方法&#xff1a; 知識點回顧&#xff1a; 線性代數概念回顧&#xff08;可不掌握&#xff09;奇異值推導&#xff08;可不掌握&#xff09;奇異值的應用 特征降維&#xff1a;對高維數據減小計算量、可視化數據重構&#xff1a;比如重構信號、重構圖像&am…

temu采購自養號全流程解析:從賬號搭建到安全下單的技術閉環

temu 自養號采購下單技術是一個精細的過程&#xff0c;需要從多個方面進行考慮和操作&#xff0c;其核心在于通過技術手段模擬真實用戶行為&#xff0c;構建獨立、安全的賬號環境以確保賬號的安全性、真實性和采購下單的成功率。以下是對該技術的詳細解析 1. 賬號準備 手機號…

相機Camera日志分析之八:高通Camx HAL架構opencamera三級日志詳解及關鍵字

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了:相機Camera日志分析之七:高通Camx HAL架構opencamera二級日志詳解及關鍵字 這一篇我們開始講: 相機Camera日志分析之八:高通Camx HAL架構opencamera三級日志詳解及關鍵字 目錄 【關注我,后續持續…

自定義類型-結構體(二)

結構體內存對齊 偏移量 指的是結構體中某個成員相對于結構體起始地址的字節距離 第一個成員的起始位置為0&#xff0c;一個字節表示一個單位 這里的數字表示的是該成員地址與結構體首地址之間的值 對齊規則 1.結構體第一個成員的第一個字節的偏移量為0 2.其余成員變量要…

【免費工具】圖吧工具箱2025.02正式版

DIY愛好者的必備工具 軟件截圖&#xff1a; —————【下 載 地 址】——————— 【本章單下載】&#xff1a;https://drive.uc.cn/s/f08aad37ddb14 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/HPQywvPc7iLZu1k0ODFcWMt2n0d?fromfrom_copylink …

DAX 權威指南1:DAX計算、表函數與計算上下文

參考《DAX 權威指南 第二版》 文章目錄 二、DAX簡介2.1 理解 DAX 計算2.2 計算列和度量值2.3 變量2.3.1 VAR簡介2.3.2 VAR的特性 2.4 DAX 錯誤處理2.4.1 DAX 錯誤類型2.4.1.1 轉換錯誤2.4.1.2 算術運算錯誤2.4.1.3 空值或 缺失值 2.4.2 使用IFERROR函數攔截錯誤2.4.2.1 安全地進…

【Linux系統】從零開始構建簡易 Shell:從輸入處理到命令執行的深度剖析

文章目錄 前言一、打印命令行提示符代碼功能概述 二、讀取鍵盤輸入的指令2.1 為什么不繼續使用scanf()而換成了fgets()&#xff1f;2.2 調試輸出的意義2.3 為什么需要去掉換行符&#xff1f; 三、指令切割補充知識&#xff1a; strtok 的函數原型 四、普通命令的執行代碼功能概…

湖倉一體架構在金融典型數據分析場景中的實踐

在數字經濟與金融科技深度融合的今天&#xff0c;數據已成為金融機構的核心戰略資產。然而&#xff0c;傳統數據架構面臨著三大困局&#xff0c;制約著金融機構數據價值的充分釋放。 一、需求驅動更多銀行數據分析場景 金融機構&#xff0c;特別是銀行業&#xff0c;面臨著雙重…

基于Llama3的開發應用(一):Llama模型的簡單部署

Llama模型的簡單部署 0 前言1 環境準備1.1 硬件環境1.2 軟件環境 2 Meta-Llama-3-8B-Instruct 模型簡介2.1 Instruct含義2.2 模型下載 3 簡單調用4 FastAPI 部署4.1 通過FastAPI簡單部署4.2 測試 5 使用 streamlit 構建簡易聊天界面6 總結 0 前言 本系列文章是基于Meta-Llama-…

模擬太陽系(C#編寫的maui跨平臺項目源碼)

源碼下載地址&#xff1a;https://download.csdn.net/download/wgxds/90789056 本資源為用C#編寫的maui跨平臺項目源碼&#xff0c;使用Visual Studio 2022開發環境&#xff0c;基于.net8.0框架&#xff0c;生成的程序為“模擬太陽系運行”。經測試&#xff0c;生成的程序可運行…

基于人工智能的個性化 MySQL 學習路徑推薦研究

基于人工智能的個性化 MySQL 學習路徑推薦研究 摘要: 隨著信息技術的飛速發展,數據庫在各行業應用廣泛,MySQL 作為主流數據庫之一,學習需求龐大。然而,不同學習者在知識水平、學習進度和目標上存在差異,傳統統一的學習路徑難以滿足個性化需求。本研究通過運用人工智能技…

OSPF綜合應用

? 要求&#xff1a; 1&#xff0c;R5為ISP&#xff0c;其上只能配置IP地址&#xff1b;R4作為企業邊界路由器&#xff0c; 出口公網地址需要通過PPP協議獲取&#xff0c;并進行chap認證 2&#xff0c;整個OSPF環境IP基于172.16.0.0/16劃分&#xff1b; 3&#xff0c;所有設備…