牛客round95D

原題鏈接:D-小紅的區間修改(一)_牛客周賽 Round 95

題目背景:

? ? ? ? 初始擁有一個長度10^100元素全為0的數組,進行q查詢,每次查詢如果區間內的元素都為0就將區間變為首項為?1、公差為?1?的等差數列;否則不進行任何操作。輸出每次操作后數組不同元素的個數。

數據范圍:

? ? ? ? 1 <= q?<= 3e5,1 <= l,r?<= 3e5。

解法1(賽時想到的暴力解法):

思路:

? ? ? ?看到區間修改動態更新數據范圍還是3e5就不難想到使用線段樹。

? ? ? ? 每次查詢區間判斷區間和是否為0即可,如果為0且當前區間大于之前的所有區間就更新答案并輸出,否者輸出歷史最大答案。

ac代碼:?
#include <bits/stdc++.h>#define ioscc ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define me(a, x) memset(a, x, sizeof a)
#define all(a) a.begin(), a.end()
#define sz(a) ((int)(a).size())
#define pb(a) push_back(a)
using namespace std;typedef unsigned long long ull;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<vector<int>> vvi;
typedef vector<int> vi;
typedef vector<bool> vb;const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
const int MAX = (1ll << 31) - 1;
const int MIN = 1 << 31;
const int MOD = 1e9 + 7;
const int N = 3e5 + 10;template <class T>
ostream &operator<<(ostream &os, const vector<T> &a) noexcept
{for (int i = 0; i < sz(a) - 10; i++)std::cout << a[i] << ' ';return os;
}template <class T>
istream &operator>>(istream &in, vector<T> &a) noexcept
{for (int i = 0; i < sz(a) - 10; i++)std::cin >> a[i];return in;
}/* ----------------- 有乘就強轉,前綴和開ll ----------------- */struct Node
{int l, r;ll sum;ll add;
} tr[N * 4];void pushup(int u)
{tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}void pushdown(int u)
{if (tr[u].add){tr[u << 1].sum += tr[u].add * (tr[u << 1].r - tr[u << 1].l + 1);tr[u << 1 | 1].sum += tr[u].add * (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1);tr[u << 1].add += tr[u].add;tr[u << 1 | 1].add += tr[u].add;tr[u].add = 0;}
}void build(int u, int l, int r)
{tr[u] = {l, r, 0, 0};if (l == r)return;int mid = (l + r) >> 1;build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
}ll query(int u, int l, int r)
{if (tr[u].l >= l && tr[u].r <= r)return tr[u].sum;pushdown(u);int mid = (tr[u].l + tr[u].r) >> 1;ll sum = 0;if (l <= mid)sum = query(u << 1, l, r);if (r > mid)sum += query(u << 1 | 1, l, r);return sum;
}void update(int u, int l, int r, int v)
{if (tr[u].l >= l && tr[u].r <= r){tr[u].sum += (ll)(tr[u].r - tr[u].l + 1) * v;tr[u].add += v;return;}int mid = (tr[u].l + tr[u].r) >> 1;pushdown(u);if (l <= mid)update(u << 1, l, r, v);if (r > mid)update(u << 1 | 1, l, r, v);pushup(u);
}void solve()
{build(1, 1, N);int sum = 0; // 元素個數int q;cin >> q;while (q--){int l, r;cin >> l >> r;int len = r - l + 1;int t = query(1, l, r);if (t){cout << sum + 1 << endl;continue;}update(1, l, r, 1);if (len > sum)sum = len;cout << sum + 1 << endl;}
}int main()
{ioscc;solve();return 0;
}

解法2(官方解法):

思路:

? ? ? ? 將先前處理過的區間內所有元素的下標存到set里面,每次使用給出的 l 二分找最大的邊界(沒有元素就為尾迭代器),如果找到的邊界大于 r 就說明可以區間全為 0 ,即可放置,否者不能放置;每次將區間內的元素都插入到 set 中,每個元素最多插入 1 次。

ac代碼:
#include <bits/stdc++.h>#define ioscc ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define me(a, x) memset(a, x, sizeof a)
#define all(a) a.begin(), a.end()
#define sz(a) ((int)(a).size())
#define pb(a) push_back(a)
using namespace std;typedef unsigned long long ull;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<vector<int>> vvi;
typedef vector<int> vi;
typedef vector<bool> vb;const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
const int MAX = (1ll << 31) - 1;
const int MIN = 1 << 31;
const int MOD = 1e9 + 7;
const int N = 1e5 + 10;template <class T>
ostream &operator<<(ostream &os, const vector<T> &a) noexcept
{for (int i = 0; i < sz(a) - 10; i++)std::cout << a[i] << ' ';return os;
}template <class T>
istream &operator>>(istream &in, vector<T> &a) noexcept
{for (int i = 0; i < sz(a) - 10; i++)std::cin >> a[i];return in;
}/* ----------------- 有乘就強轉,前綴和開ll ----------------- */void solve()
{int q;cin >> q;int maxx = 0;set<int> s;while (q--){int l, r;cin >> l >> r;auto it = s.lower_bound(l);if (it == s.end() || *it > r){maxx = max(maxx, r - l + 1);for (int i = l; i <= r; ++i)s.emplace(i);}cout << maxx + 1 << endl;}
}int main()
{ioscc;solve();return 0;
}

