复制代码
 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 }
复制代码