Description

Xenia the programmer has a tree consisting of n nodes. We will consider the tree nodes indexed from 1 to n. We will also consider the first node to be initially painted red, and the other nodes — to be painted blue.

The distance between two tree nodes v and u is the number of edges in the shortest path between v and u.

Xenia needs to learn how to quickly execute queries of two types:

  1. paint a specified blue node in red;
  2. calculate which red node is the closest to the given one and print the shortest distance to the closest red node.

Your task is to write a program which will execute the described queries.

Input

The first line contains two integers n and m (2 ≤ n ≤ 105, 1 ≤ m ≤ 105) — the number of nodes in the tree and the number of queries. Next n - 1 lines contain the tree edges, the i-th line contains a pair of integers ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — an edge of the tree.

Next m lines contain queries. Each query is specified as a pair of integers ti, vi (1 ≤ ti ≤ 2, 1 ≤ vi ≤ n). If ti = 1, then as a reply to the query we need to paint a blue node vi in red. If ti = 2, then we should reply to the query by printing the shortest distance from some red node to node vi.

It is guaranteed that the given graph is a tree and that all queries are correct.

Output

For each second type query print the reply in a single line.

Examples
Input
5 4
1 2
2 3
2 4
4 5
2 1
2 5
1 2
2 5
Output
0
3
2 正解:分块+RMQ求LCA
解题报告:
  上次考试的原题...

  正解可以写动态树分治,但同时YMDragon写的也是XYK给出的标解就是把操作分块。大概讲一下吧,就是每根号个修改都作为一个整体,丢到一个数组里面,每次询问是当前这个结点的最优解,并且把当前结点数组里面每个待更新的结点求一下距离更新一下答案。然后每当数组里面的元素多于根号个就全部取出来然后update一下整棵树,BFS一遍,相当于是多源最短路。这样可以保证复杂度。

  我发现我缺乏对根号算法的思考,平时会做会想,但是真正考试的时候很少往分块或者莫队上想,这是我需要提高和锻炼的。


 //It is made by jump~
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
const int MAXN = ;
const int inf = 1LL<<;
const int MAXM = ;
#define RG register
const int SIZE = ;
int n,m,ecnt,ans;
int first[MAXN],to[MAXM],next[MAXM];
int deep[MAXN],id[MAXN];
int dui[MAXN],head,tail,dis[MAXN],ans_dis[MAXN];
int D[MAXN*],belong[MAXN*];
int ST[MAXN*][],mi[];
int stack[SIZE+],top; inline int getint()
{
RG int w=,q=; RG char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar(); if(c=='-') q=,c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar(); return q ? -w : w;
} inline void dfs(int x,int fa){
D[++ecnt]=x; id[x]=ecnt;
for(int i=first[x];i;i=next[i]) {
RG int v=to[i]; if(v==fa) continue;
deep[v]=deep[x]+; dfs(v,x);
D[++ecnt]=x;
}
} inline void build(){
belong[]=; for(int i=;i<=ecnt;i++) belong[i]=belong[i/]+;
mi[]=; for(int i=;i<=;i++) mi[i]=mi[i-]*;
for(int i=;i<=ecnt;i++) ST[i][]=D[i];
for(int j=;j<=;j++) for(int i=;i+mi[j-]-<=ecnt;i++) { if(deep[ST[i+mi[j-]][j-]]>deep[ST[i][j-]]) ST[i][j]=ST[i][j-]; else ST[i][j]=ST[i+mi[j-]][j-]; }
} inline int lca(int x,int y){
int f1=id[x],f2=id[y]; if(f1>f2) swap(f1,f2);
int ll=f2-f1+,lr=belong[ll];
if(deep[ST[f1][lr]]>deep[ST[f2-(<<lr)+][lr]]) return ST[f2-(<<lr)][lr];
else return ST[f1][lr];
} inline void work(){
n=getint(); m=getint(); RG int x,y;
for(RG int i=;i<=n;i++) {
x=getint(); y=getint();
next[++ecnt]=first[x]; first[x]=ecnt; to[ecnt]=y;
next[++ecnt]=first[y]; first[y]=ecnt; to[ecnt]=x;
}
ecnt=; dfs(,); build();
for(RG int i=;i<=n;i++) ans_dis[i]=deep[i];
RG int ljh,u;
while(m--) {
ljh=getint();
if(ljh==) {
x=getint(); for(RG int i=;i<=top;i++) ans_dis[x]=min(ans_dis[x],deep[x]+deep[stack[i]]-deep[lca(x,stack[i])]*);
printf("%d\n",ans_dis[x]);
}
else {
x=getint(); if(x==) continue; stack[++top]=x;
if(top>=SIZE) {
head=; tail=; for(RG int i=;i<=n;i++) dis[i]=inf;
for(RG int i=;i<=top;i++) dui[++tail]=stack[i],dis[stack[i]]=;
top=;
while(head<tail) {
head++; u=dui[head]; ans_dis[u]=min(ans_dis[u],dis[u]);
for(RG int i=first[u];i;i=next[i]) {
RG int v=to[i];
if(dis[v]==inf) {
dis[v]=dis[u]+; dui[++tail]=v;
}
}
}
}
}
}
} int main()
{
work();
return ;
}

