1. 程式人生 > 其它 >1916. HYX的膜法學習筆記 -- 並查集

1916. HYX的膜法學習筆記 -- 並查集

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define p a[i].val
 4 struct node{
 5     int val;
 6     int cnt = 0;
 7 }fa[100005];
 8 
 9 int vis[100005];
10 node get(node x){//並查集
11     if(x.val == fa[x.val].val) return x;
12     return fa[x.val] = get(fa[x.val]);
13 }
14 node combine(node a,node b){
15 node aa = get(a); 16 return fa[aa.val] = get(b); 17 } 18 vector<int> v; 19 int main(){ 20 int n; 21 cin>>n; 22 vector<node> a(n+1); 23 for(int i=1;i<=n;i++){ 24 cin >> p; 25 fa[p].val = p; 26 } 27 for(int i=n;i>0;i--){//不妨倒著來,將符文一個一個插入,再倒著輸出答案
28 if(vis[p-1]==0 && vis[p+1]==0){ 29 fa[p].cnt += 1;//如果旁邊都沒放,自己就是加一 30 } 31 else if(vis[p - 1]!=0 && vis[p+1]==0){ 32 fa[p].cnt = get(fa[p-1]).cnt + 1;// 現在的計數 = 左邊的爸爸計數 + 1 33 combine(fa[p-1],fa[p]); 34 } 35 else if
(vis[p + 1]!=0 && vis[p-1]==0){ 36 fa[p].cnt = get(fa[p+1]).cnt + 1;// 現在的計數 = 右邊的爸爸計數 + 1 37 combine(fa[p+1],fa[p]); 38 }else{ 39 // 現在的計數 = 兩邊的爸爸計數 + 1 40 fa[p].cnt = get(fa[p-1]).cnt + get(fa[p+1]).cnt + 1; 41 combine(fa[p-1],fa[p]); 42 combine(fa[p+1],fa[p]); 43 } 44 v.push_back(fa[p].cnt);//答案放入 45 vis[p]++;//標記 46 } 47 while(!v.empty()){ 48 cout << v.back() << ' '; 49 v.pop_back(); 50 } 51 return 0; 52 }