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的方 ...
随机推荐
- <正则吃饺子> :关于前端往后端传递布尔值参数的问题
问题是在一个群里看到的,通过自己查找和实验,参考网上的博文,将问题列出来.以帮助后来者和共同交流学习. 博文地址:http://blog.sina.com.cn/s/blog_13c30757a0 ...
- Invalid content was found starting with element 'mvc:exclude-mapping'.
问题?Invalid content was found starting with element 'mvc:exclude-mapping'. 这是springmvc中显著的错误,在配置拦截器的时 ...
- WebService完成文件上传下载
由于开发需要使用webservice,第一个接触的工具叫axis2.项目开发相关jar下载. service端: 启动类: import java.net.InetAddress; import ja ...
- Spring的自学之路之入门
认识Spring Spring是分层的Java SE/EE 应用一站式的轻量级开源框架,以Ioc(Inverse of Control,控制反转)和AOP(Aspect Oriented Progra ...
- sql server 2008 R2 升级与安装遇到的问题
因工作需要,遂把以前的2008升级到r2,升级失败,具体原因忘了,卸载2008,清了注册表删了文件,结果安装的时候失败了,如下图: 下一步-有错误日志和错误的序列号,错误日志在C:\Program F ...
- lightoj1063【求割点】
题意不懂啊...... 只知道求割点. #include <bits/stdc++.h> using namespace std; typedef long long LL; typede ...
- lightoj1010【LCS】
题意: 求最长公共子序列,并且这个子序列是字典序最小. 思路: LCS附一个值,dp[i][j].first代表以i,j的LCS的长度,dp[i][j].second代表LCS结尾元素,然后利用路径输 ...
- Image.resize()和Image.thumbnail()的区别
Image.resize()和Image.thumbnail()的区别 根据代码和代码注释, 这两个函数都是对图片进行缩放, 两者的主要区别如下: resize()函数会返回一个Image对象, th ...
- JS异常捕获和抛出
try...catch 用来异常捕获(主要适用于IE5以上内核的浏览器,也是最常用的异常捕获方式) 使用onerror时间捕获异常,这种捕获方式是比较古老的一中方式,目前一些主流的浏览器暂不支持这种 ...
- python 基础(三) 程序基本流程
流程控制 流程结构分为3种 顺序结构 分支结构 循环结构 一 分支结构 (1) 单一条件分支 主体结构: if 条件表达式: #为真得代码块 (2) 双向条件分支 主体结构: if 条件表达 ...