BZOJ2333 [SCOI2011]棘手的操作 【離線 + 線段樹】

題目

有N個節點,標號從1到N,這N個節點一開始相互不連通。第i個節點的初始權值為a[i],接下來有如下一些操作:
U x y: 加一條邊,連接第x個節點和第y個節點
A1 x v: 將第x個節點的權值增加v
A2 x v: 將第x個節點所在的連通塊的所有節點的權值都增加v
A3 v: 將所有節點的權值都增加v
F1 x: 輸出第x個節點當前的權值
F2 x: 輸出第x個節點所在的連通塊中,權值最大的節點的權值
F3: 輸出所有節點中,權值最大的節點的權值

輸入格式

輸入的第一行是一個整數N,代表節點個數。
接下來一行輸入N個整數,a[1], a[2], …, a[N],代表N個節點的初始權值。
再下一行輸入一個整數Q,代表接下來的操作數。
最后輸入Q行,每行的格式如題目描述所示。

輸出格式

對于操作F1, F2, F3,輸出對應的結果,每個結果占一行。

輸入樣例

3

0 0 0

8

A1 3 -20

A1 2 20

U 1 3

A2 1 10

F1 3

F2 3

A3 -10

F3

輸出樣例

-10

10

10

提示

對于30%的數據,保證 N<=100,Q<=10000

對于80%的數據,保證 N<=100000,Q<=100000

對于100%的數據,保證 N<=300000,Q<=300000

對于所有的數據,保證輸入合法,并且 -1000<=v, a[1], a[2], …, a[N]<=1000

題解

據說此題很多人堆套堆,怎么這么難寫
我那么弱當然是用線段樹啦

我覺得線段樹的確好寫到不知哪里去
對于所有操作,似乎在線段樹上都很好實現,唯一的難點就在于點的編號

那么問題就轉化成了,給定一種編號方法,使任意時刻同一個聯通塊內的所有點編號連續
只需要分兩種情況想就很容易實現了:

我們想象,一開始所有點相互獨立,沒什么關系

①當兩個獨立的點相連時,它們的編號一定是連續的,否則此時就不滿足所需性質
那我們就先用鏈表將它們連起來,表示編號連續

②當兩個聯通塊相連時,由我們維護的性質得:兩個聯通塊內部的點編號一定是連續的,現在我們需要兩個聯通塊編號連續,我們只需要將它們的編號銜接起來就好了,那么我們把其中一個聯通塊所對應的鏈 接到另一個聯通塊對應的鏈末尾就好了

可以發現,這樣子操作之后,我們就會得出若干個鏈,表示鏈上的點編號必須按鏈上的順序
所以我們按鏈的順序標號,就能保證所有時刻聯通塊內部點的編號連續

取鏈頭鏈尾用并查集實現
我們在詢問的時候,也要用上并查集,并且鏈接順序與標號的時候相同,保證每個聯通塊目前的代表元一定是標號時編號最小的點,所以我們再維護并查集的大小就可以輕松求出每次操作的區間啦~

數據結構部分就只用實現一個簡單的線段樹
比堆套堆不知道要好寫到哪里去

