[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=4551

[算法]

树链剖分

时间复杂度 : O(QlogN)

[代码]

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100010 struct Node
{
int l , r;
bool flg;
} Tree[MAXN << ];
struct edge
{
int to , nxt;
} e[MAXN << ]; int n , q , timer , tot;
int size[MAXN],top[MAXN],dfn[MAXN],head[MAXN],son[MAXN],father[MAXN],rev[MAXN]; template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
inline void addedge(int u,int v)
{
tot++;
e[tot] = (edge){v,head[u]};
head[u] = tot;
}
inline void dfs1(int u)
{
size[u] = ;
for (int i = head[u]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == father[u]) continue;
father[v] = u;
dfs1(v);
size[u] += size[v];
if (size[v] > size[son[u]]) son[u] = v;
}
}
inline void dfs2(int u,int tp)
{
dfn[u] = ++timer;
rev[timer] = u;
top[u] = tp;
if (son[u]) dfs2(son[u],tp);
for (int i = head[u]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v != son[u] && v != father[u]) dfs2(v,v);
}
}
inline void update(int index)
{
Tree[index].flg = Tree[index << ].flg | Tree[index << | ].flg;
}
inline void build(int index,int l,int r)
{
Tree[index].l = l;
Tree[index].r = r;
Tree[index].flg = false;
if (l == r)
{
if (l == ) Tree[index].flg = true;
return;
}
int mid = (l + r) >> ;
build(index << ,l,mid);
build(index << | ,mid + ,r);
update(index);
}
inline void modify(int index,int pos)
{
if (Tree[index].l == Tree[index].r)
{
Tree[index].flg = true;
return;
}
int mid = (Tree[index].l + Tree[index].r) >> ;
if (mid >= pos) modify(index << ,pos);
else modify(index << | ,pos);
update(index);
}
inline int query(int index,int l,int r)
{
if (!Tree[index].flg) return ;
if (Tree[index].l == Tree[index].r) return l;
int mid = (Tree[index].l + Tree[index].r) >> ;
if (mid >= r) return query(index << ,l,r);
else if (mid + <= l) return query(index << | ,l,r);
else
{
int tmp = query(index << | ,mid + ,r);
if (tmp == ) tmp = query(index << ,l,mid);
return tmp;
}
} int main()
{ 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);
}
dfs1();
dfs2(,);
build(,,n);
while (q--)
{
char op[];
int x;
scanf("%s%d",&op,&x);
if (op[] == 'Q')
{
int tx = top[x] , pos = ;
while (true)
{
pos = query(,dfn[tx],dfn[x]);
if (pos != ) break;
x = father[tx]; tx = top[x];
}
printf("%d\n",rev[pos]);
} else modify(,dfn[x]);
} return ; }

最新文章

  1. SpringMVC 返回json
  2. Android5.0资源 colorAccent,colorPrimary,colorPrimaryDark
  3. Hadoop YARN中内存的设置
  4. php开发工具之火狐浏览器插件
  5. 作业 for liao
  6. Myeclipse2014配置JSF环境
  7. WebStorm 9 注册码
  8. UIApplication sharedApplication 的常用使用方法-b
  9. Tomcat6.0数据源配置
  10. idea导入maven项目,找不到jar包,出现红色波浪线【转】
  11. Oracle中exp导出与imp导入的参数(full,owner/formuser/touser)测试
  12. MySQL添加用户并授权
  13. Web Deploy 服务器安装设置与使用
  14. 2018年中国C++大会详细日程+报名
  15. Typescript 学习笔记一:介绍、安装、编译
  16. MySQL报1130错误解决办法
  17. List&lt;Map&lt;String, Object&gt;&gt;取值
  18. Slava and tanks 877C
  19. 20144303石宇森《网络对抗》MSF基础应用
  20. python导包显示No module named XXX问题

热门文章

  1. CodeForces 21 A+B
  2. POJ 1276 Cash Machine 【DP】
  3. BZOJ1693: [Usaco2007 Demo]Asteroids
  4. UVA12345 (带修改的莫队)
  5. DELL IDRAC API接口开发文档翻译及client模块
  6. c++多线程编程:常见面试题
  7. 【python】urllib2
  8. C#:excel导入导出
  9. sudo 用户添加
  10. RabbitMQ Hello World