题目描述:给出一棵 \(n\) 个点的树,点有颜色 \(C_i\),长度为 \(m\) 的数组 \(V\) 和长度为 \(n\) 的数组 \(W\)。有两种操作:

  1. 将 \(C_x\) 修改为 \(y\)。

  2. 求 \(u\) 到 \(v\) 的链的 \(\sum\limits_{i=1}^m\sum\limits_{j=1}^{cnt_i}W_j\),其中 \(cnt_i\) 表示颜色 \(i\) 的出现次数。

数据范围:\(n,m\le 10^5,1\le C_i\le m\),时限6s(洛谷)或8s(UOJ)。


这是树上带修莫队的模板题。

首先我们看树分块怎么做,所以要来先做这道题

直接讲做法了:我们是尽可能在底层把大小 \(\ge B\) 的联通块作为一块,剩下的扔给父亲合并。就是要开一个stack,维护当前还没有被分块的点。不停递归儿子,一旦已经有一个 \(\ge B\) 的连通块了,就把它们作为一块,设首都为 \(x\)(当前dfs的点)。最后把 \(x\) 放进栈中。最后递归完还要把栈中剩下的点放入最后一个块,并把首都设为 \(1\)。

inline void dfs(int x, int f){
int t = top;
for(Rint i = head[x];i;i = nxt[i])
if(to[i] != f){
dfs(to[i], x);
if(top >= t + B){
rt[++ num] = x;
while(top > t) in[stk[top --]] = num;
}
}
stk[++ top] = x;
}
int main(){
// ...
dfs(1, 0);
if(!num) num = 1;
rt[num] = 1;
while(top) in[stk[top --]] = num;
// ...
}

我们知道没有合并,即大小 \(<B\),合并之后 \(<2B\)。就算最后一个连通块也至多有 \(<3B\),所以是比较均匀的。

然后我们看看如何从链 \((u,v)\) 变为 \((u',v')\) 并且时间复杂度为 \(O(\text{len}(u,u')+\text{len}(v,v'))\)。

首先我们改为维护 \((u,v)\) 中抠掉 \(lca\) 的答案,\(cnt\) 和每个点是否在里面的 \(vis\)。设 \(L(u,v)\) 为 \(u\) 到 \(v\) 这条链上抠掉 \(lca\) 的点集,\(\oplus\) 为集合对称差(\(A\oplus B=(A\cup B)-(A\cap B)\)),\(S(u)\) 为 \(1\) 到 \(u\) 的这条链的点集。则 \(L(u,v)=S(u)\oplus S(v)\),且集合对称差肯定是有交换、结合律的。

\[\begin{aligned}
L(u',v')&=L(u',v')\oplus L(u,v)\oplus L(u,v) \\
&=S(u')\oplus S(v')\oplus S(u)\oplus S(v)\oplus S(u) \oplus S(v) \\
&=(S(u')\oplus S(u))\oplus(S(v)\oplus S(v'))\oplus(S(u)\oplus S(v)) \\
&=L(u,u')\oplus L(v,v')\oplus L(u,v)
\end{aligned}
\]

于是就直接是将 \(L(u,u')\) 和 \(L(v,v')\) 全部 \(vis\) 取反就是 \(L(u',v')\),然后把 \(lca\) 取反就是 \(u'\) 到 \(v'\) 这条链。

至于带修莫队怎么做,就去看这道题。取 \(B\) 比 \(n^\frac{2}{3}\) 少一点点就可以,时间复杂度 \(O(n^\frac{5}{3}+n\log n)\)。

code

