信息學奧賽一本通 1539:簡單題 | 洛谷 P5057 [CQOI2006] 簡單題

【題目鏈接】

ybt 1539:簡單題
洛谷 P5057 [CQOI2006] 簡單題

【題目考點】

1. 樹狀數組

模板題及講解:洛谷 P3374 【模板】樹狀數組

【解題思路】

解法1:樹狀數組

該有01構成數組初值都為0。
某位置的元素被修改奇數次后值為1,被修改偶數次后值為0。
因此只需要求出某位置元素被修改的次數,即可得到該位置的數值。
每次修改是讓連續的一段序列翻轉,也就是選擇數組的一段區間,將該區間中的元素取反(0變為1,1變為0)。
求某元素被修改的次數,就是求有多少個區間覆蓋的該元素。
假想存在數組:cL,cR
c L i cL_i cLi?表示區間左端點為i的區間數。
c R i cR_i cRi?表示區間右端點為i的區間數。
s u m L i sumL_i sumLi? c L cL cL的前綴和,即左端點L在[1,i]范圍內的區間數
s u m R i sumR_i sumRi? c R cR cR的前綴和,右端點R在[1,i]范圍內的區間數
分別對cL、cR數組建立樹狀數組,借助樹狀數組可以在有單點修改的情況下,以 O ( log ? n ) O(\log n) O(logn)時間復雜度求出序列的前綴和。

如果區間[L, R]包含x,則區間左端點L一定小于等于x。
如果區間[L, R]的右端點R小于x,這樣的區間的左端點L也一定小于x。
考察左端點 L ≤ x L\le x Lx的區間,有兩類:

  • 右端點 R < x R<x R<x的區間
  • 右端點 R ≥ x R\ge x Rx的區間,即包含x的區間。

左端點 L ≤ x L\le x Lx的區間數量為 s u m L x sumL_x sumLx?
右端點 R < x R < x R<x的區間數量為 s u m R x ? 1 sumR_{x-1} sumRx?1?
設包含x的區間的數量為 a n s x ans_x ansx?
有: s u m L x = s u m R x ? 1 + a n s x sumL_x = sumR_{x-1}+ans_x sumLx?=sumRx?1?+ansx?
a n s x = s u m L x ? s u m R x ? 1 ans_x = sumL_x-sumR_{x-1} ansx?=sumLx??sumRx?1?

具體做法:

  1. 如果需要將區間[l, r]中的元素取反,則存在一個區間 [ l , r ] [l, r] [l,r],使 c L l cL_l cLl?增加1, c R r cR_r cRr?增加1。樹狀數組進行相應的單點修改操作。
  2. 如果需要查詢第x元素的值,則通過 a n s x = s u m L x ? s u m R x ? 1 ans_x=sumL_x-sumR_{x-1} ansx?=sumLx??sumRx?1?求出x被區間修改的次數 a n s x ans_x ansx?,如果 a n s x ans_x ansx?為奇數,第x元素值為1,否則第x元素值為0。

解法2:線段樹 維護區間的異或值

考慮對原數字序列進行區間修改、區間查詢。
區間修改的操作為對某區間中每個元素都進行01取反,對于由01構成的序列,01取反操作即為xor 1(異或1)操作。
因為 0 x o r 1 = 1 0\ xor\ 1 = 1 0?xor?1=1 1 x o r 1 = 0 1\ xor\ 1 = 0 1?xor?1=0
區間標記tag設為本段區間中的元素需要被異或的值,即本段區間每個元素實際的值為當前值 x o r t a g \ xor\ tag ?xor?tag
注意進行區間修改、單點查詢前需要進行標記下傳。

【題解代碼】

