「SCOI2011」棘手的操作

傳送門

Description

\(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 輸出所有節點中,權值最大的節點的權值。

Solution

離線處理

對原序列進行重新排序,使得每次合并時,兩個集合的存在區間恰好相鄰

轉化為簡單的線段樹區間修改+區間詢問


Code?

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)>(b)?(b):(a))
#define pi std::pair<int,int>
#define reg register
using namespace std;
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
const int MN=6e5+5;
int A[MN],Map[MN],fMap[MN];
struct Mapper
{int fa[MN],L[MN],R[MN],suf[MN];void init(int N){reg int i;for(i=1;i<=N;++i) fa[i]=L[i]=R[i]=i,suf[i]=-1;}int getf(int x){return fa[x]==x?x:fa[x]=getf(fa[x]);}void insert(int x,int y){x=getf(x);y=getf(y);if(x==y) return;suf[R[x]]=L[y];L[y]=L[x];fa[x]=y;}bool vis[MN];void getMap(int N){memset(vis,0,sizeof vis);reg int i,l,r,cnt=0;for(i=1;i<=N;++i)if(!vis[i])for(l=L[getf(i)];l>0;l=suf[l]) vis[fMap[++cnt]=l]=true;for(i=1;i<=N;++i) Map[fMap[i]]=i;}
}a;
struct Operation{int opt,x,y;}O[MN];
int readchar()
{static char s[5];scanf("%s",s+1);if(s[1]=='U') return 1;if(s[1]=='A') return 1+s[2]-'0';if(s[1]=='F') return 4+s[2]-'0'; 
}
struct Union_Find
{int fa[MN],L[MN],R[MN];void init(int N){reg int i;for(i=1;i<=N;++i) fa[i]=i,L[i]=R[i]=Map[i];}int getf(int x){return fa[x]==x?x:fa[x]=getf(fa[x]);}void combine(int x,int y){x=getf(x);y=getf(y);if(x==y) return;fa[x]=y;L[y]=min(L[y],L[x]);R[y]=max(R[x],R[y]);}pi get(int x){x=getf(x);return make_pair(L[x],R[x]);}
}b;
struct SegTree
{#define ls x<<1#define rs x<<1|1#define mid ((l+r)>>1)int t[MN<<2],lazy[MN<<1];void up(int x){t[x]=max(t[ls],t[rs]);}void Build(int x,int l,int r){if(l==r) return (void)(t[x]=A[fMap[l]]);Build(ls,l,mid);Build(rs,mid+1,r);up(x);}void C(int x,int val){t[x]+=val,lazy[x]+=val;}void down(int x){if(lazy[x])C(ls,lazy[x]),C(rs,lazy[x]),lazy[x]=0;}void Modify(int x,int l,int r,int a,int b,int val){if(l==a&&r==b) return (void)(C(x,val));down(x);if(b<=mid) Modify(ls,l,mid,a,b,val);else if(a>mid) Modify(rs,mid+1,r,a,b,val);else Modify(ls,l,mid,a,mid,val),Modify(rs,mid+1,r,mid+1,b,val);up(x);}int Query(int x,int l,int r,int a,int b){if(l==a&&r==b) return t[x];down(x);if(b<=mid) return Query(ls,l,mid,a,b);else if(a>mid) return Query(rs,mid+1,r,a,b);else return max(Query(ls,l,mid,a,mid),Query(rs,mid+1,r,mid+1,b));}
}c;
int main()
{reg int i,N=read(); a.init(N);for(i=1;i<=N;++i) A[i]=read();reg int M=read();for(i=1;i<=M;++i){O[i].opt=readchar();if(O[i].opt<7) O[i].x=read();if(O[i].opt<4) O[i].y=read();if(O[i].opt==1) a.insert(O[i].x,O[i].y);}a.getMap(N);c.Build(1,1,N);b.init(N);pi xxx;for(i=1;i<=M;++i){if(O[i].opt==1) b.combine(O[i].x,O[i].y);if(O[i].opt==2) c.Modify(1,1,N,Map[O[i].x],Map[O[i].x],O[i].y);if(O[i].opt==3) xxx=b.get(O[i].x),c.Modify(1,1,N,xxx.first,xxx.second,O[i].y);if(O[i].opt==4) c.Modify(1,1,N,1,N,O[i].x);if(O[i].opt==5) printf("%d\n",c.Query(1,1,N,Map[O[i].x],Map[O[i].x]));if(O[i].opt==6) xxx=b.get(O[i].x),printf("%d\n",c.Query(1,1,N,xxx.first,xxx.second));if(O[i].opt==7) printf("%d\n",c.Query(1,1,N,1,N));}return 0;
}



