COGS 2280. [HZOI 2015]树白黑
★★ 输入文件:B_Tree.in 输出文件:B_Tree.out 简单对比
时间限制:2 s 内存限制:512 MB
【题目描述】
给定一棵有根树,树根为1,一开始这棵树所有节点均为白色
之后给定一个染色序列,第i个数ai表示将ai这个点染黑
之后给定若干询问
询问第L到第R个染黑的黑点和u所有的LCA中深度最大的LCA的编号
【输入格式】
第一行n,m,q 表示节点总数,染色序列长度,询问个数
以下n-1行,每行u,v描述一条边的两个端点
之后m个正整数表示染色序列
之后q行,每行L,R,u 如题目所示
n,m,q<=200000 可能会有点重复被染色
【输出格式】
对于每个询问输出对应的答案
【样例输入】
5 5 5
1 2
2 3
3 4
1 5
3 2 4 3 2
3 5 4
1 2 1
1 1 2
5 5 2
2 2 4
【样例输出】
4
1
2
2
2 主席树+LCA
屠龙宝刀点击就送
#include <cstdio>
#include <vector>
#define N 200500 using std::vector;
vector<int>edge[N];
struct cmt
{
int l,r,Size;
}tr[N*];
int k,tot,tim,n,m,q,root[N],siz[N],dad[N][],dfn[N],pos[N],dep[N];
void dfs(int x)
{
dfn[x]=++tim;
pos[tim]=x;
dep[x]=dep[dad[x][]]+;
for(int i=;dad[x][i];i++)
dad[x][i+]=dad[dad[x][i]][i];
for(int i=;i<edge[x].size();++i)
{
int v=edge[x][i];
if(dad[x][]!=v)
{
dad[v][]=x;
dfs(v);
}
}
}
void update(int l,int r,int x,int &y,int t)
{
y=++tot;
tr[y].Size=tr[x].Size+;
if(l==r) return;
tr[y].l=tr[x].l;
tr[y].r=tr[x].r;
int mid=(l+r)>>;
if(t<=mid) update(l,mid,tr[x].l,tr[y].l,t);
else update(mid+,r,tr[x].r,tr[y].r,t);
}
int ask(int l,int r,int lx,int rx)
{
if(l==r) return l;
int mid=(l+r)>>;
if(k<=tr[tr[rx].l].Size-tr[tr[lx].l].Size) return ask(l,mid,tr[lx].l,tr[rx].l);
else {k-=tr[tr[rx].l].Size-tr[tr[lx].l].Size;return ask(mid+,r,tr[lx].r,tr[rx].r);}
}
int query(int l,int r,int x,int y,int a,int b)
{
if(l==a&&r==b) return tr[y].Size-tr[x].Size;
int mid=(l+r)>>;
if(a>mid) return query(mid+,r,tr[x].r,tr[y].r,a,b);
else if(b<=mid) return query(l,mid,tr[x].l,tr[y].l,a,b);
else return query(l,mid,tr[x].l,tr[y].l,a,mid)+query(mid+,r,tr[x].r,tr[y].r,mid+,b);
}
inline void swap(int &m,int &n)
{
int tmp=n;
n=m;
m=tmp;
}
inline int lca(int x,int y)
{
if(dep[x]>dep[y]) swap(x,y);
for(int i=;i>=;i--)
if(dep[dad[y][i]]>=dep[x]) y=dad[y][i];
if(x==y) return x;
for(int i=;i>=;i--)
if(dad[x][i]!=dad[y][i]) x=dad[x][i],y=dad[y][i];
return dad[x][];
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int u,v,i=;i<n;++i)
{
scanf("%d%d",&u,&v);
edge[u].push_back(v);
edge[v].push_back(u);
}
dfs();
for(int a,i=;i<=m;++i)
{
scanf("%d",&a);
update(,n,root[i-],root[i],dfn[a]);
}
for(int l,r,u;q--;)
{
scanf("%d%d%d",&l,&r,&u);
if(dfn[u]==)
{
k=;
printf("%d\n",lca(u,pos[ask(,n,root[l-],root[r])]));
}
else if(dfn[u]==n)
{
k=r-l+;
printf("%d\n",lca(u,pos[ask(,n,root[l-],root[r])]));
}
else
{
int tmp=query(,n,root[l-],root[r],,dfn[u]-);
if(tmp)
{
k=tmp;
int x=pos[ask(,n,root[l-],root[r])];
if(tmp==r-l+) printf("%d\n",lca(u,x));
else
{
k=tmp+;
int y=pos[ask(,n,root[l-],root[r])];
x=lca(x,u);
y=lca(y,u);
printf("%d\n",dep[x]>dep[y]?x:y);
}
}
else k=,printf("%d\n",lca(u,pos[ask(,n,root[l-],root[r])]));
}
}
return ;
}
COGS 2280. [HZOI 2015]树白黑的更多相关文章
- COGS 2580. [HZOI 2015]偏序 II
COGS 2580. [HZOI 2015]偏序 II 题目传送门 题目大意:给n个元素,每个元素有具有4个属性a,b,c,d,求i<j并且ai<aj,bi<bj,ci<cj, ...
- cogs 2320. [HZOI 2015]聪聪的世界题解
2320. [HZOI 2015]聪聪的世界 时间限制:6 s 内存限制:512 MB [题目描述] 背景: 聪聪的性取向有问题. 题目描述: 聪聪遇到了一个难题: 给出一个序列a1…an,完成以 ...
- cogs 2123. [HZOI 2015] Glass Beads
2123. [HZOI 2015] Glass Beads ★★★ 输入文件:MinRepresentations.in 输出文件:MinRepresentations.out 简单对比时 ...
- [COGS 2258][HZOI 2015]复仇的序幕曲
Description 你还梦不梦痛不痛,回忆这么重你怎么背得动 ----序言 当年的战火硝烟已经渐渐远去,可仇恨却在阿凯蒂王子的心中越来越深 他的叔父三年前谋权篡位,逼宫杀死了他的父王,用铁血手腕平 ...
- [HZOI 2015]树黑白
[题目描述] 给定一棵树,要求维护以下操作: 1.M u 将u节点反色 2.Q u 查询u到所有黑色节点距离和 [输入格式] 第一行n,m 表示节点总数和操作次数 之后n-1行,每行u,v表示两个端点 ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- COGS 2188. [HZOI 2015] Math 题解
题目描述: 给定n个数X1-Xn,求下面式子的值(整数部分): n<=107,xi<=109且互不相同. 分析: 其实一开始看见这道题我也吓傻了,k这么大,再说我又是数论鶸渣,打死也不 ...
- [COGS 2287][HZOI 2015]疯狂的机器人
Description 题库链接 现在在二维平面内原点上有一只机器人,他每次可以选择向右走,向左走,向下走,向上走和不走(每次如果走只能走一格).机器人不能走到横坐标是负数或者纵坐标是负数的点上. 给 ...
- cogs 2355. [HZOI 2015] 有标号的DAG计数 II
题目分析 来自2013年王迪的论文<浅谈容斥原理> 设\(f_{n,S}\)表示n个节点,入度为0的点集恰好为S的方案数. 设\(g_{n,S}\)表示n个节点,入度为0的点集至少为S的方 ...
随机推荐
- IOS远程推送证书的制作步骤
今天还在看环信的使用方法,在环信的官网上发现了这组制作远程推送证书的一组图片,正好之前本人没有写过关于远程证书的笔记,这里要写一篇博文,整理一下远程推送证书的制作流程,尽管如此,本篇博文依然是作者原创 ...
- [转载]Doxygen C++ 注释风格
转载自:http://luchenqun.com/?p=761 做一个C++方面的符合Doxygen的注释文档,备用. 1.头文件根原文件注释.这个我也不知道需要注释什么.能想到的是:谁写的,里面有些 ...
- Kafka入门之生产者消费者测试
目录: kafka启动脚本以及关闭脚本 1. 同一个生产者同一个Topic,两个相同的消费者相同的Group 2. 同一个生产者同一个Topic,两个消费者不同Group 3. 两个生产者同一个Top ...
- 5-1 变量与常量 & 6-1课程总结
变量与常量 常量就是变量定义的的前面加上final final关键字定义常量 新建类FinalDemo 更新常量n的值会报错.常量不可以被修改 常量有个命名规则 一般以大写字母去表示 final in ...
- 使用WebStorm/IDEA上传本地项目到GitHub
在使用 WebStorm/IDEA 上传本地项目到 GitHub 之前,先要做一些相关配置. 以 WebStorm 为例,IDEA 同. 首先打开 WebStorm ,依次点击File -> S ...
- Git之设置对文件名大小写敏感
关键命令 git config core.ignorecase false
- HTML5 中的meter 标签的样式设置
meter { -webkit-appearance: none; position: relative; display: block; margin: 8px auto; width: 100px ...
- 使用js在html文档的任意位置输出内容
<script type="text/javascript">document.write('这里是内容');</script>
- Lightoj1081【500棵线段树维护】
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=5e2+10; const ...
- Ubuntu终端查看系统时间,以及日历
时间: date 日历: cal https://blog.csdn.net/zhengchaooo/article/details/79500032 修改时区以及时间 查看时区 date -R 修 ...