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

Posted Tido

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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   顺便记录一下区间的最大值和最小值  在操作二中每次变成相反数 就把最大值变成最小值的相反数 最小值变成最大值的相反数)

嗯嗯  敲一敲试试吧

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

 

以上是关于cogs 1583. [POJ 3237] 树的维护 树链剖分套线段树的主要内容,如果未能解决你的问题,请参考以下文章

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

[POJ3237]树的维护

POJ 3237 Tree (树链剖分 路径剖分 线段树的lazy标记)

●POJ 3237 Tree

POJ 3237 /// 树链剖分 线段树区间修改(*-1)

POJ3237Tree 树链剖分+线段树