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 }
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现