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的方 ...
随机推荐
- codevs-2235
2235 机票打折 题目描述 Description .输入机票原价(3到4位的正整数,单位:元),再输入机票打折率(小数点后最多一位数字).编程计算打折后机票的实际价格(单位:元.计算结果要将个位数 ...
- python数据分析笔记中panda(1)
1 例子1 from pandas import read_csv; df = read_csv('H://pythonCode//4.1//1.csv') df 截图 1.1 修改表的内容编码 df ...
- SqlServer规则
定义:规则时单独的SQLServer对象,可以关联到一个或几个表中的一列或几列.它可以使用多种方式来完成对数据值的校验,可以使用函数返回验证信息,也可以使用关键字BETWEEN,LIKE和IN完成对输 ...
- SmartSql使用教程(3)——SmartSql中的事务,及AOP的使用
一.引言 经过两章的铺垫,我们现在对SmartSql已经有了一定的了解,那么今天我们的主题是事务处理.事务处理是常用的一种特性,而SmartSql至少提供了两种使用事务的方法.一种是通过Reposit ...
- iOS代码封装成.a文件(封装SDK)
在众多开源的大神的博客里经整理如下:(已测试ok) 一.描述一下 Build ActiveArchitecture Only设置成YES: Architectures按Xcode默认配置,arm64向 ...
- [Xcode 实际操作]九、实用进阶-(22)Storyboard故事板的常用布局结构
目录:[Swift]Xcode实际操作 本文将演示如在使用故事板搭建项目时,常用的一种故事板布局结构. 在项目导航区,打开故事板文件[Main.storyboard] 当前故事板中只有一个视图控制器控 ...
- JAVA团队开发手册 - 3. 开发流程
开发流程 对于一个项目,最大的问题就是如何拆解为任务,分配到合适的人手里,并在有限的时间内完成它. 就像做建筑工程一样,其实做IT也是可以量化的,可能有的人砌砖砌得慢一些,有的人快一些. 但是我们把整 ...
- ShareSDK集成遇到问题
解决方案
- 洛谷 P1578 奶牛浴场
https://www.luogu.org/problemnew/show/P1578 题解 另外这题有一些小坑,洛谷的题解里面有讲 #pragma GCC optimize("Ofast& ...
- 087 Scramble String 扰乱字符串
给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树.下图是字符串s1 = "great"的一种可能的表示形式. great / \ ...