CodeForces 825G"Tree Queries"(选根建树)
•参考资料
[1]:CodeForces 825G Educational Round #25 G :建树选根大法+O1大法+iostream解绑了还是慢
•题意
给定一颗包含 n 个节点的树,开始树的所有节点都是白色的;
给出 q 次询问,询问分为1、2两种:
- 将节点 x 涂成黑色。
- 询问节点 x 到所有的黑点节点的简单路径中的标号最小的那个点(包括起点和黑点)
题目保证第一次询问是 1 类型的。
•题解
如果我们随便选取某节点作为根节点,那么询问的时候,我们要找到节点 x 到所有黑色节点的 LCA;
但是这样显然会超时的,所以我们换一种建树方法。
由于第一个询问必然是 1 类型,那么我们就把第一次询问的那个变黑的点作为根节点,看一下这样有什么好处;
定义 $res_i$ 表示节点 i 到根节点(询问1的x)的路径中,标号最小的节点;
首先,我们预处理出所有的 $res$,只需 $DFS$ 一遍即可,时间复杂度 $O(n)$;
接下来,如果剩余的询问全部是 2 类型,那么,对于节点 x 的询问,直接输出 $res_x$ 即可;
但是,如果存在 1 类型的询问呢?
对于新的黑色节点 $u_1,u_2,.....$,在查询节点 x 的时候,除了需要知道节点 x 到根节点路径上标号最小的节点;
同时还需要求出节点 x 到黑色节点 $u_i$ 路径上标号最小的节点;
你会发现,求解节点 x 到黑色节点 $u_i$ 路径上的标号最小的节点等价于求解根节点到黑色节点 $u_i$ 路径上的标号最小的节点;
那这么说的话,我们就可以定义一个变量 $Min$,用来存储新加入的黑色节点到根节点的路径上标号最小的节点信息;
询问的时候,只需输出 $res_x$ 和 $Min$ 的最小值即可;
•Code
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn=1e6+; int n,q;
int num;
int head[maxn];
struct Edge
{
int to;
int next;
}G[maxn<<];
void addEdge(int u,int v)
{
G[num]={v,head[u]};
head[u]=num++;
}
int res[maxn]; void DFS(int u,int f)
{
res[u]=min(u,res[f]);
for(int i=head[u];~i;i=G[i].next)
{
int v=G[i].to;
if(v != f)
DFS(v,u);
}
}
void Solve()
{
mem(res,INF); int ans=;
int Min=INF;
for(int i=;i <= q;++i)
{
int t,z;
scanf("%d%d",&t,&z);
int x=(z+ans)%n+; if(i == )
DFS(x,x);
else if(t == )
Min=min(Min,res[x]);
else
{
ans=min(Min,res[x]);
printf("%d\n",ans);
}
}
}
void Init()
{
num=;
mem(head,-);
}
int main()
{
Init();
scanf("%d%d",&n,&q);
for(int i=;i < n;++i)
{
int u,v;
scanf("%d%d",&u,&v);
addEdge(u,v);
addEdge(v,u);
}
Solve(); return ;
}
CodeForces 825G"Tree Queries"(选根建树)的更多相关文章
- AC日记——825G - Tree Queries
825G - Tree Queries 思路: 神题,路径拆成半链: 代码: #include <cstdio> #include <cstring> #include < ...
- Codeforces 1606F - Tree Queries(虚树+树形 dp)
Codeforces 题面传送门 & 洛谷题面传送门 显然我们选择删除的点连同 \(u\) 会形成一个连通块,否则我们如果选择不删除不与 \(u\) 在同一连通块中的点,答案一定更优. 注意到 ...
- Codeforces 960D - Full Binary Tree Queries
960D - Full Binary Tree Queries 思路: 用move1[i]记录第i层第1种操作移动的个数(对这一层的个数取模) 用move2[i]记录第i层第2种操作移动的个数(对这一 ...
- [Codeforces 266E]More Queries to Array...(线段树+二项式定理)
[Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...
- CF1328E Tree Queries
CF1328E Tree Queries 应该还是比较妙的 题意 给你一个树,然后多次询问 每次询问给出一堆节点,问你是否能找到一个从根出发的链,是的对于给出的每个节点,都能找出链上的点,是的他们的距 ...
- CF-1328 E. Tree Queries
E. Tree Queries 题目链接 题意 给定一个树,每次询问一组点,问是否存在一条从根到某点的路径,使得该组点到该路径的最短距离不超过1 分析 从根到达某点的路径,如果覆盖到了某个点,那么一定 ...
- [Codeforces]817F. MEX Queries 离散化+线段树维护
[Codeforces]817F. MEX Queries You are given a set of integer numbers, initially it is empty. You sho ...
- E. Tree Queries 解析(思維、LCA)
Codeforce 1328 E. Tree Queries 解析(思維.LCA) 今天我們來看看CF1328E 題目連結 題目 給你一棵樹,並且給你\(m\le2e5\)個詢問(包含\(k\)個點) ...
- Codeforces1695 D1.+D2 Tree Queries
题意 给一个n个点的无向图,其中有一个隐藏点X,可以进行一组询问S来确定S是n个节点中的哪个点.S包括k个询问节点.询问返回的值也为k个值,每个值为X点到每个询问节点的最短路距离,求k最小为多少. 提 ...
随机推荐
- Loadrunner常用分析点
Loadrunner常用的分析点 一.在Vuser(虚拟用户状态)中 1.Running Vusers:提供了生产负载的虚拟用户运行状态的相关信息,可以帮助我们了解负载生成的结果.(即用户在几分钟左右 ...
- Quarz框架学习
参考博客:https://www.cnblogs.com/zhanghaoliang/p/7886110.html
- python 运算符重复
- 【水滴石穿】imooc_gp
这个项目应该是一个标杆项目,看到之前很有几个项目都是按照这个项目的页面摆放顺序来的 不过可以作为自己做项目的一种方式 源码地址为:https://github.com/pgg-pgg/imooc_gp ...
- golang之数据结构
4种:bool/int/uint/uintptr(其中bool类型的零值为false,其余类型的零值为0) 4种:float32/float64/complex64/complex126 (零值为0) ...
- DAY1-作业
Python-day1-------> 本节内容: Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据 ...
- Mysql里查询字段为Json格式的数据模糊查询以及分页方法
public void datagrid(CustomFormEntity customForm,HttpServletRequest request, HttpServletResponse res ...
- JavaScript--自调用函数(小闭包)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【JZOJ4868】【NOIP2016提高A组集训第9场11.7】Simple
题目描述 数据范围 解法 在暴力枚举的基础上,当n的系数在[0,m/gcd(n,m))时,得到的c是不重复不遗漏的. 设n的系数为x,m的系数为y. 不重复不遗漏性 设x=m/gcd(n,m)+i,那 ...
- html的select标签清空option!~~~~
最好的方法:document.getElementById("selectId").length = 1; 也可以document.getElementById("sel ...