解法3(大佬解法):

思路:

? ? ? ? 與解法2類似,不過多贅述。

ac代碼:
#include <bits/stdc++.h>#define ioscc ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define me(a, x) memset(a, x, sizeof a)
#define all(a) a.begin(), a.end()
#define sz(a) ((int)(a).size())
#define pb(a) push_back(a)
using namespace std;typedef unsigned long long ull;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<vector<int>> vvi;
typedef vector<int> vi;
typedef vector<bool> vb;const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
const int MAX = (1ll << 31) - 1;
const int MIN = 1 << 31;
const int MOD = 1e9 + 7;
const int N = 1e5 + 10;template <class T>
ostream &operator<<(ostream &os, const vector<T> &a) noexcept
{for (int i = 0; i < sz(a) - 10; i++)std::cout << a[i] << ' ';return os;
}template <class T>
istream &operator>>(istream &in, vector<T> &a) noexcept
{for (int i = 0; i < sz(a) - 10; i++)std::cin >> a[i];return in;
}/* ----------------- 有乘就強轉,前綴和開ll ----------------- */void solve()
{int q;cin >> q;map<int, int> mp;set<int> s;int mx = 0;while (q--){int l, r;cin >> l >> r;if (s.empty()){s.insert(r);mp[r] = l;mx = r - l + 1 + 1;cout << mx << endl;}else{auto p = s.lower_bound(l);int rr = *s.lower_bound(l);int ll = mp[rr];if (ll > r || rr < l || p == s.end()){s.insert(r);mp[r] = l;mx = max(mx, r - l + 1 + 1);cout << mx << endl;}else{cout << mx << endl;}}}
}int main()
{ioscc;solve();return 0;
}

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

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

相關文章

visual studio 2022更改主題為深色

visual studio 2022更改主題為深色 點擊visual studio 上方的 工具-> 選項 在選項窗口中&#xff0c;選擇 環境 -> 常規 &#xff0c;將其中的顏色主題改成深色 點擊確定&#xff0c;更改完成

實踐篇:利用ragas在自己RAG上實現LLM評估②

文章目錄 使用ragas做評估在自己的數據集上評估完整代碼代碼講解1. RAG系統構建核心組件初始化文檔處理流程 2. 評估數據集構建3. RAGAS評估實現1. 評估數據集創建2. 評估器配置3. 執行評估 本系列閱讀&#xff1a; 理論篇&#xff1a;RAG評估指標&#xff0c;檢索指標與生成指…

微軟PowerBI考試 PL300-在 Power BI 中清理、轉換和加載數據

微軟PowerBI考試 PL300-在 Power BI 中清理、轉換和加載數據 Power Query 具有大量專門幫助您清理和準備數據以供分析的功能。 您將了解如何簡化復雜模型、更改數據類型、重命名對象和透視數據。 您還將了解如何分析列&#xff0c;以便知曉哪些列包含有價值的數據&#xff0c;…

PostgreSQL 安裝與配置全指南(適用于 Windows、macOS 與主流 Linux 發行版)

PostgreSQL 是一個功能強大、開源、穩定的對象關系數據庫系統&#xff0c;廣泛用于后端開發、數據處理與分布式架構中。本指南將手把手教你如何在 Windows、macOS 以及主流 Linux 發行版 上安裝 PostgreSQL&#xff0c;并附上安裝驗證命令與基礎配置方法。 一、Windows 安裝與配…

WordPress博客文章SEO的優化技巧

在數字時代&#xff0c;博客不僅用于表達觀點&#xff0c;也能提升品牌影響力并吸引潛在客戶。許多服務器提供商&#xff08;如 Hostease&#xff09;支持 WordPress 一鍵安裝功能&#xff0c;方便新手快速完成安裝&#xff0c;專注于內容創作和 SEO 優化。然而&#xff0c;寫出…

Python:操作 Excel 折疊

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 Python 操作 Excel 系列 讀取單元格數據按行寫入設置行高和列寬自動調整行高和列寬水平…

雨季智慧交通:從車輛盲區到客流統計的算法全覆蓋

雨季智慧交通中的視覺分析技術應用 一、背景&#xff1a;雨季交通的復雜挑戰 雨季是城市交通管理的關鍵考驗期。以濟南為例&#xff0c;強對流天氣伴隨的短時強降水、雷雨大風及冰雹&#xff0c;不僅導致道路積水、能見度驟降&#xff0c;還加劇了大型車輛&#xff08;如渣土…

安全生產管理是什么?安全生產管理系統都有哪些核心功能?

隨著法律法規的日益嚴格和公眾對安全意識的提升&#xff0c;企業面臨的安全生產壓力也越來越大。無論是大型企業還是中小型企業&#xff0c;安全生產管理不僅關系到企業的生存與發展&#xff0c;更直接關系到員工的生命安全和企業的社會形象。因此&#xff0c;理解并實施有效的…

【PyCharm必會基礎】正確移除解釋器及虛擬環境(以 Poetry 為例 )

