CF1174F Ehab and the Big Finale 树分治
https://codeforces.com/contest/1174/problem/F
题意: 交互题,给出一棵树,1为树根,有一点x为目标点。
有两种操作 d a: 询问a到x的距离,s a:询问从a到x的路径上第二个结点的编号,注意a必须要是x的祖先结点。
需要在36次询问内给出x结点
思路:先从树根开始一次dfs,sz数组维护以i为根节点的树拥有的结点数(包括i本身)。 询问一次d 1,得到x的深度depx
然后从树根开始,每次经过sz值最大的子节点,直到该路径的终点v,并询问d v 得到dist(x,v).
因为我们现在知道depv,depx,dist(x,v),那么我们可以知道y=lca(v,x)的深度depy, dist(x,v)=depx+depv−2∗depy
因为该路径上的所有点深度都不同,所以我们可以得到y点的位置,询问s y,得到从y到x路径上第二个结点的编号。
进行下一次dfs,当depv==depx时,x的位置便是该次dfs上路径的唯一点。于是我们得到x的位置
#include<bits/stdc++.h> using namespace std; const int maxn=2e5+5; vector<int> v[maxn],h; int sz[maxn],dep[maxn],depx; int pre(int node,int p){ sz[node]=1; for(int u:v[node]){ if(u!=p){ dep[u]=dep[node]+1; sz[node]+=pre(u,node); } } return sz[node]; } int query(char c,int u){ printf("%c %d\n",c,u); fflush(stdout); int ans; scanf("%d",&ans); return ans; } void get(int node){ h.push_back(node); int big=-1; for(int u:v[node]){ if(sz[node]>sz[u]&&(big==-1||(sz[u]>sz[big]))) big=u; } if(big!=-1) get(big); } int dfs(int node){ h.clear(); get(node); int depy=(depx+dep
转载于:https://www.cnblogs.com/hanker99/p/10981902.html
CF1174F Ehab and the Big Finale 树分治相关推荐
- CF #563 Div2 F. Ehab and the Big Finale //树链剖分(模板)+ 交互
题意:给一颗树,和一个隐藏的节点x,在36次询问内求出x. 每次询问: 1.询问x到某一结点u的距离 2.某个节点u到x的路径上,得到u的儿子节点(u必须是x的祖先,否则WA). 思路: 首先处理 ...
- CF1174F Ehab and the Big Finale(交互+剖分)
做法 \(x\)为隐藏节点,\(dep_x=d(1,x)\) \((1)\):\(u=1\) \((2)\):重链剖分,比如\(v\)为\(u\)的重链底部,查询\(dis(x,v)\)的长度,\(y ...
- 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横
不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...
- bzoj 4025 二分图——线段树分治+LCT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...
- 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)
题目链接 题目大意: 你有个点集合SSS,每次往集合里面加点或者删点(如果要加的点出现过),如果(x1,y1),(x2,y1),(x1,y2),(x2,y2)(x1,y1),(x2,y1),(x1,y ...
- 线段树分治 ---- CF1217F - Forced Online Queries Problem(假离线 可撤销并查集 + 线段树分治)详解
题目链接 题目大意 解题思路: 我一开始想到可以用可撤销并查集去维护这种删边加边的操作,但是有个缺点是每次撤销都有把后面的边全部撤销复度是O(n2)O(n^2)O(n2) 首先我们考虑这种动态加边删边 ...
- POJ 1741 树分治
题目链接[http://poj.org/problem?id=1741] 题意: 给出一颗树,然后寻找点对(u,v)&&dis[u][v] < k的对数. 题解: 这是一个很经典 ...
- POJ1741:Tree——题解+树分治简要讲解
http://poj.org/problem?id=1741 题目大意:给一棵树,求点对间距离<=k的个数. -------------------- 以这道题为例记录一下对于树分治的理解. 树 ...
- 3237: [Ahoi2013]连通图 线段树分治
题解: cf765f cf671e bzoj4184 bzoj4552 线段树分治裸题 还是介绍一下线段树分治 这个东西其实挺简单但也挺有用的 可以把删除+插入操作变成只有插入(倒着就是删除) 像这一 ...
最新文章
- Handler的postDelayed()关闭的方法
- 开源BTS产品中存在多处漏洞,攻击者或可劫持手机通讯基站
- C# 使用反射设置某个对象的属性或读取某个对象的属性
- yxy和志愿者小姐姐番外篇之大宝宝123追番记(补题,淘汰赛)
- Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (5) Shader优化
- 这个24岁北航博士刚毕业就受聘211大学副教授,他大一就保研,学术能力太牛了.........
- 前端学习(100):float注意点整理1
- NYOJ276 比较字母大小
- 【热修复】Andfix源码分析
- c语言除法加括号么,算不了除法,为什么?
- linux java php_Linux PHP 搭建 JavaBridge
- 小米一元流量magisk_电信流量10G才9.9元?
- 知识蒸馏 | 综述:蒸馏机制
- (转)自定义listView及其adapter动态刷新
- Verifying transaction: | WARNING conda.core.path_actions:verify(962): Unable to create environments
- java日记 简单Java家庭记账系统
- Python遇到的问题:IndentationError: expected an indented block
- 更改itunes备份路径【windows备份iphone数据】
- 不用第三方写一个简单的推流软件
- ANSYS的几种动画模式
热门文章
- Maven打包报错Unknown lifecycle phase “mvn“. You must specify a valid lifecycle
- 产品宣传片制作创意攻略的先决条件
- python基于django幼儿园管理系统
- matlab unwrap angle,matlab之unwrap函数
- 文件编码入门:UTF-8和GB
- 凝思Linux切换到root时出错
- 清新简约教育培训汇报总结PPT-朴尔PPT
- android屏幕共享demo_「手机共享」Android手机之间实现屏幕共享 - seo实验室
- 【华为/华三】PPP
- 2022中国数字孪生领域最具商业合作价值企业盘点