Blog來自PaperCloud,未經允許,請勿轉載,TKS!

轉載于:https://www.cnblogs.com/PaperCloud/p/10657606.html

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

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

相關文章

swft c 語言 數組,如何在swift中實現數組的深拷貝

在Objective-C中如果想將一個數組賦值給另外一個數組&#xff0c;同時想讓兩個數組之間相互獨立(即改變其中的一個數組&#xff0c;不影響另外的一個)&#xff0c;有很多的辦法&#xff0c;比如我們可以直接copy,用類方法創建新數組。這樣得到的數組和原來的數組就是兩個完全獨…

tomcat CATALINA_HOME與CATALINA_BASE的區別

區別 https://blog.csdn.net/cfydaniel/article/details/41351927 Tomcat啟動分析(我們為什么要配置CATALINA_HOME環境變量&#xff09; http://www.cnblogs.com/heshan664754022/archive/2013/03/27/2984357.html轉載于:https://www.cnblogs.com/Andrew520/p/10664921.html

android 廣告欄效果,實現android廣告欄效果

public classBannerLayout extendsRelativeLayout {privateViewPager mViewPager; // 輪播容器// 指示器(圓點)容器privateLinearLayout indicatorContainer;privateDrawable unSelectedDrawable;privateDrawable selectedDrawable;private intWHAT_AUTO_PLAY 1000;private boo…

自我練習

<!doctype html><html><head><meta charset"utf-8"><title>無標題文檔</title><link rel"icon" href"../HTMLWork/day03/psb.ico.ico" type"img/*"></head><body> <a na…

android studio按鈕槽函數,AndroidStudio按鈕Button退出程序

AndroidStudio 3.1.41.創建一個新的項目&#xff0c;項目名稱為Button&#xff0c;界面為activity_button.xml2.打開activity_button.xml3.點擊HelloWorld標簽&#xff0c;按Delete刪除4.左側組件欄選擇Common - Button5.將Button組件拖到界面上&#xff0c;大概中間的位置6.右…

cobbler介紹與部署

cobbler介紹 Cobbler是一個Linux系統安裝的服務&#xff0c;可以通過網絡啟動(PXE)的方式來快速安裝、重裝物理服務器和虛擬機&#xff0c;同時還可以管理DHCP&#xff0c;DNS等。 Cobbler可以使用命令行方式管理&#xff0c;也提供了基于Web的界面管理工具(cobbler-web)&#…

android wifi視頻監控軟件,WiFi環境下Android智能視頻監控系統研究與實現

摘要&#xff1a;在互聯網飛速發展和移動互聯網強勢崛起的時代,科技產品服務于普通生活是新興行業必然的發展趨勢;監控系統是物聯網時代各個領域必然爭取的可控制系統。隨著無線技術和移動終端設備的高歌猛進,移動終端智能無線視頻監控系統成為時下監控領域發展的熱點方向。無線…

android 本地地址轉換為url,android本地mipmap圖片轉url、絕對路徑轉URL URL URI File Path 轉換...

標簽&#xff1a; url uri file pathFile to URI:File file ...;URI uri file.toURI();File to URL:File file ...;URL url file.toURI().URL();URL to File:URL url ...;File file new Path(url.getPath()).toFile();URI to URL:URI uri ...;URL url uri.toURL();URL …

ORACLE數據庫導出導入數據

準備工作&#xff1a; 1、登錄管理員system 2、create directory dbdata as C:\oracle\tempData;--創建備份文件夾 3、grant read,write on directory dbdata to gsjk2018;--授權讀寫為用戶 --導出(每次修改文件名)expdp gsjk2018/gsjk2018_vimtech10.0.73.32:1521/orcl direct…

linux sed名寧,Linux shell利用sed批量更改文件名的方法

微子網絡與大家分享了在Linux shell中使用sed批量更改文件名的方法。希望你看完這篇文章有所收獲。大家一起討論一下。示例去除特定字符目標&#xff1a;把2017-01-01.jpg和2018-01-01.jpg變成20170101.jpg和20180101.jpg方法&#xff1a;用空值替換全部for filein ls | grep …

android手機給iphone越獄,一臺ROOT后的安卓手機:可以用來給iOS 13越獄了

iOS 13時代的越獄工具主要包括unc0ver和Checkra1n兩款&#xff0c;前者最新的v4.2.1版本已經支持A9到A13設備從除了支持的設備和系統多&#xff0c;unc0ver的一大優勢在于可在iOS設備上獨立完成越獄操作&#xff0c;Checkra1n則需要借助電腦&#xff0c;包括重啟失效后也是如此…

502 Bad Gateway The server returned an invalid or incomplete response

問題描述&#xff1a;最近在登陸某大學網站時&#xff0c;網站如下&#xff1a; https://yzb.tju.edu.cn/ 發現登錄不進去&#xff0c;報了502 Bad Gateway The server returned an invalid or incomplete response這個錯誤。 問題解決&#xff1a;將https改為http&#xff0…

iOS VIPER架構(三)

路由是實現模塊間解耦的一個有效工具。如果要進行組件化開發&#xff0c;路由是必不可少的一部分。目前iOS上絕大部分的路由工具都是基于URL匹配的&#xff0c;優缺點都很明顯。這篇文章里將會給出一個更加原生和安全的設計&#xff0c;這個設計的特點是&#xff1a; 路由時用p…

android camera滑動,Android怎么實現小米相機底部滑動指示器

Android怎么實現小米相機底部滑動指示器發布時間&#xff1a;2021-04-15 14:39:38來源&#xff1a;億速云閱讀&#xff1a;94作者&#xff1a;小新這篇文章給大家分享的是有關Android怎么實現小米相機底部滑動指示器的內容。小編覺得挺實用的&#xff0c;因此分享給大家做個參考…

laravel安裝laravel-ide-helper擴展進行代碼提示(二)

一、擴展的地址 https://github.com/barryvdh/laravel-ide-helper二、安裝擴展 1、引入庫&#xff1a; composer require barryvdh/laravel-ide-helper composer require doctrine/dbal如果只想在開發環境上使用&#xff0c;請加上--dev composer require --dev barryvdh/larav…

android md 顏色,安卓MD(Material Design)規范

Md規范是一種設計風格&#xff0c;并不特指規范。是一種模擬紙張的手法。一、核心思想把物理世界的體驗帶進屏幕。去掉現實中的雜質和隨機性&#xff0c;保留其最原始純凈的形態、空間關系、變化與過度&#xff0c;配合虛擬世界的靈活特性&#xff0c;還原最貼近真實的體驗&…

Mariadb修改root密碼

2019獨角獸企業重金招聘Python工程師標準>>> 默認情況下&#xff0c;新安裝的 mariadb 的密碼為空&#xff0c;在shell終端直接輸入 mysql 就能登陸數據庫。 如果是剛安裝第一次使用&#xff0c;請使用 mysql_secure_installation 命令初始化。 # mysql_secure_inst…

【譯】Googler如何解決編程問題

本文是Google工程師Steve Merritt的一篇博客&#xff0c;向大家介紹他自己和身邊的同事解決編程問題的方法。 原文地址&#xff1a;blog.usejournal.com/how-a-googl… 在本文中&#xff0c;我將完整的向你介紹一種解決編程問題的策略&#xff0c;這個策略是我在日常工作中一直…

自學html和css,學習HTML和CSS的5大理由

描述人們學習HTML和CSS最常見的原因是開始從事web開發。但并不是只有web開發人員才要學習HTML和CSS的核心技術。作為一個網絡用戶&#xff0c;你需要你掌握的相關技術很多&#xff0c;但下面有5個你無法拒絕學習HTML和CSS的理由。1、輕松制作卡通動畫Web上的動畫很多年來都是使…

html 左側 樹形菜單,vue左側菜單,樹形圖遞歸實現代碼

學習vue有一段時間了&#xff0c;最近使用vue做了一套后臺管理系統&#xff0c;左側菜單需求是這樣的&#xff0c;可以多層&#xff0c;數據由后臺傳遞。也因為自己對官方文檔的不熟悉使得自己踩了不少坑&#xff0c;今天寫出來和大家一起分享。效果圖如下所示&#xff1a;先說…