【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) 最近 ...
随机推荐
- neutron网络服务
一.neutron 介绍: 1. Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需 ...
- Centos 6.5 磁盘修复 破解删除root密码
起因:由于存储设备故障.导致虚拟机断开.恢复后虚拟机无法启动,发现报磁盘损坏,需要运行fsck运行 问题解决思路: 1.虚拟机无法启动,所以需要进入系统进行修复 2.root密码是自动修改的.由于虚拟 ...
- yum本地源和网络源的配置
一.yum本地源 1. 删除YUM库[root@tianyun ~]# rm -rf /etc/yum.repos.d/* 2.挂载安装光盘(临时):[root@tianyun ~]# m ...
- echarts图标使用(一)
var data = []; // Parametric curve // for (var t = 0; t < 25; t += 0.001) { // var x = (1 + 0.25 ...
- poj2186--tarjan+缩点(有向图的强连通分量中点的个数)
题目大意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也 ...
- Win10下编译OpenJDK8
导航目录 Win10下编译OpenJDK8 相关参考文章 编译环境 编译前准备 1.安装 Visual Studio 2010 Professional 2. 准备OpenJDK8 3. 编译JDK环 ...
- [Vue] vue的一些面试题4
1.你知道 nextTick 的原理吗? 用法:在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 异步更新队列提到 DOM 的更新是异步执行的,只要 ...
- [Vue] vue的一些面试题
1.v-model 的原理 v-model 是一个语法糖,它即可以支持原生表单元素,也可以支持自定义组件.v-model 在内部为不同的输入元素使用不同的属性并抛出不同的事件. text 和 text ...
- 如何在一个线程环境中使用一个线程非安全的java类
在开发过程中 当我们拿到一个线程非安全的java类的时候,我们可以额外创建这个类的管理类 并在管理类中控制同步 比如 一个非线程安全的Pair类 package test.thread.sx.test ...
- [转载]如何通过ssh进行上传/下载
[转载]如何通过ssh进行上传/下载 学校给配了服务器的用户账号,但是怎么向服务器中上传以及下载文件呢?Windows下可以使用Xftp和Xshell,但是Linux下能不能用命令行解决呢? 什么是S ...