#工作記錄 【PyCharm使用基礎】 當遇到虛擬環境難以修復的場景&#xff0c;我們需要刪除當前解釋器和虛擬環境然后再重新創建虛擬環境&#xff0c;以下是在PyCharm中正確移除的步驟。 一、進入解釋器設置 在 PyCharm 界面右下角&#xff0c;點擊Poetry (suna0)&#xff0c;選…

day028-Shell自動化編程-判斷進階

文章目錄 1. 特殊變量補充2. 變量擴展-變量子串2.1 獲取變量字符的長度2.2 給變量設置默認值 3. 命令3.1 dirname3.2 basename3.3 cut 4. 條件測試命令&#xff1a;[]4.1 邏輯運算符4.2 文件測試4.3 案例&#xff1a;書寫腳本-檢查文件類型4.4 邏輯運算4.5 案例&#xff1a;書寫…

oracle sql 語句 優化方法

1、表盡量使用別名&#xff0c;字段盡量使用別名.字段名&#xff0c;這樣子&#xff0c;可以減少oracle數據庫解析字段名。而且把 不需要的字段名剔除掉&#xff0c;只保留有用的字段名&#xff0c;不要一直使用 select *。 2、關聯查詢時&#xff0c;選擇好主表 。oracle解析…

【Java】Ajax 技術詳解

文章目錄 1. Filter 過濾器1.1 Filter 概述1.2 Filter 快速入門開發步驟:1.3 Filter 執行流程1.4 Filter 攔截路徑配置1.5 過濾器鏈2. Listener 監聽器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技術3.1 Ajax 概述3.2 Ajax 快速入門服務端實現:客戶端實現:4. Axi…

07 APP 自動化- appium+pytest+allure框架封裝

文章目錄 一、PO二、代碼簡單實現項目框架預覽&#xff1a;base_page.pydir_config.pyget_data.pylogger.pystart_session.pyconfig.yamlkey_code.yamllaunch_page_loc.pylogin_page_loc.pylaunch_page.pylogin_page.pytest_login.pypytest.inirun.py APP 自動化代碼總和 一、P…

用戶體驗升級:表單失焦調用接口驗證,錯誤信息即時可視化

現代前端應用中&#xff0c;表單交互是用戶體驗的重要組成部分。而表單驗證作為其中的核心環節&#xff0c;不僅需要前端的即時反饋&#xff0c;還需要與后端接口聯動進行數據合法性校驗。本文將詳細介紹如何在Vue3中實現表單輸入與接口驗證的無縫聯動&#xff0c;并優雅地展示…

Vue 插槽(Slot)用法詳解

插槽(Slot)是Vue中一種強大的內容分發機制&#xff0c;它允許你在組件中定義可替換的內容區域&#xff0c;為組件提供了更高的靈活性和可復用性。本文將全面介紹Vue插槽的各種用法。 1. 基本插槽 基本插槽是最簡單的插槽形式&#xff0c;它允許父組件向子組件插入內容。 子組…

C++ 標準模板庫(STL)詳解文檔

C 標準模板庫&#xff08;STL&#xff09;詳解文檔 1 前言2 常用容器2.1 內容總覽2.2 向量 vector2.2.1 概述2.2.2 常用方法2.2.3 適用場景2.2.4 注意事項 2.3 棧 stack2.3.1 概述2.3.2 常用方法2.3.3 注意事項 2.4 隊列 queue2.4.1 概述2.4.2 常用方法2.4.3 注意事項 2.5 優先…

【入坑系列】TiDB 強制索引在不同庫下不生效問題

文章目錄 背景SQL 優化情況線上SQL運行情況分析懷疑1:執行計劃綁定問題?嘗試:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 寫法Hint 不生效問題排查解決參考背景 項目中使用 TiDB 數據庫,并對 SQL 進行優化了,添加了強制索引。 UAT 環境已經生效,但 PROD 環境強制索…

Redis(02)Win系統如何將Redis配置為開機自啟的服務

一、引言 Redis 是一款高性能的鍵值對存儲數據庫&#xff0c;在眾多項目中被廣泛應用。在 Windows 環境下&#xff0c;為了讓 Redis 能更穩定、便捷地運行&#xff0c;將其設置為系統服務并實現自動啟動是很有必要的。這樣一來&#xff0c;系統開機時 Redis 可自動加載&#xf…

apex新版貌似移除了amp從源碼安裝方式裝的話會在from apex import amp時報錯

問題&#xff1a; 安裝完apex結果 from apex import amp會報錯 解決方法&#xff1a; # apex git clone https://github.com/NVIDIA/apex cd apex # https://github.com/modelscope/ms-swift/issues/4176 git checkout e13873debc4699d39c6861074b9a3b2a02327f92 pip insta…

掌握 HTTP 請求:理解 cURL GET 語法

cURL 是一個強大的命令行工具&#xff0c;用于發送 HTTP 請求和與 Web 服務器交互。在 Web 開發和測試中&#xff0c;cURL 經常用于發送 GET 請求來獲取服務器資源。本文將詳細介紹 cURL GET 請求的語法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的縮寫…