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

SWERC 2019-20 J. Counting Trees

Description

太抽象了

给定一个二叉堆(小根)节点权值的中序遍历,求可能的前序遍历个数。\(n \le 10^6\)

Solution

由中序遍历的性质,一定是在区间 \([l,r]\) 内选一个点 \(p\)\(p\) 为根,然后再分别递归处理 \([l,p-1]\)\([p+1,r]\)

由题意有 \(h_p=\min_{i=l}^{r}{h_i}\)。令 \(P\) 为满足条件 \(p\) 的集合,区间 \([l,r]\) 的答案 \(res_{l,r}=\sum_{p \in P}{res_{l,p-1}\times res_{p+1,r}}\)。边界条件 \(res_{l,l}=res{l,l-1}=1\)。如果序列中元素均相同就炸了,复杂度 \(O(n^2)\)

\([l,r]\) 间的所有最小值一定集中在二叉堆的“上方”,把这些结点抠出来排成二叉树,其他的区间作为子树接在下方。设区间内有 \(k\) 个最小值,则有 \(k+1\) 个多余的子树(其中有部分子树为空),而二叉树上有 \(2k-(k-1)=k+1\) 个子节点,一一对应。因此只需计算这些区间的答案之积,再把答案乘上大小为 \(k\) 二叉树的形态数。这是经典的卡特兰数 \(Cat_k\)

最小值遍历区间会炸,用 st 表处理区间最小值最靠左的位置,预处理出下一个同色位置直接跳即可。这样每个点只会被遍历 \(O(1)\) 次,复杂度瓶颈在 st 表预处理 \(O(n \log n)\)

Code

#include<bits/stdc++.h>
#define inf 1e9
#define ll long long
using namespace std;
const int N=1e6+20,mod=1e9+7;
int n,h[N],nxt[N],pos[N];
int st[21][N],lg[N];
int fac[N<<1],inv[N];   //注意一下空间上的细节int get(int x,int y){return (h[x]<h[y]||(h[x]==h[y]&&x<y))?x:y;}
int gtmin(int l,int r)
{int x=lg[r-l+1];return get(st[x][l],st[x][r-(1<<x)+1]);
}
int Cat(int x){return 1ll*fac[x<<1]*inv[x]%mod*inv[x+1]%mod;}
int solve(int l,int r)
{if(l>=r)return 1;int p=gtmin(l,r),tot=1;int res=solve(l,p-1);while(nxt[p]<=r)tot++,res=1ll*res*solve(p+1,nxt[p]-1)%mod,p=nxt[p];res=1ll*res*solve(p+1,r)%mod;return 1ll*res*Cat(tot)%mod;
}void init()
{inv[1]=1;for(int i=2;i<=1e6+10;i++){lg[i]=lg[i>>1]+1;inv[i]=(mod-1ll*inv[mod%i]*(mod/i)%mod);}fac[0]=1;for(int i=1;i<=2e6;i++)fac[i]=1ll*fac[i-1]*i%mod;inv[0]=1;for(int i=1;i<=1e6+10;i++)inv[i]=1ll*inv[i]*inv[i-1]%mod;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);init();cin>>n;for(int i=1;i<=n;i++)cin>>h[i];for(int i=n;i>=1;i--){st[0][i]=i;nxt[i]=n+1;if(pos[h[i]])nxt[i]=pos[h[i]];pos[h[i]]=i;}for(int i=1;i<=lg[n];i++)for(int j=1;j+(1<<i)-1<=n;j++)st[i][j]=get(st[i-1][j],st[i-1][j+(1<<(i-1))]);cout<<solve(1,n)<<"\n";return 0;
}
http://www.jsqmd.com/news/332913/

相关文章:

  • 《把脉行业与技术趋势》-115-“万物皆为有序、自动、受控、由开环/闭环子环构成、依赖能量维持并实现功能与信息转换的系统”:企业、通信系统、网络、软件系统、产品、生物体不同形态的系统的实例
  • 探讨郑州地区西点烘焙教学,哪家专业且价格合理值得选择? - 工业推荐榜
  • 将哲学溶解于实践:岐金兰构想的行动纲领
  • 共话靠谱的特殊教育学校排名,推荐优质之选 - myqiye
  • 2026年天津地区KTV装修定制承包商技术强售后好的十大品牌推荐 - 工业品牌热点
  • win server开启smb
  • 横评后发现,AI论文平台千笔 VS WPS AI 更贴合继续教育需求!
  • 2026年湖北靠谱的防火涂料品牌排名,附推荐防火涂料电话 - myqiye
  • 2026年六安靠谱的EJU课程实力学校,推荐给有需求的你 - 工业品网
  • 设计心得——API和ABI以及ABI的兼容性
  • 苏州GEO优化服务商品牌推荐,聚合AI多行业赋能成就营销佳绩 - mypinpai
  • 西安装修设计厂商2026口碑排行,设计服务新标杆,外墙仿石漆/全屋定制/自建房建设/垫层/pur封边,装修设计企业推荐 - 品牌推荐师
  • 详细介绍:linux 信号
  • C#: 如何从全局捕获所有线程的异常
  • 解析广东靠谱的移民公司年度排名,移民公司求推荐看这里 - 工业推荐榜
  • 显卡性能优化工具:DLSS版本管理效率提升指南
  • GitHub 热榜项目 - 日榜(2026-02-02)
  • 如何用学术效率工具解决中文注释格式化难题:提升文献管理效率的技术方案
  • WordPress如何实现WORD文档图片的无损保存至博客?
  • 艾尔登法环存档无忧迁移全流程:从数据解析到跨设备同步的技术指南
  • 网页前端用WordPress导入WORD文档时,如何保留粘贴的图片格式?
  • Android 基础入门教程4.1.2 Activity初窥门径
  • Word表格题注自动设置全攻略
  • ​ Android 基础入门教程​4.1.3 Activity登堂入室
  • 计算机毕业设计springboot摊位管理系统分析与设计 基于SpringBoot的集市摊位租赁与运营平台设计与实现 SpringBoot驱动的智慧夜市摊位综合管理系统研发
  • Kanass零基础学习,如何快速导入Jira、Mantis数据 - 实践
  • 山西现房市场中的学区选择:近期交付项目一览,学区房/70年大产权住宅/新楼盘/实景现房/南都新城,学区房厂商怎么选择 - 品牌推荐师
  • 2026年服务口碑佳的粉碎型格栅供应商有哪些?内进流网板式细格栅/污水处理粉碎型格栅,格栅供应商怎么选择 - 品牌推荐师
  • 2026年沈阳可靠的汽车贴膜店铺附近推荐,玻璃膜/沈北贴膜/隐形车衣/贴车衣/太阳膜/车衣改色,汽车贴膜门店哪家好 - 品牌推荐师
  • 北京装修机构推荐哪家,一诺原创空间设计一体化服务让人省心 - 工业品牌热点