树(弱化版)(lca)
3306: 树
时间限制: 10 Sec 内存限制: 256 MB
题目描述
给定一棵大小为 n 的有根点权树,支持以下操作:
• 换根
• 修改点权
• 查询子树最小值
输入
第一行两个整数 n, Q ,分别表示树的大小和操作数。
接下来n行,每行两个整数f,v,第i+1行的两个数表示点i的父亲和点i的权。保证f < i。如 果f = 0,那么i为根。输入数据保证只有i = 1时,f = 0。
接下来 m 行,为以下格式中的一种:
• V x y表示把点x的权改为y
• E x 表示把有根树的根改为点 x
• Q x 表示查询点 x 的子树最小值
输出
对于每个 Q ,输出子树最小值。
样例输入
0 1
1 2
1 3
Q 1
V 1 6
Q 1
V 2 5
Q 1
V 3 4
Q 1
样例输出
2
3
4
提示
对于 100% 的数据:n, Q ≤ 10^5。
思路:
看到这个题时,有没有脑子里一下子蹦出这样一个念头:这个题用线段树做!
对,的确是这样。但有人又要问了:线段树怎么用?
碍于各种原因,我们在这先不说线段树的做法,到后卖弄我们开始学线段树的时候,我们再来用线段树A这道题。
我们在前面一直在刷lca题嘛,所以我们把这道题弱化一下:只有换根和查询最小值的操作。
那这样有没有感觉这个题变简单了很多啊?
好,那我们就来秒一下这个题吧!
具体思路:我们考虑这样一个问题:若果没有换跟操作,那我们是不是就可以用一遍dfs求出这道题了?
那我们接下来考虑根节点s与查询节点x的关系。
如果:lca(s,x)!=x,那答案就是以x为根的子树的最小值
若s==x,那x即为最小值。
若lca(x,s)==x,那答案就是除去点x包含点s的子数的最小值。
前两种情况可以预先处理前缀和后缀。
由于一个子树在dfs序上对应的是一段区间,那这样剩下的部分是不是就是一段的前缀+一段后缀啊?!
所以我们优先处理前缀后缀的最小值来解决问题。
代码:
#include<vector>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 1000
using namespace std;
vector<int>vec[N];
int fa[N][N],A[N],B[N];
int deep[N],C[N],en[N],cnt,a[N];
int n,m,top[N],ans,dfn[N],st[N],x,y;
string s;
int lca(int x,int y)
{
if(deep[x]>deep[y])
swap(x,y);
;i>=;i--)
if(deep[fa[y][i]]>=deep[x]) y=fa[y][i];
if(x==y) return x;
;i>=;i--)
if(fa[y][i]!=fa[x][i])
x=fa[x][i],y=fa[y][i];
];
}
void dfs(int x)
{
st[x]=++cnt;
dfn[cnt]=x;
C[x]=a[x];
;i<vec[x].size();i++)
{
deep[vec[x][i]]=deep[x]+;
dfs(vec[x][i]);
C[x]=min(C[x],C[vec[x][i]]);
}
en[x]=cnt;
}
int main()
{
scanf("%d%d",&n,&m);
;i<=n;i++)
{
scanf(],&a[i]);
vec[fa[i][]].push_back(i);
}
]=;dfs(S);
A[]=B[n+]=1e9;
;i<=n;i++)
A[i]=min(A[i-],a[dfn[i]]);
;i--)
B[i]=min(B[i+],a[dfn[i]]);
int T,t;
;i<=m;i++)
{
cin>>s;
]=='E') scanf("%d",&S);
else
{
scanf("%d",&T);
t=lca(S,T);
]);
else if(t!=T) printf("%d\n",C[T]);
else
{
int ss=S;
;i>=;i--)
if(deep[fa[ss][i]]>deep[T]) ss=fa[ss][i];
printf(],B[en[ss]+]));
}
}
}
;
}
树(弱化版)(lca)的更多相关文章
- 洛谷P1569属牛的抗议 超级强力无敌弱化版
P1569 [USACO11FEB]属牛的抗议Generic Cow Prote- 题目描述 约翰家的N头奶牛聚集在一起,排成一列,正在进行一项抗议活动.第i头奶牛的理智度 为Ai,Ai可能是负数.约 ...
- 「杂烩」精灵魔法(P1908逆序对弱化版)
「杂烩」精灵魔法(P1908逆序对弱化版) 题面: 题目描述 \(Tristan\)解决了英灵殿的守卫安排后,便到达了静谧的精灵领地--\(Alfheim\) .由于$ Midgard$ 处在$ Al ...
- 【转】线段树完全版~by NotOnlySuccess
线段树完全版 ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...
- 最短路径 SPFA P3371 【模板】单源最短路径(弱化版)
P3371 [模板]单源最短路径(弱化版) SPFA算法: SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复 ...
- 素数定理π(n)~n/lnn弱化版证明
在大半年前写的Miller-Rabin素数测试正确性证明中使用过此结论~当时完全不会证,现在进步了一点点会证弱化版的了Orz 完整版的素数定理: π(n):=|{p|p<=n,p是素数}| li ...
- SPOJ 10628 COT - Count on a tree(在树上建立主席树)(LCA)
COT - Count on a tree #tree You are given a tree with N nodes.The tree nodes are numbered from 1 to ...
- 洛谷 P3371 【模板】单源最短路径(弱化版) 题解
P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...
- Bzoj 2588 Spoj 10628. Count on a tree(树链剖分LCA+主席树)
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MB Description 给定一棵N个节点的树,每个点 ...
- 【BZOJ-4082】Surveillance 树链剖分 LCA + 贪心
4082: [Wf2014]Surveillance Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 260 Solved: 100[Submit][ ...
随机推荐
- laravel连接数据库提示mysql_connect() :Connection refused...
在.env配置文件中填写了正确的数据库连接配置的情况下连接还是出错了,明显提示的不是密码错误,那就看看端口吧, DB_HOST=127.0.0.1 DB_PORT= DB_DATABASE=test ...
- 七周成为数据分析师06_MySQL
关于 MySQL 的知识,主要也是一些实操和练习. 因为个人之前已经专门练习过 MySQL 操作,这里就不做笔记,之后另写一篇博文记录 MySQL 知识. 同时附上本课程对应的文字教程: 如何七周成为 ...
- Linux学习-什么是进程 (process)
触发 任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个 ID ,称为 PID,同时依据启发这个进程的用户与相关属性关系,给予这个 PID 一组有效的权限设定.从此以后,这 个 PID ...
- UVa 1366 DP Martian Mining
网上的题解几乎都是一样的: d(i, j, 0)表示前i行前j列,第(i, j)个格子向左运输能得到的最大值. d(i, j, 1)是第(i, j)个格子向上运输能得到的最大值. 但是有一个很关键的问 ...
- loj2254 「SNOI2017」一个简单的询问
ref #include <algorithm> #include <iostream> #include <cstdio> #include <cmath& ...
- iOS启动图 LaunchImage LaunchScreen.xib
1.Images.xcassets添加LaunchImage 2.具体大小和添加类别都是可以调的 640*960 (4/4s) 2X ...
- webdriver高级应用- 操作日期控件
1. 通过点击的方式操作日期控件 #encoding=utf-8 from selenium import webdriver import unittest, time, traceback fro ...
- Selenium WebDriver- 使用显示等待,判断搜狗的输入框是否显示,按钮是否可点击,然后在输入光荣之路搜索词,然后在点击搜索。
#encoding=utf-8 from selenium import webdriver import time from selenium.webdriver.common.by import ...
- Leetcode21--->Merge Two Sorted Lists(合并两个排序的单链表)
题目: 给出两个排序的单链表,合并两个单链表,返回合并后的结果: 解题思路: 解法还是很简单的,但是需要注意以下几点: 1. 如果两个链表都空,则返回null; 2. 如果链表1空,则返回链表2的 ...
- Scrum基础知识图谱
啰嗦一下 最近在学习scrum项目管理的知识,书上知识点分散,很难有整体的视角来看scrum有哪些核心知识,故制作了思维导图,望给和我一样容易迷失的人一样,起到一个指引作用,废话不多说,直接上图 图谱