丑丑的代碼

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
#define ls (u << 1)
#define rs (u << 1 | 1)
using namespace std;
const int maxn = 300005,maxm = 100005,INF = 1000000000;
inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57) {out = (out << 3) + (out << 1) + c - '0'; c = getchar();}return out * flag;
}
struct Query{int opt,a,b,c;}q[maxn];
int n,m,pre[maxn],post[maxn],id[maxn],Hash[maxn],val[maxn],cnt;
int nxt[maxn],siz[maxn];
int mx[4 * maxn],tag[4 * maxn];
char opt[10];
int findu(int u){return u == pre[u] ? u : pre[u] = findu(pre[u]);}
int findd(int u){return u == post[u] ? u : post[u] = findd(post[u]);}
void build(int u,int l,int r){if (l == r) {mx[u] = val[Hash[l]]; return;}int mid = l + r >> 1;build(ls,l,mid);build(rs,mid + 1,r);mx[u] = max(mx[ls],mx[rs]);
}
void pd(int u){if (tag[u]){mx[ls] += tag[u]; tag[ls] += tag[u];mx[rs] += tag[u]; tag[rs] += tag[u];tag[u] = 0;}
}
void modify(int u,int l,int r,int L,int R,int v){if (l >= L && r <= R){mx[u] += v; tag[u] += v; return;}pd(u);int mid = l + r >> 1;if (mid >= L) modify(ls,l,mid,L,R,v);if (mid < R) modify(rs,mid + 1,r,L,R,v);mx[u] = max(mx[ls],mx[rs]);
}
int query(int u,int l,int r,int L,int R){if (l >= L && r <= R) return mx[u];pd(u);int mid = l + r >> 1;if (mid >= R) return query(ls,l,mid,L,R);else if (mid < L) return query(rs,mid + 1,r,L,R);else return max(query(ls,l,mid,L,R),query(rs,mid + 1,r,L,R));
}
int main(){n = read();for (int i = 1; i <= n; i++) val[i] = read(),pre[i] = post[i] = i;m = read();int fa,fb,sa,sb;for (int i = 1; i <= m; i++){scanf("%s",opt);if (opt[0] == 'U'){q[i].opt = 0,q[i].a = read(),q[i].b = read();fa = findu(q[i].a); fb = findu(q[i].b);if (fa == fb) continue;sa = findd(q[i].a); sb = findd(q[i].b);nxt[sa] = fb;pre[fb] = fa;post[sa] = sb;}else if (opt[0] == 'A'){q[i].a = read();if (opt[1] == '1') q[i].opt = 1,q[i].b = read();else if (opt[1] == '2') q[i].opt = 2,q[i].b = read();else q[i].opt = 3;}else {if (opt[1] == '1') q[i].opt = 4,q[i].a = read();else if (opt[1] == '2') q[i].opt = 5,q[i].a = read();else q[i].opt = 6;}}for (int i = 1; i <= n; i++){if (id[i]) continue;int u = findu(i);while (u) id[u] = ++cnt,Hash[cnt] = u,u = nxt[u];}build(1,1,n);for (int i = 1; i <= n; i++) pre[i] = i,siz[i] = 1;for (int i = 1; i <= m; i++){switch(q[i].opt){case 0:fa = findu(q[i].a); fb = findu(q[i].b);if (fa != fb){siz[fa] += siz[fb];pre[fb] = fa;}break;case 1:modify(1,1,n,id[q[i].a],id[q[i].a],q[i].b);break;case 2:fa = findu(q[i].a);modify(1,1,n,id[fa],id[fa] + siz[fa] - 1,q[i].b);break;case 3:modify(1,1,n,1,n,q[i].a);break;case 4:printf("%d\n",query(1,1,n,id[q[i].a],id[q[i].a]));break;case 5:fa = findu(q[i].a);printf("%d\n",query(1,1,n,id[fa],id[fa] + siz[fa] - 1));break;case 6:printf("%d\n",mx[1]);break;}}return 0;
}

轉載于:https://www.cnblogs.com/Mychael/p/8490297.html

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

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

相關文章

opencv圖像仿射變換和普通旋轉

背景&#xff1a;今天需要對程序生成的圖像進行旋轉90度和下采樣操作&#xff0c;當然還有改變圖像類型的操作&#xff0c;就是把原來.png的圖像轉換為.jpg的圖像&#xff0c;主要是我目前使用libharu庫&#xff0c;無法成功從本地加載png圖像到pdf中去&#xff0c;不得不使用j…

討厭麻煩的ora 01722無效數字

webservice開發過程中&#xff0c;數據庫由原來的oracle改為現在的sql server。然后重新調試&#xff0c;結果報出ora 01722無效數字的錯誤。 由于連接oracle數據庫的時候并沒有問題&#xff0c;所以一開始我以為是數據庫不同&#xff0c;導致部分數據類型差異&#xff0c;&…

CSS樣式:覆蓋規則

規則一&#xff1a;由于繼承而發生樣式沖突時&#xff0c;最近祖先獲勝。 CSS的繼承機制使得元素可以從包含它的祖先元素中繼承樣式&#xff0c;考慮下面這種情況: <html><head><title>rule 1</title><style>body {color:black;}p {color:blue;}…

try{}里有一個 return 語句,那么緊跟在這個 try 后的 finally {}里的 code 會 不會被執行,什么時候被執行,在 return 前還是后?...

這是一道面試題&#xff0c;首先finally{}里面的code肯定是會執行的&#xff0c;至于在return前還是后&#xff0c; 看答案說的是在return后執行&#xff0c;我覺得不對&#xff0c;百度了一下&#xff0c;有說return前的&#xff0c;有說return后的&#xff0c;還有return中間…

相機和鏡頭選型需要注意哪些問題

背景&#xff1a; 最近需要優于項目需求需要對工業相機和鏡頭進行選型&#xff0c;于是我就開啟的學習相機之旅&#xff0c;雖然我一直在做機器視覺方向&#xff0c;但是我對相機的了解還是很少&#xff0c;我想正好趁這次機會好好學習一下。如果有錯誤的觀點請指正。 一、相…

響應式網頁布局 - W3Schools How-Tos 01

W3Schools教學系列 W3Schools是知名的網頁設計&#xff0f;前端開發教學網站&#xff0c;不僅提供HTML、CSS、JavaScript等的詳盡教學&#xff0c;還可以把它當作說明文件&#xff08;Documents&#xff09;。有經驗的前端或多或少已經接觸過這個網站&#xff0c;因為它經常出現…

正則表達式,終極使用!3個工具,搞定一切

文章前提&#xff0c;本人。不會正則的不論什么語法&#xff0c;僅僅懂一點正則的概念。本人從未自己寫過正則&#xff0c;都是網上收羅進行改動的。相同。沒有時間去研究正則。 可是為了方便&#xff0c;入手了幾個工具。 如今就為大家一一展示。 第一個&#xff0c;regexBuil…

