题意:给定一颗树,每个叶子节点\(u\)都有权值\(val[u]\),求每个非叶子节点子树的最小叶子距离,若该子树只有一个叶子节点,输出INF

貌似本来是一道树分治(并不会)的题目,然而可以利用平衡树进行离线合并,边统计边更新
一开始没有想到这种方法,看了别人家的代码后觉得真是清晰明了
set交换后无需额外在dfs维护和叶节点更新后置为INF满足题意的单一叶子情况确实是不错的trick,值得学习

#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define print(a) printf("%lld",(ll)(a))
#define println(a) printf("%lld\n",(ll)(a))
#define printbk(a) printf("%lld ",(ll)(a))
using namespace std;
const int MAXN = 5e4+11;
const int INF = 0x7fffffff;
typedef long long ll;
ll read(){ll x=0,f=1;register char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int to[MAXN<<1],nxt[MAXN<<1],head[MAXN],tot;
set<ll> s[MAXN];
ll n,m,val[MAXN];
void init(){memset(head,-1,sizeof head);tot=0;
}
void add(int u,int v){to[tot]=v;nxt[tot]=head[u];head[u]=tot++;swap(u,v);to[tot]=v;nxt[tot]=head[u];head[u]=tot++;
}
ll merge(set<ll> &a,set<ll> &b){if(a.size()<b.size()) swap(a,b);set<ll>::iterator it,lb,ub;ll mn=INF;for(it=b.begin();it!=b.end();it++){lb=ub=a.lower_bound(*it);if(lb!=a.begin()/*&&lb!=a.end()*/)lb--; //多了会WAif(lb!=a.end()) mn=min(mn,abs((*it)-(*lb)));if(ub!=a.end()) mn=min(mn,abs((*it)-(*ub)));a.insert(*it);//}b.clear();return mn;
}
#define isleaf(x) (bool((x)>=n-m+1&&(x)<=n))
void dfs(int u,int p){if(isleaf(u)){s[u].insert(val[u]);val[u]=INF;//trickreturn;}erep(i,u){int v=to[i];if(v==p)continue;dfs(v,u);val[u]=min(val[u],val[v]);val[u]=min(val[u],merge(s[u],s[v]));}
}
int main(){while(cin>>n>>m){init();rep(i,1,n) val[i]=INF;rep(i,1,n) s[i].clear();rep(i,2,n) add(read(),i);rep(i,n-m+1,n) val[i]=read();dfs(1,-1);rep(i,1,n-m){if(i==n-m) println(val[i]);else printbk(val[i]);}}return 0;
}

转载于:https://www.cnblogs.com/caturra/p/8987005.html

SGU - 507 启发式合并维护平衡树信息相关推荐

  1. 2019 ICPC 南昌 K. Tree(树上启发式合并,平衡树 treap)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://nanti.jisuanke.com/t/42586 Problem 给定一 ...

  2. P3224-[HNOI2012]永无乡【平衡树,启发式合并】

    正题 题目链接:https://www.luogu.com.cn/problem/P3224 题目大意 nnn个点,每次可以连接两个点和询问一个点所在联通块中第kkk大的数. 解题思路 我们发现可以启 ...

  3. 树上启发式合并问题 ---- 2019icpc南昌 K. Tree (树上启发式合并 + 动态开点线段树)

    题目链接 题目大意: 就是给你一颗树,每个点有个权值viv_ivi​,问你有多少对(x,y)(x,y)(x,y)满足: xxx不是yyy的祖先 yyy也不是xxx的祖先 xxx和yyy的距离不超过kk ...

  4. 图论 ---- 启发式合并 + 并查集模拟 + 证明 F. Phoenix and Earthquake

    题目大意: 给你nnn个点,mmm条边,限制xxx,每个点都有沥青aia_iai​ ,定义合并两个点即两点之间有边且au+av≥xa_u+a_v\ge xau​+av​≥x,合并之后的沥青为au+av ...

  5. 树上启动式合并问题 ---- D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [状态压缩+树上启发式合并]

    题目链接 题目大意: 一棵根为1 的树,每条边上有一个字符(a−va−va−v共22种). 一条简单路径被称为Dokhtar−kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串. 求每个子树 ...

  6. 【CF375D】Trees and Queries——树上启发式合并

    (题面不是来自Luogu) 题目描述 有一个大小为n且以1为根的树,树上每个点都有对应的颜色ci.现给出m次询问v, k,问以v为根的子树中有多少种颜色至少出现了k次. 输入格式 第一行两个数n,m表 ...

  7. 2020CCPC(长春) - Ragdoll(启发式合并+带权并查集)

    题目大意:初始时给出 n 个集合,每个集合中都包含有一个数字,现在要求执行 m 次操作,每次操作分为下列三种类型: 1 x y:在 x 位置新建一个集合,并且放置一个数字 y 2 x y:合并集合 x ...

  8. CodeForces - 600E Lomsat gelral(树上启发式合并)

    题目链接:点击查看 题目大意:给出一棵树,每个节点都有一个编号代表一种颜色,现在对于每个子树求出现最多的颜色的编号之和 题目分析:因为n给到了1e5,看完这个题第一反应就是暴力n*n,但显然是会超时的 ...

  9. bzoj 36733674 可持久化并查集加强版(可持久化线段树+启发式合并)

    CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...

最新文章

  1. 建立简单的服务器端程序
  2. 图片上传压缩android,android 图片上传压缩常见问题分析
  3. 某公司数据恢复报告书
  4. luoguSP1805,POJ2559-Largest Rectangle in a Histogram【单调栈】
  5. 5827. 检查操作是否合法
  6. 产品管理:启示录 - 特约客户、产品验证、原型测试
  7. 23种设计模式之适配器模式
  8. Swift教程_零基础学习Swift完整实例(八)_swift完整实例(添加View的动画效果、添加View的阴影)...
  9. 基础学习 Linux命令
  10. 《TensorFlow技术解析与实战》——1.1 什么是人工智能
  11. 内置函数的数据聚合NumpyPandas
  12. [Everyday Mathematics]20150112
  13. 周界防护在安防行业重要性与日俱增
  14. 免费随机图片api接口
  15. dropbox 、tombstones、debuggred
  16. localhost无法访问
  17. python爬虫: 使用knn算法破解猫眼动态字体反爬
  18. RGB颜色空间与Lab颜色空间区别与联系(附转换代码)
  19. 如何将硬盘的分区大小设置为整数
  20. android 版本分布 最新,安卓手机系统版本分布:Android 9.0占比达34%!

热门文章

  1. python conn_python中conn是什么
  2. 计算机学科知识与教学能力初级中学,教师资格信息技术笔试(初级中学)难吗?...
  3. 天猫php采集列表,QueryList: QueryList是一个基于phpQuery的通用列表采集类,是一个简单、 灵活、强大的采集工具,采集任何复杂的页面 基本上就一句话就能搞定了。...
  4. 商丘网络推广中网站内部优化需要注意的要点有哪些?
  5. 网络推广外包——企业委托网络推广外包公司提高网站流量和访问量
  6. mysql定义外键_MySQL定义外键的方法
  7. 空指针 java调用_java-变量引用与重复性get调用以避免空指针
  8. 服务器新增svn 文件,公网的SVN服务器,批量新增文件会报错
  9. android uinput 按键_linux 虚拟输入设备(uinput)模拟鼠标和键盘的使用方法
  10. server 2008 mysql 报错 0xc000007b_docker插件部署项目,volumes报错invalid volume specification...