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 ,输出子树最小值。

样例输入

3 7
0 1
1 2
1 3
Q 1
V 1 6
Q 1
V 2 5
Q 1
V 3 4
Q 1

样例输出

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)的更多相关文章

  1. 洛谷P1569属牛的抗议 超级强力无敌弱化版

    P1569 [USACO11FEB]属牛的抗议Generic Cow Prote- 题目描述 约翰家的N头奶牛聚集在一起,排成一列,正在进行一项抗议活动.第i头奶牛的理智度 为Ai,Ai可能是负数.约 ...

  2. 「杂烩」精灵魔法(P1908逆序对弱化版)

    「杂烩」精灵魔法(P1908逆序对弱化版) 题面: 题目描述 \(Tristan\)解决了英灵殿的守卫安排后,便到达了静谧的精灵领地--\(Alfheim\) .由于$ Midgard$ 处在$ Al ...

  3. 【转】线段树完全版~by NotOnlySuccess

    线段树完全版  ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...

  4. 最短路径 SPFA P3371 【模板】单源最短路径(弱化版)

    P3371 [模板]单源最短路径(弱化版) SPFA算法: SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复 ...

  5. 素数定理π(n)~n/lnn弱化版证明

    在大半年前写的Miller-Rabin素数测试正确性证明中使用过此结论~当时完全不会证,现在进步了一点点会证弱化版的了Orz 完整版的素数定理: π(n):=|{p|p<=n,p是素数}| li ...

  6. 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 ...

  7. 洛谷 P3371 【模板】单源最短路径(弱化版) 题解

    P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...

  8. 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个节点的树,每个点 ...

  9. 【BZOJ-4082】Surveillance 树链剖分 LCA + 贪心

    4082: [Wf2014]Surveillance Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 260  Solved: 100[Submit][ ...

随机推荐

  1. 解决linux不能解压rar格式压缩包

    1download rarlinux-x64-5.3.0.tar.gz data package 2.tar xvf rarlinux-64-5.3.0.tar.gz 3. cd rar and th ...

  2. html5音频audio对象封装成vue组件的方式调用以及setTimeout如何在vue2生效 (vue2正在熟悉中,ajax还是用jQuery来写舒服些,里面含有一些php写法可略过) 此网页应用在PC不考虑手机端

    // vue2 组件封装如下: <template> <div> <div><!--vue element 组件的引用 Switch 开关 不懂请自行百度(重 ...

  3. JAVA基础篇—Servlet小结

    一.get请求和post请求的区别: 1.get请求是通过url传递参数,post请求是通过请求体传递参数的 2.get请求最多允许传递255个字符,对长度有限制,所以数据比较大的时候我们使用post ...

  4. NTC温度采集之数据拟合——freemat软件实现

    在stm32温度采样的过程中,使用到了NTC传感器,上拉接6.2K的电阻,信号给AD采样端口,通过NTC的电阻阻值表中,计算得到下面两端数据,在freemat中实现数据拟合,用于程序中温度和电压信号的 ...

  5. ACM 深度优化搜索算法小总结

    深度优化搜索算法的本质:就是从一状态不断转移,如果无法转移了就需要返回上一个状态,知道找到解为止. 其核心:递归函数 基本模型: dfs(int i, int j) { //控制结束条件 //进行状态 ...

  6. 卸载firefox多余的搜索引擎

    火狐默认了几个搜索引擎,百度,bing,yahoo等.搜一些技术方面的东西的时候,google返回的结果比这些要准确有用.所以想卸载掉那些不用的. 具体操作: 点击搜索栏,左侧搜索引擎图票右下角的倒三 ...

  7. Android的初步探索之Context类

    最近一直在学安卓,但由于JAVA的能力有限,学起应用开发来很吃力,众多错综复杂的类和界面组件弄的人焦头烂额,往往不知从何下手.... 各种名字冗长的方法和常量,没有任何界面编程的经验真是蛋疼死了.总是 ...

  8. UVa 465 Overflow——WA

    上次那个大数开方的高精度的题,UVa113 Power of Cryptography,直接两个double变量,然后pow(x, 1 / n)就A过去了. 怎么感觉UVa上高精度的题测试数据不给力啊 ...

  9. luogu3381 【模板】最小费用最大流

    每次选代价最小的流增广 #include <iostream> #include <cstring> #include <cstdio> #include < ...

  10. Flask_单例模式

    在flask实现单例模式的方法有多种: 这里我们列举五种,行吗? 第一种: 国际惯例:基于文件导入 第二种: 基于类的单例模式: 它又分两种: 一种加锁,一种不加锁. 不加锁的话,可以并发,但是我们的 ...