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上原题略有不同。
【来源】
嗯嗯嗯 这一题需要树链剖分+线段树来解决
首先操作一: 单点修改
那这是线段树的基本操作啦 肯定是非常简单的啦 就不再多赘述了
操作二:区间修改 。。。 那肯定是打标记啦 为什么要用到打标记呢(自己想去!) 然后打标记要记录什么???
我想的是 一开始标记都是1
然后如果把区间变成相反数的话 那么(我猜很简单) 就乘上一个-1 不停地乘-1 然后下放下标的时候再乘一下子就行啦~
(<<看起来很简单的样子 只是看起来而已)
操作三:求出点a到点b路径上的最大值。。!??
这里我用的是树链剖分(这样子可以直接用LCA 顺便记录一下区间的最大值和最小值 在操作二中每次变成相反数 就把最大值变成最小值的相反数 最小值变成最大值的相反数)
嗯嗯 敲一敲试试吧
(很显然现在我没有时间做啦)