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 树分治相关推荐

  1. CF #563 Div2 F. Ehab and the Big Finale //树链剖分(模板)+ 交互

    题意:给一颗树,和一个隐藏的节点x,在36次询问内求出x. 每次询问: 1.询问x到某一结点u的距离   2.某个节点u到x的路径上,得到u的儿子节点(u必须是x的祖先,否则WA). 思路: 首先处理 ...

  2. CF1174F Ehab and the Big Finale(交互+剖分)

    做法 \(x\)为隐藏节点,\(dep_x=d(1,x)\) \((1)\):\(u=1\) \((2)\):重链剖分,比如\(v\)为\(u\)的重链底部,查询\(dis(x,v)\)的长度,\(y ...

  3. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  4. bzoj 4025 二分图——线段树分治+LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...

  5. 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)

    题目链接 题目大意: 你有个点集合SSS,每次往集合里面加点或者删点(如果要加的点出现过),如果(x1,y1),(x2,y1),(x1,y2),(x2,y2)(x1,y1),(x2,y1),(x1,y ...

  6. 线段树分治 ---- CF1217F - Forced Online Queries Problem(假离线 可撤销并查集 + 线段树分治)详解

    题目链接 题目大意 解题思路: 我一开始想到可以用可撤销并查集去维护这种删边加边的操作,但是有个缺点是每次撤销都有把后面的边全部撤销复度是O(n2)O(n^2)O(n2) 首先我们考虑这种动态加边删边 ...

  7. POJ 1741 树分治

    题目链接[http://poj.org/problem?id=1741] 题意: 给出一颗树,然后寻找点对(u,v)&&dis[u][v] < k的对数. 题解: 这是一个很经典 ...

  8. POJ1741:Tree——题解+树分治简要讲解

    http://poj.org/problem?id=1741 题目大意:给一棵树,求点对间距离<=k的个数. -------------------- 以这道题为例记录一下对于树分治的理解. 树 ...

  9. 3237: [Ahoi2013]连通图 线段树分治

    题解: cf765f cf671e bzoj4184 bzoj4552 线段树分治裸题 还是介绍一下线段树分治 这个东西其实挺简单但也挺有用的 可以把删除+插入操作变成只有插入(倒着就是删除) 像这一 ...

最新文章

  1. Handler的postDelayed()关闭的方法
  2. 开源BTS产品中存在多处漏洞,攻击者或可劫持手机通讯基站
  3. C# 使用反射设置某个对象的属性或读取某个对象的属性
  4. yxy和志愿者小姐姐番外篇之大宝宝123追番记(补题,淘汰赛)
  5. Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (5) Shader优化
  6. 这个24岁北航博士刚毕业就受聘211大学副教授,他大一就保研,学术能力太牛了.........
  7. 前端学习(100):float注意点整理1
  8. NYOJ276 比较字母大小
  9. 【热修复】Andfix源码分析
  10. c语言除法加括号么,算不了除法,为什么?
  11. linux java php_Linux PHP 搭建 JavaBridge
  12. 小米一元流量magisk_电信流量10G才9.9元?
  13. 知识蒸馏 | 综述:蒸馏机制
  14. (转)自定义listView及其adapter动态刷新
  15. Verifying transaction: | WARNING conda.core.path_actions:verify(962): Unable to create environments
  16. java日记 简单Java家庭记账系统
  17. Python遇到的问题:IndentationError: expected an indented block
  18. 更改itunes备份路径【windows备份iphone数据】
  19. 不用第三方写一个简单的推流软件
  20. ANSYS的几种动画模式

热门文章

  1. Maven打包报错Unknown lifecycle phase “mvn“. You must specify a valid lifecycle
  2. 产品宣传片制作创意攻略的先决条件
  3. python基于django幼儿园管理系统
  4. matlab unwrap angle,matlab之unwrap函数
  5. 文件编码入门:UTF-8和GB
  6. 凝思Linux切换到root时出错
  7. 清新简约教育培训汇报总结PPT-朴尔PPT
  8. android屏幕共享demo_「手机共享」Android手机之间实现屏幕共享 - seo实验室
  9. 【华为/华三】PPP
  10. 2022中国数字孪生领域最具商业合作价值企业盘点