• cogs 1583. [POJ 3237] 树的维护 树链剖分套线段树


    1583. [POJ 3237] 树的维护

    ★★★★   输入文件:maintaintree.in   输出文件:maintaintree.out   简单对比
    时间限制:5 s   内存限制:128 MB

    【题目描述】

    给你由N个结点组成的树。树的节点被编号为1到N,边被编号为1到N-1。每一条边有一个权值。然后你要在树上执行一系列指令。指令可以是如下三种之一:

    CHANGE i v:将第i条边的权值改成v。

    NEGATE a b:将点a到点b路径上所有边的权值变成其相反数。

    QUERY a b:找出点a到点b路径上各边的最大权值。

    【输入格式】

    输入文件的第一行有一个整数N(N<=10000)。

    接下来N-1行每行有三个整数a,b,c,代表点a和点b之间有一条权值为c的边。这些边按照其编号从小到大给出。

    接下来是若干条指令(不超过10^5条),都按照上面所说的格式。

    输入文件的最后一行是"DONE".

    【输出格式】

    对每个“QUERY”指令,输出一行,即路径上各边的最大权值。

    【样例输入】

    3

    1 2 1

    2 3 2

    QUERY 1 2

    CHANGE 1 3

    QUERY 1 2

    DONE

    【样例输出】

    1

    3

    【提示】

    这里的输入输出格式和POJ上原题略有不同。

    【来源】

    POJ 3237 Tree'

    嗯嗯嗯 这一题需要树链剖分+线段树来解决

    首先操作一: 单点修改  

    那这是线段树的基本操作啦  肯定是非常简单的啦  就不再多赘述了

     操作二:区间修改 。。。 那肯定是打标记啦  为什么要用到打标记呢(自己想去!)  然后打标记要记录什么???

    我想的是 一开始标记都是1 

    然后如果把区间变成相反数的话   那么(我猜很简单) 就乘上一个-1    不停地乘-1   然后下放下标的时候再乘一下子就行啦~

    (<<看起来很简单的样子 只是看起来而已)

    操作三:求出点a到点b路径上的最大值。。!??

    这里我用的是树链剖分(这样子可以直接用LCA   顺便记录一下区间的最大值和最小值  在操作二中每次变成相反数 就把最大值变成最小值的相反数 最小值变成最大值的相反数)

    嗯嗯  敲一敲试试吧

    (很显然现在我没有时间做啦)

  • 相关阅读:
    Android虚拟机 修改IMEI
    Android 真机调试缺少sqlite3
    DouBan FM API
    MySQL 常用命令[不断更新中]
    通过QRCode生成二维码与解码
    Ant 批量打包Android Umeng多渠道版本
    Centos服务器常用配置集合
    MTU详解
    openvswitch-with-conntrack_nat
    NAT介绍及NAT设备类型
  • 原文地址:https://www.cnblogs.com/Tidoblogs/p/11318158.html
Copyright © 2020-2023  润新知