当前位置: 首页 > news >正文

P2475 [SCOI2008] 斜堆

洛谷

提供一种在模拟赛上自己观察出来的方法。

由于树是递归定义的,并且每次加入一个值在这个子树中,左右儿子会调换,再将这个点加入左子树。因此我们每次加入一个节点,必须保证这个点未加入的左右子树的节点数量相等或者左子树未加入节点比右子树多一个。

这样的状态我们才可以做到选择完左右的节点。

以下我们称未加入的左右子树的节点数量相等或者左子树未加入节点比右子树多一个的状态称为:平衡

因此最先想到一个思路,递归。我们先将子树平衡,如果平衡了,就选择根节点。

但是这样还是存在问题,即使平衡了,如果前面我为了达到平衡状态,选择的都是右节点,如果直接加上根,此时再先加入左节点再加入右节点,会导致左右位置与预期的相反,产生问题。

那么这种情况怎么解决?我们只需要再选择一个右子树的节点,然后再选择根,先加入左节点,再加入右节点,知道加入完,这样最后一个加入的必定是左节点。

对于为了平衡选择了左节点的情况也是同理,如果先加入根,再加入左节点,会导致左节点没有连接到左子树,因此需要先加入一个左节点,再加入根,最后先右再左加入节点即可。

虽然题目要求字典序最小,但是分析下来这就是唯一解。

最后时间复杂度在树的形态为链时最大,时间复杂度 \(O(n^2)\),可以通过此题。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,ls[55],rs[55],siz[55],f[55],st[55],top;
bool vis[55],d[55];
void dfs(int p){if(!p)return;siz[p]=1;dfs(ls[p]),dfs(rs[p]);siz[p]+=siz[ls[p]]+siz[rs[p]];
}
void solve(int p){if(siz[ls[p]]!=siz[rs[p]]&&siz[ls[p]]!=siz[rs[p]]+1){if(siz[ls[p]]>siz[rs[p]])f[p]=1,solve(ls[p]),siz[p]--;else f[p]=2,solve(rs[p]),siz[p]--;}else if(vis[p]){if(d[p]==1)solve(rs[p]),siz[p]--,d[p]^=1;else solve(ls[p]),siz[p]--,d[p]^=1;return;}else if(f[p]==0){vis[p]=1;siz[p]--;st[++top]=p;if(siz[ls[p]]==siz[rs[p]])d[p]=1;else d[p]=0;}else if(f[p]==1){solve(ls[p]),siz[p]--;d[p]=1;f[p]=0;}else {solve(rs[p]),siz[p]--;d[p]=0;f[p]=0;}
}
signed main(){cin>>n;for(int i=1,x;i<=n;i++){cin>>x;x++;if(x>=100)rs[x-100]=i+1;else ls[x]=i+1;}dfs(1);for(int i=1;i<=n+1;i++)solve(1);for(int i=1;i<=top;i++)cout<<st[i]-1<<' ';return 0;
}
/*
1. 调平左右
让左右相等或者左多一 
2. 开始删除
若左右均未选择,则选根
若左边已经选择,先选左,再根,再右左
若右边已经选择,先选右,再根,再左右 
*/ 
http://www.gsyq.cn/news/75783.html

相关文章:

  • P4037 [JSOI2008] 魔兽地图
  • 李宏毅机器学习笔记41 - 实践
  • P3596 [POI 2015 R3] 高速公路现代化 Highway modernization
  • AI Browser:我用 CC 做了个桌面版 Manus
  • P4953 [USACO02FEB] Cow Cycling
  • 用 GitHub issue 寫博客很好,但我要放棄了
  • 周边的车间厂房工厂通风降温工业冷风机源头厂家,有热源的车间通风降温/铁皮厂房车间降温/铁皮房车间厂房降温工业冷风机供应商有哪些
  • 用 Astro 重做網站這件事
  • 美化 BroadcastChannel
  • 克服EMD端点效应的齿轮箱故障特征识别方法
  • Hugging Face 论文页面功能指南
  • 北京上门回收老酒名酒茅台五粮液
  • P5202 [USACO19JAN] Redistricting P
  • 详细介绍:数据结构5:二叉树
  • P10602 [CEOI 2009] Harbingers
  • 2025 Newest Autel BMW G-Chassis IMMO Add Key (1-Year License) for IM508/IM608/IM1/IM2
  • Go 1.25 发布:性能、器具与生态的全面进化
  • 实用指南:OSG多视口与多通道渲染核心技术解析
  • P8313 [COCI 2021/2022 #4] Izbori
  • 2025 最新智能制造服务商 / 厂家 TOP5 评测!科技赋能 + 全周期服务权威推荐榜单发布,引领智慧工厂建设新生态
  • CF762E Radio stations
  • 【拓补排序 TB_sort】P4017 最大食物链计数
  • 2025年深圳AI搜索排名优化公司推荐
  • Easysearch 2.0.0 性能测试
  • 基于STM32标准库的FreeRTOS移植与任务创建 - 详解
  • 2025 最新工业机器人应用服务商 / 厂家 TOP5 评测!科技赋能 + 全生命周期服务权威榜单发布,重构智能制造生态
  • Launch X431 PRO3 V+ Elite: Bi-Directional, ECU Coding Topology Mapping for Euro/Amer Vehicles
  • linux单用户模式
  • 吉他自学笔记
  • 为全球宝宝选对营养:央视关注+进博亮相,德国安心之选inne