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的方 ...
随机推荐
- Unity3D 开发ios时困扰多时游戏开始画面图片的分辨率
- CNN相关资料
转子http://blog.csdn.net/qianqing13579/article/details/71076261 前言 入职之后,逐渐转到深度学习方向.很早就打算写深度学习相关博客了,但是由 ...
- Flutter实战视频-移动电商-11.首页_屏幕适配方案讲解
11.首页_屏幕适配方案讲解 国人写的屏幕适配插件: https://github.com/OpenFlutter/flutter_screenutil 最新版本是0.5.1 在pubspec.yam ...
- 别用visual editor了,用WindowBuilder
以前利用 Eclipse Visual Editor 项目构建 GUI,现在用WindowBuilder吧. 官网说: The Visual Editor project has been archi ...
- node中的url模块解析结果
1. URL模块作用: url 模块用于处理与解析 URL. 使用方法如下: const url = require('url'); 2. URL 字符串与 URL 对象 URL 字符串是结构化的字符 ...
- MarketServer 日志
2014.04.29 1. 发现有时候会跳出 Exception Infomations: 用户异常信息:Socket未连接 跟踪后发现的一次情况是: 服务器根据客户端请求从后台读取数据后,写数据 ...
- 計蒜課/排澇(Edmond-Karp)
題目鏈接: https://nanti.jisuanke.com/t/36 題意:中文題目誒~ 思路: 最大流模板題.... 關於最大流算法blog: http://www.cnblogs.com/z ...
- [Xcode 实际操作]八、网络与多线程-(14)使用网址会话对象URLSession将地理坐标转换为地名
目录:[Swift]Xcode实际操作 本文将演示如果通过网址会话对象,将地理坐标转换为地名. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的代理模式等优点. 在项目 ...
- 设置上一级controller的backBarButtonItem
设置上一级controller的backBarButtonItem. self.navigationItem.backBarButtonItem= [[UIBarButtonItem alloc]in ...
- day01 包 权限修饰符 static final