【GDOI2017模拟12.9】最近公共祖先
题目
分析
首先,将这些节点按dfs序建一棵线段树。
因为按dfs序,所以在同一子树上的节点会放在线段树相邻的位置。
发现,对于一个位置x,它的权值只会对以x为根的子树造成影响。
当修改x时,用w[x]更新子树x的最大值,
接着从x向上跳,用w[fa[x]]更新子树fa[x]-子树x最大值,
因为当用w[fa[x]]来更新过子树fa[x]-子树x时,再用它更新就会没有意义,所以打个标记,不再更新。这样就最多只会更新n次。
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
const int N=100005;
using namespace std;
int d[N],aft[N],fa[N],mx[N*10],son[N],size[N],n,m,last[N*2],next[N*2],to[N*2],tot,v1[N],ans,end[N],lazy[N*10];
int bz[N];
int bj(int x,int y)
{
next[++tot]=last[x];
last[x]=tot;
to[tot]=y;
}
int down(int v)
{
if(!lazy[v]) return 0;
lazy[v*2]=max(lazy[v],lazy[v*2]);
lazy[v*2+1]=max(lazy[v],lazy[v*2+1]);
mx[v*2]=max(mx[v*2],lazy[v]);
mx[v*2+1]=max(mx[v*2+1],lazy[v]);
}
int dg(int x)
{
d[++tot]=x;
aft[x]=tot;
for(int i=last[x];i;i=next[i])
{
int j=to[i];
if(j!=fa[x])
{
fa[j]=x;
dg(j);
end[j]=tot;
}
}
}
int change(int v,int l,int r,int x,int y,int z)
{
if(x>y && x && y) return 0;
if(l==x && y==r)
{
mx[v]=max(mx[v],z);
lazy[v]=max(lazy[v],z);
return 0;
}
down(v);
int mid=(l+r)/2;
if(y<=mid) change(v*2,l,mid,x,y,z);
else
if(x>mid) change(v*2+1,mid+1,r,x,y,z);
else change(v*2,l,mid,x,mid,z),change(v*2+1,mid+1,r,mid+1,y,z);
mx[v]=max(mx[v*2],mx[v*2+1]);
}
int find(int v,int l,int r,int x)
{
if(l==r) return mx[v];
down(v);
int mid=(l+r)/2,j;
if(x<=mid) j=find(v*2,l,mid,x);
else j=find(v*2+1,mid+1,r,x);
mx[v]=max(mx[v*2],mx[v*2+1]);
return j;
}
int up(int x)
{
if(!fa[x]) return 0;
change(1,1,tot,max(aft[fa[x]],1),aft[x]-1,v1[fa[x]]);
change(1,1,tot,end[x]+1,end[fa[x]],v1[fa[x]]);
if(!bz[x]) up(fa[x]);
bz[x]=true;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&v1[i]);
for(int i=1;i<=n-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
bj(x,y);
bj(y,x);
}
tot=0;
dg(1);
end[1]=tot;
for(int i=1;i<=m;i++)
{
char c=getchar();
int x;
while(c!='Q' && c!='M') c=getchar();
if(c=='M')
{
scanf("odify %d",&x);
change(1,1,tot,aft[x],end[x],v1[x]);
up(x);
}
else
{
scanf("uery %d",&x);
ans=find(1,1,tot,aft[x]);
printf("%d\n",(ans)?ans:-1);
}
}
}
【GDOI2017模拟12.9】最近公共祖先的更多相关文章
- 【JZOJ4888】【NOIP2016提高A组集训第14场11.12】最近公共祖先
题目描述 YJC最近在学习树的有关知识.今天,他遇到了这么一个概念:最近公共祖先.对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. ...
- jzoj4918. 【GDOI2017模拟12.9】最近公共祖先 (树链剖分+线段树)
题面 题解 首先,点变黑的过程是不可逆的,黑化了就再也洗不白了 其次,对于\(v\)的祖先\(rt\),\(rt\)能用来更新答案当且仅当\(sz_{rt}>sz_{x}\),其中\(sz\)表 ...
- NOIP 模拟 $29\; \rm 最近公共祖先$
题解 \(by\;zj\varphi\) 首先考虑,如果将一个点修改成了黑点,那么它能够造成多少贡献. 它先会对自己的子树中的答案造成 \(w_x\) 的贡献. 考虑祖先时,它会对不包括自己的子树造成 ...
- jzoj4915. 【GDOI2017模拟12.9】最长不下降子序列 (数列)
题面 题解 调了好几个小时啊--话说我考试的时候脑子里到底在想啥-- 首先,这个数列肯定是有循环节的,而且循环节的长度\(T\)不会超过\(D\) 那么就可以把数列分成三份,\(L+S+R\),其中\ ...
- jzoj4916. 【GDOI2017模拟12.9】完全背包问题 (背包+最短路)
题面 题解 考场上蠢了--这么简单的东西都想不到-- 首先排序加去重. 先来考虑一下,形如 \[a_1x_1+a_2x_2+...a_nx_n=w,a_1<a_2<...<a_n,x ...
- [JZOJ4913] 【GDOI2017模拟12.3】告别
题目 描述 题目大意 给你两个排列AAA和BBB,每次随即选三个数进行轮换操作,问mmm次操作内使AAA变成BBB的概率. 思考历程 首先随便搞一下,就变成了AAA中每个数回归自己原位. 一眼望去,感 ...
- 【JZOJ4925】【GDOI2017模拟12.18】稻草人
题目描述 YLOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,YLOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条 ...
- hihocoder #1062 : 最近公共祖先·一(小数据量 map+set模拟+标记检查 *【模板】思路 )
#1062 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在 ...
- Problem A. 最近公共祖先 ———2019.10.12
我亲爱的学姐冒险跑去为我们送正解 但是,,,, 阿龙粗现了! cao,, 考场期望得分:20 实际得分:20 Problem A. 最近公共祖先 (commonants.c/cpp/pas) 最近 ...
随机推荐
- PHP LDA off 解决
搭建完zabbix初始登录zabbix显示 PHP LDAP off 解决 不需要重新编译php 就可以增加 LDAP 模块 .首先进入自己的 PHP 安装目录中找到 ldap 文件夹 [root@b ...
- 【github】git常用命令和node项目
这是之前在本地搞的一个小东西.因为之前电脑经常会很卡.后来发现任务管理器中多了两个不知名的进程:chromgpu.exe和flrefox.exe 乍一看以为和chrome和firefox两个浏览器有关 ...
- GO——beego简单开发实例(二)
在新建项目成功之后我们可以做一个简单的动态增删查改. 1.在models文件夹下新建models.go,根据模型新建表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 ...
- elasticsearch索引大小写的问题
今天用elasticsearch创建索引时碰到一个问题,用大写创建的索引,ES前端插件可以看到用大写创建索引存入的数据 程序启动,搜索的时候,却不显示数据,索引变成了小写,导致数据无法封装传入. 在h ...
- Python 命令行解析模块 —— argparse
argparse是python标准库里面用来处理命令行参数的库,基本使用步骤如下: 1.import argparse 导入模块 2.parser = argparse.ArgumentPars ...
- mnist数据集下载——mnist数据集提供百度网盘下载地址
mnist数据集是由深度学习大神 LeCun等人制作完成的数据集,mnist数据集也常认为是深度学习的“ Hello World!”. 官网:http://yann.lecun.com/exdb/mn ...
- 手把手带你发布Nuget包-图文说话
博客:https://www.cnblogs.com/24klr/
- 使用fiddler 抓包app 网络连接不上的原因
https://blog.csdn.net/m0_37554415/article/details/80434477· 设置完记得关掉fiddler 重启 基于fiddler 4 windown 10 ...
- CAS导致的ABA问题及解决:时间戳原子引用AtomicReference、AtomicStampedReference
1.CAS导致ABA问题: CAS算法实现一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并交换,那么在这个时间差中会导致数据的变化. 比如:线程1从内存位置V中取出A,这时线程2也从V中取出A ...
- 头大!RabbitMQ 和 Kafka 到底怎么选?
前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措. 对于RabbitMQ和Kafka,到底应该选哪个? Rabb ...