1916. HYX的膜法學習筆記 -- 並查集
阿新 • • 發佈:2022-03-18
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 }