```cpp
#include
#define Rint register int
using namespace std;
typedef long long LL;
const int N = 100003;
int n, m, B, q, ql, qr, qnow, qnum, cnum, V[N], W[N], C[N], head[N], to[N siz[wson[x]]) wson[x] = to[i];
if(tp >= tmp + B){
++ bnum;
while(tp > tmp) bel[stk[tp --]] = bnum;
}
}
stk[++ tp] = x;
}
inline void dfs2(int x, int topf){
top[x] = topf;
if(wson[x]) dfs2(wson[x], topf);
for(Rint i = head[x];i;i = nxt[i])
if(to[i] != wson[x] && to[i] != fa[x])
dfs2(to[i], to[i]);
}
inline int lca(int u, int v){
while(top[u] != top[v]){
if(dep[top[u]] dep[v]){work(u); u = fa[u];}
while(u != v){work(u); u = fa[u]; work(v); v = fa[v];}
}
inline void change(int i){
int u = cha[i].u;
if(vis[u]){
work(u); swap(C[u], cha[i].val); work(u);
} else swap(C[u], cha[i].val);
}
int main(){
scanf("%d%d%d", &n, &m, &q); B = pow(n, 2.0 / 3);
for(Rint i = 1;i que[i].tim) change(qnow --);
int LCA = lca(tl, tr);
work(LCA); ans[que[i].id] = qans; work(LCA);
}
for(Rint i = 1;i

LG4074【WC2013】糖果公园 【树上莫队,带修莫队】的更多相关文章

  1. BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...

  2. BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)

    题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...

  3. luogu4074 [WC2013]糖果公园(树上带修莫队)

    link 题目大意:给一个树,树上每个点都有一种颜色,每个颜色都有一个收益 每次修改一个点上的颜色 或询问一条链上所有颜色第i次遇到颜色j可以获得w[i]*v[j]的价值,求链上价值和 题解:树上带修 ...

  4. LUOGU P4074 [WC2013]糖果公园 (树上带修莫队)

    传送门 解题思路 树上带修莫队,搞了两天..终于开O2+卡常大法贴边过了...bzoj上跑了183s..其实就是把树上莫队和带修莫队结合到一起,首先求出括号序,就是进一次出一次那种的,然后如果求两个点 ...

  5. BZOJ2120 数颜色 莫队 带修莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html 题目传送门 - BZOJ2120 题意 给定一个长度为 $n$ 的序列 $a$ ,有 ...

  6. P4074 [WC2013]糖果公园 树上莫队带修改

    题目链接 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 nn 个游览点构 ...

  7. BZOJ3052:[WC2013]糖果公园(树上莫队)

    Description Input Output Sample Input 4 3 51 9 27 6 5 12 33 13 41 2 3 21 1 21 4 20 2 11 1 21 4 2 Sam ...

  8. BZOJ 3052: [wc2013]糖果公园 | 树上莫队

    题目: UOJ也能评测 题解 请看代码 #include<cstdio> #include<algorithm> #include<cstring> #includ ...

  9. 【Luogu P4074】[WC2013]糖果公园(树上带修改莫队)

    题目描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 \(n\) 个游 ...

随机推荐

  1. python 2.django的镜像安装与第一次项目创建-运行以及app创建

    django的设计模式 Django是一个遵循MVC设计模式的框架,MVC是Model.View.Controller的三个单词的简写.分别代表模型.视图.控制器. 而Django也是是一个MTV的设 ...

  2. react性能优化要点

    1.减少render方法的调用 1.1继承React.PureComponent(会自动在内部使用shouldComponentUpdate方法对state或props进行浅比较.)或在继承自Reac ...

  3. CSS-服务器端字体笔记

    服务器端字体 在CSS3中可以使用@font-face属性来利用服务器端字体. @font-face 属性的使用方法:  @font-face{ font-family:webFont; src:ur ...

  4. kali安装结束重启黑屏?

    很多人碰到过kali在安装结束后自动重启,屏幕黑屏就显示一个光标. 解决办法: 安装最后一步,不要选择默认项 Enter device manually 改选第二项.....具体什么忘记了. 即可解决 ...

  5. weblogic unable to get file lock问题

    非正常结束weblogic进程导致weblogic无法启动 由于先前服务器直接down掉了,所有进程都非正常的进行关闭了,也就导致了下次启动weblogic的时候报了以下错误: <2012-3- ...

  6. Java 单例类

    单例类:该类只能创建一个实例,或者说内存中只有一个实例,该类的对象引用的都是这个实例. 示例: package my_package; //定义一个单例类 class Singleton{ //使用一 ...

  7. iOS学习——iOS项目增加新的字体

    基本思路 在项目开发过程中,iOS系统自带的字体库可能不适应需求,需要导入其他的字体库.下面是iOS项目增加新的字体的基本思路,基本上分为三步: 将字体库添加到项目中 在info.plist中添加所需 ...

  8. 图说jdk1.8新特性(4)--- stream

    总述 jdk1.8引入了Stream相关的API,通过该API.可以实现流式编程,使你写代码的时候行云流水 Stream使得集合的转换变得更加简单,原来可能需要写多个for循环或者多个if判断的,直接 ...

  9. intellij IDEA github clone 指定分支代码

    1.问题描述 在实际开发中,我们通常会使用idea克隆一个新项目(clone),通常情况下,我们默认克隆的是master分支,但是如果master分支只是一个空文件夹而已,真正的代码在develop分 ...

  10. 折叠面板实现,上传文件进度条,三级联选择器,多级联选择器, 利用layui实现

    首先贴出html代码 <form class="layui-form" action=""> <div class="layui-f ...