浅谈线段树合并:https://www.cnblogs.com/AKMer/p/10251001.html

题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=4756

对于每个结点用一棵值域线段树维护子树内结点的信息,然后该查询查询该合并合并就好了。

时间复杂度:\(O(nlogn)\)

空间复杂度:\(O(nlogn)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std; const int maxn=1e5+5; int n,tot,cnt;
int now[maxn],pre[maxn],son[maxn];
int p[maxn],tmp[maxn],rt[maxn],ans[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} void add(int a,int b) {
pre[++tot]=now[a];
now[a]=tot,son[tot]=b;
} struct segment_tree {
int tot;
int sum[maxn*20],ls[maxn*20],rs[maxn*20]; void update(int p) {
sum[p]=sum[ls[p]]+sum[rs[p]];
} void change(int &p,int l,int r,int pos) {
if(!p)p=++tot;
if(l==r) {sum[p]++;return;}
int mid=(l+r)>>1;
if(pos<=mid)change(ls[p],l,mid,pos);
else change(rs[p],mid+1,r,pos);
update(p);
} int query(int p,int l,int r,int pos) {
if(l==r)return 0;
int mid=(l+r)>>1,res=0;
if(pos<=mid)res=sum[rs[p]]+query(ls[p],l,mid,pos);
else res=query(rs[p],mid+1,r,pos);
return res;
} int merge(int a,int b) {
if(!a||!b)return a+b;
if(!ls[a]&&!rs[a]&&!ls[b]&&!rs[b]) {
sum[a]+=sum[b];return a;
}
ls[a]=merge(ls[a],ls[b]);
rs[a]=merge(rs[a],rs[b]);
update(a);return a;
}
}T; void dfs(int fa,int u) {
int tmp=0;
for(int P=now[u],v=son[P];P;P=pre[P],v=son[P])
dfs(u,v),tmp=T.merge(tmp,rt[v]);
ans[u]=T.query(tmp,1,cnt,p[u]);
rt[u]=T.merge(rt[u],tmp);
} int main() {
n=read();
for(int i=1;i<=n;i++)
tmp[i]=p[i]=read();
sort(tmp+1,tmp+n+1);
cnt=unique(tmp+1,tmp+n+1)-tmp-1;
for(int i=1;i<=n;i++) {
p[i]=lower_bound(tmp+1,tmp+cnt+1,p[i])-tmp;
T.change(rt[i],1,cnt,p[i]);
}
for(int i=2;i<=n;i++) {
int f=read();add(f,i);
}
dfs(0,1);
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
return 0;
}

最新文章

  1. python 替换 文件夹下的 文件名称 及 文件内容
  2. 【微博SDK调用逻辑】微博SDK的调用逻辑,最好自己还是写一个例子,试一下!!!
  3. 浅谈B树
  4. [LintCode] Implement Trie 实现字典树
  5. Emmet快速开发
  6. Balanced Numbers(数位+状压)
  7. 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)
  8. MySQL 5.6 my.cnf 参数详细说明
  9. 驱动力—— 通信引擎(上)—— ESFramework 4.0 进阶(03)
  10. cocos2dx - android环境配置及编译
  11. day11 函数的参数列表
  12. 【java】-- 多线程快速入门
  13. gp工具的许可
  14. 关于Navicat连接虚拟机宝塔数据库
  15. Ubuntu 进入、退出命令行的快捷键
  16. Solr 自定义排序[1]
  17. Invoking &quot;cmake&quot; failed报错处理
  18. Python学习笔记_05:使用Flask+MySQL实现用户登陆注册以及增删查改操作
  19. 解决Devexpress ChartControl的CalcHitInfo当中SeriesPoint为Null的问题
  20. C# Request.Params与Request.QueryString 的区别

热门文章

  1. Black And White(DFS+剪枝)
  2. OLTP和OLAP
  3. python字典中包含列表时:查找字典中某个元素及赋值
  4. oracle 查询重复数据并且删除, 只保留一条数据重复数据
  5. 基于卡方的独立性检验原理及R语言实现
  6. 签offer和签三方协议
  7. &lt;开源项目分析&gt;Cisco的开源视频加解码器THOR(H.264解码)
  8. ibdata1文件非常大如何解决,ibdata单独存储
  9. 在Delphi中使用ShellExecute(handle, &#39;open&#39;, PChar(fname),nil, nil, SW_HIDE)函数应注意的问题
  10. ruanjiangongcheng1