iOS 在tableview的側滑事件里執行tableView.selectRow無效的解決辦法

很奇怪的問題&#xff0c;在執行默認選中一個cell的時候&#xff0c;突然發現這句話不起作用了 &#xff08;我的場景是&#xff1a;當前cell側滑刪除后&#xff0c;默認選中上一個cell&#xff09; 搞了半天&#xff0c;終于發現罪魁禍首竟然是因為&#xff1a;這句話寫在了側…

VS2017 C++工程 執行python腳本

我解決了哪怕很小的一個問題&#xff0c;我也想記錄下來來見證我的經歷。 背景&#xff1a; 一、使用libhuru庫生成pdf報告 最近參與一些測試工作&#xff0c;希望測試結束后能夠根據測試得到的數據和圖像自動生成測試報告&#xff0c;最開始調研到了生成報告的庫有libharu和…

標準正弦波變頻電源調制方式的實現

目前變頻電源正不斷向規模化、專業化、智能化、精細化方向發展。變頻電源的技術隨著工業電器電子制造的興起而不斷得到重視和發展。其中,中港揚以正弦脈SPWM為核心變頻電源系統電路便是一個很好的代表。純硬件電路在焊接電路上比較復雜&#xff0c;但是調節出來的SPWM波形比較完…

Jmeter教程索引貼

Jmeter教程索引貼 新的一年即將到來&#xff0c;不知不覺2015年自己在Jmeter方面總結的文章有十幾篇&#xff0c;在此匯總一下&#xff0c;順便也算是個總結吧。2016年&#xff0c;繼續學習技術&#xff0c;總結&#xff0c;寫文章。 一、基礎部分&#xff1a; 使用Jmeter進行h…

類與接口(二)java的四種內部類詳解

引言 內部類&#xff0c;嵌套在另一個類的里面&#xff0c;所以也稱為 嵌套類; 內部類分為以下四種&#xff1a; 靜態內部類成員內部類局部內部類匿名內部類一、靜態內部類 靜態內部類&#xff1a; 一般也稱”靜態嵌套類“&#xff0c;在類中用static聲明的內部類。 因為是stat…

單例設計模式和多線程

單例設計模式 單例&#xff1a;整個項目中&#xff0c;有某個類或者某些特殊的類&#xff0c;屬于該類的對象只能建立一個。 #include<iostream> using namespace std;class MyCAS { private:MyCAS(){}private:static MyCAS *m_instance;public:static MyCAS *GetInstanc…

運行imgui例程

背景&#xff1a;目前在做一個視覺測試系統&#xff0c;需要做一個界面&#xff0c;將相機獲取的圖像&#xff0c;以及測試過程中的數據呈現在界面上&#xff0c;在我印象里&#xff0c;做界面就用qt吧&#xff0c;直到這個月真要開始做界面了&#xff0c;我的領導給我建議用im…

性能測試總結(三)--工具選型篇

性能測試總結(三)--工具選型篇 本篇文章主要簡單總結下性能測試工具的原理以及如何選型。性能測試和功能測試不同&#xff0c;性能測試的執行是基本功能的重復和并發&#xff0c;需要模擬多用戶&#xff0c;在性能測試執行時需要監控指標參數&#xff0c;同時性能測試的結果不是…

創建一個最簡單的imgui測試用例

在上一篇文章中&#xff0c;我們初步認識了一下imgui,并且成功運行了他提供的demo。這只是開始學習imgui的第一步&#xff0c;在實際使用時&#xff0c;我們需要將imgui應用到自己的工程中去&#xff0c;所以你需要具備將imgui加到你工程中去的能力&#xff0c;簡單起見&#x…

idea中maven的setting.xml的配置

2019獨角獸企業重金招聘Python工程師標準>>> <?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

ref和out區別總結

ref&#xff1a;是必需要先初始化才能用,但調用時可以對它什么也不做.out&#xff1a;可以不初始化也能用,但調用時一定要對其賦值(即使已經初始化的也要賦值,哪怕是賦一個和原來一樣的值).轉載于:https://www.cnblogs.com/gjnsmallworld/p/7216206.html

繼 承(面向對象特征之一)

1&#xff1a;成員變量。 當子父類中出現一樣的屬性時&#xff0c;子類類型的對象&#xff0c;調用該屬性&#xff0c;值是子類的屬性值。 如果想要調用父類中的屬性值&#xff0c;需要使用一個關鍵字&#xff1a;super This&#xff1a;代表是本類類型的對象引用。 Super&…

如何將cv::Mat類型轉換為imgui中的ImTextureID類型

背景&#xff1a; 我原來的工程是使用opencv的&#xff0c;所以程序中的圖像都是表示為cv::Mat類型&#xff0c;為了能夠在imgui窗口中顯示我的cv::Mat的圖像&#xff0c;我找到了下面這個函數&#xff1a; void ImGui::Image(ImTextureID user_texture_id, const ImVec2&…