较有难度的圆方树+树剖题目
Description
Cyberland 有 n 座城市,编号从 1 到 n,有 m 条双向道路连接这些城市。第 j 条路连接城市 aj 和 bj。每天,都有成千上万的游客来到 Cyberland 游玩。
在每一个城市,都有纪念品售卖,第 i 个城市售价为 wi。这个售价有时会变动。
每一个游客的游览路径都有固定起始城市和终止城市,且不会经过重复的城市。
他们会在路径上的城市中,售价最低的那个城市购买纪念品。
你能求出每一个游客在所有合法的路径中能购买的最低售价是多少吗?
你要处理 q 个操作:
C a w: 表示 a 城市的纪念品售价变成 w。 A a b: 表示有一个游客要从 a 城市到 b 城市,你要回答在所有他的旅行路径中最低售价的最低可能值。
输入格式
第一行包含用一个空格隔开的三个数,n、m、q。
接下来 n 行,每行包含一个数 wi。
接下来 m 行,每行包含用一个空格隔开的两个数 aj, bj。(1≤aj,bj≤n,aj≠bj1≤aj,bj≤n,aj≠bj)
数据保证没有两条道路连接同样一对城市,也没有一条道路两端是相同的城市。并且任意两个城市都可以相互到达。
接下来 q 行,每行是C a w 或 A a b ,描述了一个操作。 输出格式
对于每一个A类操作,输出一行表示对应的答案。
Samples
Input #1
1 | 3 3 3 |
Output #1
1 | 1 |
Input #2
1 | 7 9 4 |
Output #2
1 | 2 |
Solution
看到询问有关维护图上两点之间简单路径信息的操作, 很容易可以想到圆方树.
我们首先建出圆方树, 令方点维护与之相连的圆点的权值最小值, 那么问题可以转化为路径上求最小值.
如果没有修改操作, 那么我们直接对圆方树进行树链剖分, 然后用线段树维护即可.
如果暴力修改点权, 那么需要修改与他相连的所有方点, 显然可以被卡到$\mathcal O(n)$
这时我们就要利用圆方树的性质: 圆方树是棵树(废话), 令方点权值为其儿子圆点的权值最小值, 那么我们直接修改方点即可,
而维护方点的权值, 就直接对于每一个方点维护一个multiset
即可. 注意: 在查询的时候若两个点的LCA是方点, 那么需要查一下其父亲圆点的值.
Code
1 | /* Headers */ |