日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

「SCOI2011」棘手的操作

發布時間:2025/3/8 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 「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

總結

以上是生活随笔為你收集整理的「SCOI2011」棘手的操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。