【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) 最近 ...
随机推荐
- Hibernate框架 初识 ORM概念
Hibernate概述 Hibernate是一个ORM(对象关系映射)映射框架,它的核心思想就是在底层对JDBC进行了一次封装. 什么是框架 IT语境中的框架,特指为解决一个开放性问题而设计的具有一定 ...
- nanomsg安装和测试
最近在构建一个中间层的通信架构,本来想用dbus,在实验过程中发现dbus对于国产系统支持版本比较低,安装比较麻烦,今天无意中看中了nanomsg,尽管没有dbus那么强悍的生态,但基本能满足需求. ...
- 【Qt开发】QString与数字类型的转换(不同进制)
把QString转换为 double类型 方法1.QString str="123.45"; double val=str.toDouble(); //val=123.45 方法2 ...
- Angular5 *ngIf 和 hidden 的区别
问题 项目中遇到一个问题,有一个过滤查询的面板,需要通过一个展开折叠的button,来控制它的show 和 hide.这个面板中,有一个Select 组件,一个 input 查询输入框. 原来代码是: ...
- MSF魔鬼训练营-3.1.2信息收集-通过搜索引擎进行信息搜集
1.Google hacking 技术 自动化的Google搜索工具 SiteDigger https://www.mcafee.com/us/downloads/free-tools/sitedig ...
- Spring的核心思想,总结得非常好!
依赖注入是面型接口编程的一种体现,是Spring的核心思想.事实上依赖注入并不是什么高深的技术, 只是被Sping这么以包装就显得有些神秘. 如上代码清单所示,Coder使用Java语言打印hello ...
- RPC架构下org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
一.调用后台接口报错 网上有很多作者列出大部分原因: 1.实体类名对应配置文件名或者路径不一致 2.spring扫描路径不全 但是本人使用的是mtbatis逆向工程生成的实体类.接口与配置文件,所以不 ...
- springBoot2.0使用@ImportResource引入spring配置文件.xml
1. 编写spring配置文件.xml 这里是bean.xml <?xml version="1.0" encoding="UTF-8"?> < ...
- python中对多态和多态性的理解
python中对多态的理解 一.多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等.(一个抽象类有多个子类,因而多态的概念依赖于继承) import abc class Animal( ...
- PHP 模拟http 请求
php 模拟请求类 <?php /** * fangdasheng * http 模拟请求 */ class Myhttp { private $apiUrl; // 构造函数 public f ...