CF #563 Div2 F. Ehab and the Big Finale //树链剖分(模板)+ 交互
题意:给一颗树,和一个隐藏的节点x,在36次询问内求出x。
每次询问: 1.询问x到某一结点u的距离 2.某个节点u到x的路径上,得到u的儿子节点(u必须是x的祖先,否则WA)。
思路:
首先处理出重链。
从根节点u开始,记u上的重链的链尾是v。
求出lca(v,x) 记作y。
然后执行操作2,求出y的x所在的子树的根节点(红色部分)。
那么在这个新子树上重复以上操作,除了子树的其他部分删去(绿色部分)。
跳出的出口:当x和y在同一节点时。
每次查询两次,且删掉一半的节点,所以最多只有36次。
跳出的出口和交互是真的快写?了,
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define FI first
#define SE second
const LL mod =1e9+7;
const int MX = 2e5+5;
int n;vector<int>g[MX];
int fa[MX],d[MX],sz[MX],son[MX],id[MX],rk[MX],top[MX],bot[MX];
/* 父亲,深度,子节点数,重儿子, dfs序,dfs映射,链头, 链尾 */
int clockCnt;
void dfs(int now,int dd){d[now]=dd;sz[now]=1;for(auto i:g[now]){if(i==fa[now])continue;fa[i]=now;dfs(i,dd+1);sz[now]+=sz[i];if(sz[i]>sz[son[now]]) son[now]=i; //重儿子}
}
void redfs(int now,int tp){top[now]=tp;//保存当前节点所在链的顶端节点id[now]=++clockCnt;rk[clockCnt]=now;//标记dfs序并反向映射if(son[now])redfs(son[now],tp),bot[now]=bot[son[now]];//选择择优先进入重儿子来保证一条重链上各个节点dfs序连续,一个点和它的重儿子处于同一条重链,所以重儿子所在重链的顶端还是ttelse bot[now]=now;for(auto i:g[now]){if(i!=fa[now]&&i!=son[now])redfs(i,i);//进入轻链}
}
int main(){cin>>n;for(int i=1;i<n;i++){int su,sv;scanf("%d%d",&su,&sv);g[su].push_back(sv);g[sv].push_back(su);}dfs(1,1);redfs(1,1);int u=1,v=bot[u];printf("d %d\n",u);fflush(stdout);int utox;cin>>utox;while(1){printf("d %d\n",v);fflush(stdout);int vtox;scanf("%d",&vtox);int utoy=utox+id[v]-id[u]-vtox;utoy/=2;int y=rk[id[u]+utoy];if(utox==utoy){printf("! %d\n",y);return 0;}printf("s %d\n",y);fflush(stdout);scanf("%d",&u);v=bot[u];utox=utox-utoy-1;}return 0;
}
/*14
1 2 1 3 1 4
2 5 2 6
3 7
4 8 4 9 4 10
6 11 6 12
9 13 13 14*/
/*
9
1 2 2 3 3 4
4 5 5 6
4 7 7 8 8 9
5
5
5
*/
树链剖分
大概就是处理出这么个东西。
CF #563 Div2 F. Ehab and the Big Finale //树链剖分(模板)+ 交互相关推荐
- Codeforces Round #563 (Div. 2) F. Ehab and the Big Finale
后续: 点分治标程 使用father数组 比使用vis数组优秀(不需要对vis初始化) https://codeforces.com/problemset/problem/1174/F https:/ ...
- Codeforces Round #628 (Div. 2) F. Ehab‘s Last Theorem dfs树
传送门 文章目录 题意: 思路: 题意: 给你个nnn个点mmm条边的图,可以选择完成以下两个任务中的一个: (1)(1)(1)找出大小恰好为n\sqrt nn的一个独立集. (2)(2)(2)找出 ...
- Codeforces#1157 F. Ehab and the Big Finale (思维+交互题)
链接: http://codeforces.com/contest/1174/problem/F 题意: 给你一颗树,需要你求出某个已知点,你有两种询问操作 问你能否在36次询问之内得知所求点 思路: ...
- Codeforces Round #563 (Div. 2)-F. Ehab and the Big Finale
地址:https://codeforces.com/contest/1174/problem/F 思路:思维+分治 官方题解:https://codeforces.com/blog/entry/673 ...
- Ehab and the Big Finale【交互】【树链剖分】
题目链接:https://codeforces.com/contest/1174/problem/F 参考题解:https://dudulu.net/blog/?p=1696 #include < ...
- CF1174F Ehab and the Big Finale 树分治
https://codeforces.com/contest/1174/problem/F 题意: 交互题,给出一棵树,1为树根,有一点x为目标点. 有两种操作 d a: 询问a到x的距离,s a:询 ...
- CodeForces - 1401 F Reverse and Swap(线段树, 区间翻转, 区间交换,清晰易懂)
CodeForces - 1401 F Reverse and Swap(线段树, 区间翻转, 区间交换) 首先一共有四个操作,第一个和第四个都是线段树的基本操作,直接用线段树实现. 第 ...
- CF #673 div2 赛后总结
文章目录 前言 A B C D E F 前言 完成成就:在学校熬夜熬到1点 第一次CF打比赛就炸成这个样子 A 题目翻译: 一个长度为 n n n的数组,每次选择 i , j ( 1 ≤ i , j ...
- CF 868 div2 A—C
A 题就是一个预处理然后进行枚举 首先数据范围不是很大 然后我们依照题意看看如何构造出对应的要求,也就是说我们需要在不同的下标下使得 ai*aj=1 那么只有1 1 或者-1 -1 那么这个不管是1 ...
最新文章
- 深度学习不可信?大脑建模先驱有话说
- mysql典型sql示例(DML)
- java 编译开关_java – 字符串是关于开关的数字类型,并始终编译为lookupswitch?
- Scala入门到精通——第十九节 隐式转换与隐式参数(二)
- C#获取本机可用端口
- Codeforces Round #743 (Div. 2) D. Xor of 3 模拟 + 构造
- 金叉成功率_一个非常强烈的买卖信号:三金叉见顶,三死叉见底,短短10字,但是成功率却远超“金叉买,死叉卖”...
- 蒙特卡洛方法_【每日一题56】蒙特卡洛方法 用试验所得的频率估计事件发生概率...
- 【C语言】第三章 基本运算与顺序结构 题解
- Android 系统(132)---ODM 开发用户常见需求文档(六)
- java sender_Spring Boot用JavaMailSender发送邮件方法
- 「JXOI2018」游戏
- 输入电容及DCM-CCM-QR变压器计算
- 51单片机12864大液晶屏俄罗斯方块 ROTEUS 和51单片机教程(仿真文件+源代码)
- android按钮悬停吸附,Android简单实现悬浮吸附的FloatingView
- 如何看待数字藏品越来越火
- 招行首发芭比娃娃MP3
- matlab 网络分析仪,N5244A网络分析仪安捷伦N5244A
- python程序的三种控制结构_python二级考试大纲内容:程序的三种控制结构
- 靠一己之力造就3个首富,丁磊、刘强东、宗庆后背后的神秘女人