codeforces 342E :Xenia and Tree的更多相关文章

  1. Codeforces 339B:Xenia and Ringroad(水题)

    time limit per test : 2 seconds memory limit per test : 256 megabytes input : standard input output ...

  2. codeforces 741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(启发式合并)

    codeforces 741D Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths 题意 给出一棵树,每条边上有一个字符,字符集大小只 ...

  3. codeforces 812E Sagheer and Apple Tree(思维、nim博弈)

    codeforces 812E Sagheer and Apple Tree 题意 一棵带点权有根树,保证所有叶子节点到根的距离同奇偶. 每次可以选择一个点,把它的点权删除x,它的某个儿子的点权增加x ...

  4. Codeforces E. Alyona and a tree(二分树上差分)

    题目描述: Alyona and a tree time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  5. [codeforces 339]D. Xenia and Bit Operations

    [codeforces 339]D. Xenia and Bit Operations 试题描述 Xenia the beginner programmer has a sequence a, con ...

  6. [codeforces 339]C. Xenia and Weights

    [codeforces 339]C. Xenia and Weights 试题描述 Xenia has a set of weights and pan scales. Each weight has ...

  7. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    Ext.Net学习笔记22:Ext.Net Tree 用法详解 上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat=&q ...

  8. codeforces 220 C. Game on Tree

    题目链接 codeforces 220 C. Game on Tree 题解 对于 1节点一定要选的 发现对于每个节点,被覆盖切选中其节点的概率为祖先个数分之一,也就是深度分之一 代码 #includ ...

  9. Linux 指令篇:磁盘管理--tree

    Linux 指令篇:磁盘管理--tree 功能说明:以树状图列出目录的内容. 语 法:tree [-aACdDfFgilnNpqstux][-I <范本样式>][-P <范本样式&g ...

随机推荐

  1. MVC中如何设置路由指定默认页

    MVC中怎么设置默认页,在webform中 只要右键设置起始页就可以,但MVC中却没有这个功能,其实MVC更简单 如下: Login是控制器,Index 是动作 在全局Global.asax中改动下即 ...

  2. 重构Web Api程序(Api Controller和Entity) 续篇(1)

    经过一系列重构,你眼明的话,还是可以看到还有重构的地方,如: string newFileName = "~/Temp/" + Guid.NewGuid().ToString() ...

  3. crontab小结

    crontab是linux下的计划任务,可以用来定时或者按计划运行命令. 创建计划任务: 1.使用crontab -e命令,直接创建计划任务 2.使用编辑器编写好计划任务的文件后,再使用crontab ...

  4. TinyFrame升级之九:实现复杂的查询

    本章我们主要讲解如何实现一个复杂的查询.由于目前TinyFrame框架已经投入到了实际的项目生产中,所以我很乐意将项目中遇到的任何问题做以记录并备忘. 这章中,我们提到的查询界面如下所示: 其中,涉及 ...

  5. CUDA2.3-原理之任意长度的矢量求和与用事件来测量性能

    __global__ void add( int *a, int *b, int *c) { <span style="white-space:pre"> </s ...

  6. DOM 概况

    DOM(文档对象模型)是针对 HTML 和 XML 文档的一个API(应用程序编程接口).DOM 描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分. 层次节点 DOM可以将任何 H ...

  7. Vuforia AR SDK入门

    Vuforia是一个能让应用拥有视觉的软件平台.开发者借助它可以很轻松地为任何应用添加先进计算机视觉功能,允许你识别图片和物体,或者在真实世界中重建环境内容. 如果你现在正在制作一些可交互的市场活动项 ...

  8. Ext.NET-布局篇

    概述 前一篇介绍了Ext.NET基础知识,并对Ext.NET布局进行了简要的说明,本文中我们用一个完整的示例代码来看看Ext.NET的布局. 示例代码下载地址>>>>> ...

  9. ASP.NET网站入侵第二波(LeaRun.信息化快速开发框架 已被笔者拿下)

    笔者小学文化,语言组织能力差,写的不通的地方请大家将就着看,不喜勿喷. 上篇我讲了如何在上传文件中入侵服务器,這次我们稍微多讲一点. 还是先讲下流程: 1.上传代码页面  我上传的是ashx页面. 2 ...

  10. ERROR: “System.Web.Mvc.Controller.File(string, string, string)”是一个“方法”

    ERROR: “System.Web.Mvc.Controller.File(string, string, string)”是一个“方法”,这在给定的上下文中无效 这是一个与Controller.F ...