解法1:樹狀數組
  • 寫法1:為treeL、treeR設置兩套樹狀數組處理函數
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int n, m, treeL[N], treeR[N];//cL[i]:左端點為i的區間數,treeL:cL的樹狀數組
int lowbit(int x)
{return x & -x;
}
void updateL(int i)//cL[i]++
{for(int x = i; x <= n; x += lowbit(x))treeL[x]++;
}
void updateR(int i)//cR[i]++
{for(int x = i; x <= n; x += lowbit(x))treeR[x]++;
}
int sumL(int i)//cL的前綴和
{int s = 0;for(int x = i; x > 0; x -= lowbit(x))s += treeL[x];return s;
}
int sumR(int i)//cR的前綴和
{int s = 0;for(int x = i; x > 0; x -= lowbit(x))s += treeR[x];return s;
}
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int t, l, r, x;cin >> n >> m;for(int i = 1; i <= m; ++i){cin >> t;if(t == 1){cin >> l >> r;updateL(l);updateR(r);}else{cin >> x;cout << (sumL(x)-sumR(x-1))%2 << '\n';//初值為0,修改偶數次為0,修改奇數次為1 }}return 0;
}
  • 寫法2:只設一套樹狀數組處理函數,傳入數組地址
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int n, m, treeL[N], treeR[N];//cL[i]:左端點為i的區間數,treeL:cL的樹狀數組 cR[i]:右端點為i的區間數,treeR:cR的樹狀數組
int lowbit(int x)
{return x & -x;
}
void update(int i, int *tree)//cL[i]++,或cR[i]++。
{//傳入數組名treeL或treeR,可以修改對應傳入的tree數組for(int x = i; x <= n; x += lowbit(x))tree[x]++;
}
int sum(int i, int *tree)//求cL或cR的前綴和
{int s = 0;for(int x = i; x > 0; x -= lowbit(x))s += tree[x];return s;
}
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int t, l, r, x;cin >> n >> m;for(int i = 1; i <= m; ++i){cin >> t;if(t == 1){cin >> l >> r;update(l, treeL);update(r, treeR);}else{cin >> x;//x為題目中的i,求x位置的值 cout << (sum(x, treeL)-sum(x-1, treeR))%2 << '\n';//初值為0,修改偶數次為0,修改奇數次為1 }}return 0;
}

解法2:線段樹 維護區間異或值

#include<bits/stdc++.h>
using namespace std;
#define N 100005
struct Node
{int val, l, r, tag;
} tree[4*N];
int n, m;
void addTag(int i)
{tree[i].tag ^= 1;tree[i].val ^= 1;
}
void pushDown(int i)
{if(tree[i].tag == 0)return;addTag(2*i);addTag(2*i+1);tree[i].tag = 0;
}
void build(int i, int l, int r)
{tree[i].l = l, tree[i].r = r;if(l == r)//tree[i].val初值都為0 return;int mid = (l+r)/2;build(2*i, l, mid);build(2*i+1, mid+1, r);
}
void update(int i, int l, int r)//a[l]~a[r]取反 
{if(tree[i].r < l || tree[i].l > r)return;if(l <= tree[i].l && tree[i].r <= r)return addTag(i);pushDown(i);update(2*i, l, r);update(2*i+1, l, r);
}
int query(int i, int x)//a[x]
{if(tree[i].l == tree[i].r)return tree[i].val;pushDown(i); if(x <= tree[2*i].r)return query(2*i, x);else//x >= tree[2*i+1].l return query(2*i+1, x);
}
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int t, l, r, x;cin >> n >> m;build(1, 1, n);while(m--){cin >> t;if(t == 1){cin >> l >> r;update(1, l, r); }else//t == 2{cin >> x;cout << query(1, x) << '\n';}}return 0;
}

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

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

相關文章

倉頡開發語言入門教程:搭建開發環境

倉頡開發語言作為華為為鴻蒙系統自研的開發語言&#xff0c;雖然才發布不久&#xff0c;但是它承擔著極其重要的歷史使命。作為鴻蒙開發者&#xff0c;掌握倉頡開發語言將成為不可或缺的技能&#xff0c;今天我們從零開始&#xff0c;為大家分享倉頡語言的開發教程&#xff0c;…

玉米籽粒發育

成熟玉米籽粒的結構 玉米籽粒的組成 成熟的玉米籽粒主要由以下三部分組成&#xff1a; 母體組織&#xff1a;包括種皮、胎座和花梗。種皮由珠被發育而來&#xff0c;起到保護種子的作用&#xff0c;并在種子的休眠和萌發中發揮重要作用。胚&#xff1a;包含根分生組織、莖分…

sherpa-ncnn:音頻處理跟不上采集速度 -- 語音轉文本大模型

目錄 1. 問題報錯2. 解決方法 1. 問題報錯 報錯&#xff1a; An overrun occurred, which means the RTF of the current model on your board is larger than 1. You can use ./bin/sherpa-ncnn to verify that. Please select a smaller model whose RTF is less than 1 fo…

Postman一直打不開的解決辦法

Postman 是一款非常流行的開源 API 開發工具&#xff0c;主要用于構建、測試、調試和文檔化應用程序接口&#xff08;API&#xff09;。但有時它的性能不會特別穩定&#xff0c;功能限制和擴展性不足&#xff1b;應用于開發、測試、運維等環節&#xff0c;尤其在開發 RESTful A…

問題|對只允許輸入的變量是否進行了更改

“對只允許輸入的變量是否進行了更改”這一問題的核心是&#xff1a;在編程中&#xff0c;某些變量被設計為僅用于輸入&#xff08;只讀&#xff09;&#xff0c;但在代碼中可能被意外修改&#xff0c;導致潛在錯誤。以下是詳細解釋&#xff1a; 1. 什么是“只允許輸入的變量”…

RPC與SOAP的區別

一.RPC&#xff08;遠程過程調用&#xff09;和SOAP&#xff08;簡單對象訪問協議&#xff09;均用于實現分布式系統中的遠程通信&#xff0c;但兩者在設計理念、協議實現及應用場景上存在顯著差異。 二.對比 1.設計理念 2.協議規范 3.技術特性 4.典型應用場景 5.總結 三.總結…

c#的內存指針操作(僅用于記錄)

c#也可以直接操作內存指針&#xff0c;如下為示例&#xff1a; unsafe {byte[] a {1,2,3};fixed (byte* p1 a, p2 &a[^1]){Debugger.Log(1, "test", $"max index:{p2-p1}");Debugger.Log(1, "test", $"address:{(long)p1:X}")…

Jsp技術入門指南【十三】基于 JSTL SQL 標簽庫實現 MySQL 數據庫連接與數據分頁展示

Jsp技術入門指南【十三】基于 JSTL SQL 標簽庫實現 MySQL 數據庫連接與數據分頁展示 前言一、回顧SQL標簽的內容1. 什么是JSTL SQL標簽&#xff1f;2.為什么要用SQL標簽&#xff1f;3.第一步&#xff1a;引入SQL標簽庫4. SQL標簽的核心功能&#xff1a;連接數據庫標簽常用屬性&…

羽毛球訂場小程序源碼介紹

基于ThinkPHP、FastAdmin以及UniApp開發的羽毛球訂場小程序源碼&#xff0c;這款小程序旨在為羽毛球愛好者提供便捷的場地預訂服務。 該小程序前端采用UniApp框架開發&#xff0c;具有良好的跨平臺兼容性&#xff0c;可以一鍵發布至iOS和Android平臺&#xff0c;極大地提高了開…

Unreal Engine: Windows 下打包 AirSim項目 為 Linux 平臺項目

環境&#xff1a; Windows: win10, UE4.27, Visual Studio 2022 Community.Linux: 22.04 windows環境安裝教程&#xff1a; 鏈接遇到的問題&#xff08;問題&#xff1a;解決方案&#xff09; 點擊Linux打包按鈕&#xff0c;跳轉至網頁而不是執行打包流程&#xff1a;用VS打開項…

SpringBoot 3.x 集成 MyBatisPlus

文章目錄 集成 MyBatisPlus第 1 步:創建 SpringBoot 項目第 2 步:添加 MyBatisPlus 依賴第 3 步:編寫 CRUD 代碼創建 Entity創建 Mapper創建 Service編寫 Controller第 4 步:執行初始化 SQL第 5 步:配置第 6 步:測試測試 ControllerMapper 層單元測試參考?? 目標 1:基…

java基礎-抽象類和抽象方法

1.abstract 可以修飾&#xff1a;類、方法 &#xff08;1&#xff09;修飾類&#xff1a; 類不能被實例化&#xff1b; 抽象類一定有構造器&#xff0c;便于子類實例化時調用&#xff1b; &#xff08;2&#xff09;修飾方法&#xff1a;抽象方法 只有方法的聲明&#xff…

解決電腦問題(8)——網絡問題

電腦網絡出現問題的原因較為復雜&#xff0c;以下是從網絡連接、網絡配置以及網絡環境等方面的常見問題及解決方法&#xff1a; 網絡連接問題 檢查物理連接&#xff1a;對于有線網絡&#xff0c;檢查網線是否插好&#xff0c;網線有無破損、斷裂等情況。對于無線網絡&#xff…

ubuntu 20.04 ping baidu.coom可以通,ping www.baidu.com不通 【DNS出現問題】解決方案

ping baidu.coom可以通&#xff0c;ping www.baidu.com不通【DNS出現問題】解決方案 檢查IPV6是否有問題 # 1. 檢查 IPv6 地址&#xff0c;記住網絡接口的名稱 ip -6 addr show# 2. 測試本地 IPv6&#xff0c;eth0換成自己的網絡接口名稱 ping6 ff02::1%eth0# 3. 檢查路由 ip…

【AI生成PPT】使用ChatGPT+Overleaf自動生成學術論文PPT演示文稿

【AI生成PPT】使用ChatGPTOverleaf自動生成學術論文PPT演示文稿 文章摘要&#xff1a;使用ChatGPTBeamer自動生成學術論文PPT演示文稿??Beamer??是什么Overleaf編輯工具ChatGPT生成Beamer Latex代碼論文獲取prompt設計 生成結果 文章摘要&#xff1a; 本文介紹了一種高效利…

JVM 垃圾回收器

以下是對主流 JVM 垃圾回收器的詳細解析&#xff0c;涵蓋 一、Serial GC&#xff08;單線程串行回收器&#xff09; 二、Parallel GC&#xff08;吞吐量優先回收器&#xff09; 三、CMS&#xff08;Concurrent Mark Sweep&#xff0c;低延遲回收器&#xff09; 四、G1&…

從零開始學習three.js(21):一文詳解three.js中的矩陣Matrix和向量Vector

一、三維世界的數學基石 在Three.js的三維世界里&#xff0c;所有視覺效果的實現都建立在嚴密的數學基礎之上。其中向量&#xff08;Vector&#xff09; 和矩陣&#xff08;Matrix&#xff09; 是最核心的數學工具&#xff0c;它們就像構建數字宇宙的原子與分子&#xff0c;支…

ArcGIS Pro 3.4 二次開發 - 內容

環境&#xff1a;ArcGIS Pro SDK 3.4 .NET 8 文章目錄 內容1 工程1.1 創建一個空工程1.2 使用指定名稱創建新工程1.3 使用Pro的默認設置創建新工程1.4 使用自定義模板文件創建新工程1.5 使用 ArcGIS Pro 提供的模板創建工程1.6 打開現有工程1.7 獲取當前工程1.8 獲取當前工程的…

【Python-Day 15】深入探索 Python 字典 (下):常用方法、遍歷、推導式與嵌套實戰

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

31、魔法生物圖鑒——React 19 Web Workers

一、守護神協議&#xff08;核心原理&#xff09; 1. 靈魂分裂術&#xff08;線程架構&#xff09; // 主組件中初始化Workerconst workerRef useRef(null);?useEffect(() > {workerRef.current new Worker(new URL(./creatureWorker.js, import.meta.url));workerRef.…