树上莫队的基本思路是把树按dfs序分块,然后先按x所在块从小到大排序,再按y所在块从小到大排序,处理询问即可。

这道题带修改,再加一个时间维即可。

设块大小为T,那么时间复杂度为$O(nT+\frac{n^3}{T^2})$,当$T=n^\frac23$时,时间复杂度最优,为$n^\frac53$.

但是实际测试中,取$T=n^\frac23*0.5$跑得比较快,还有询问中如果x所在块大于y所在块,就交换x,y,也可以加快速度。

在BZOJ上卡了两波评测机,BZOJ差点崩了..

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std; typedef long long ll;
const int N=,M=;
int n,m,q,B,e,x,y,op,tt,t1,t2,tp,bl[N],st[N],v[N],w[N],a[N],_a[N],vs[N],g[N],f[N][],hd[N],d[N],nx[M],to[M];
ll aa,a1[N];
struct nd {
int x,y,t,id;
bool operator < (const nd &r) const {
return bl[x]==bl[r.x]?bl[y]==bl[r.y]?t<r.t:bl[y]<bl[r.y]:bl[x]<bl[r.x];
}
}b[N];
struct nd2 {int x,y,ls;}c[N];
void ad(int x,int y) {to[++e]=y,nx[e]=hd[x],hd[x]=e;}
int rd() {
int r=,c=getchar();
while(c<''||c>'') c=getchar();
while(c>=''&&c<='') r=r*+c-'',c=getchar();
return r;
} void dfs(int x) {
st[++tp]=x;
if(tp==B) {tt++; while(tp) bl[st[tp--]]=tt;}
for(int i=hd[x];i;i=nx[i]) if(!d[to[i]]) d[to[i]]=d[x]+,f[to[i]][]=x,dfs(to[i]);
}
int lca(int x,int y) {
if(d[x]<d[y]) swap(x,y);
for(int i=;~i;i--) if(d[f[x][i]]>=d[y]) x=f[x][i];
if(x==y) return x;
for(int i=;~i;i--) if(f[x][i]^f[y][i]) x=f[x][i],y=f[y][i];
return f[x][];
} void rv(int x) {
vs[x]^=;
if(vs[x]) aa+=(ll)v[a[x]]*w[++g[a[x]]]; else aa-=(ll)v[a[x]]*w[g[a[x]]--];
}
void gai(int x,int y) {if(vs[x]) rv(x),a[x]=y,rv(x); else a[x]=y;}
void rv(int x,int y) {
while(x^y) {
if(d[x]<d[y]) swap(x,y);
rv(x),x=f[x][];
}
} int main() {
scanf("%d%d%d",&n,&m,&q),B=pow(n,2.0/)*0.5;
for(int i=;i<=m;i++) v[i]=rd();
for(int i=;i<=n;i++) w[i]=rd();
for(int i=;i<n;i++) x=rd(),y=rd(),ad(x,y),ad(y,x);
for(int i=;i<=n;i++) a[i]=rd(),_a[i]=a[i];
d[]=,dfs(),tt++;
while(tp) bl[st[tp--]]=tt;
for(int j=;j<;j++)
for(int i=;i<=n;i++)
f[i][j]=f[f[i][j-]][j-];
for(int i=;i<=q;i++) {
op=rd(),x=rd(),y=rd();
if(op) {
if(bl[x]>bl[y]) swap(x,y);
b[++t1].x=x,b[t1].y=y,b[t1].t=t2,b[t1].id=t1;
}
else c[++t2].x=x,c[t2].y=y,c[t2].ls=_a[x],_a[x]=y;
}
sort(b+,b++t1),b[].x=b[].y=;
for(int i=,t=,k;i<=t1;i++) {
while(t<b[i].t) t++,gai(c[t].x,c[t].y);
while(t>b[i].t) gai(c[t].x,c[t].ls),t--;
rv(b[i].x,b[i-].x),rv(b[i].y,b[i-].y),rv(k=lca(b[i].x,b[i].y)),a1[b[i].id]=aa,rv(k);
}
for(int i=;i<=t1;i++) printf("%lld\n",a1[i]);
return ;
}

BZOJ3052(树上带修莫队)的更多相关文章

  1. 【BZOJ-3052】糖果公园 树上带修莫队算法

    3052: [wc2013]糖果公园 Time Limit: 200 Sec  Memory Limit: 512 MBSubmit: 883  Solved: 419[Submit][Status] ...

  2. BZOJ3052: [wc2013]糖果公园【树上带修莫队】

    Description Input Output Sample Input Sample Input Sample Output 84 131 27 84 HINT 思路 非常模板的树上带修莫队 真的 ...

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

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

  4. BZOJ 4129 Haruna’s Breakfast ( 树上带修莫队 )

    题面 求树上某路径上最小的没出现过的权值,有单点修改 添加链接描述 分析 树上带修莫队板题,问题是怎么求最小的没出现过的权值. 因为只有nnn个点,所以没出现过的最小值一定在[0,n][0,n][0, ...

  5. BZOJ 3052/Luogu P4074 [wc2013]糖果公园 (树上带修莫队)

    题面 中文题面,难得解释了 BZOJ传送门 Luogu传送门 分析 树上带修莫队板子题... 开始没给分块大小赋初值T了好一会... CODE #include <bits/stdc++.h&g ...

  6. bzoj4129 Haruna’s Breakfast 树上带修莫队+分块

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4129 题解 考虑没有修改的序列上的版本应该怎么做: 弱化的题目应该是这样的: 给定一个序列,每 ...

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

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

  8. BZOJ 3052 树上带修莫队

    思路: 就是把带修莫队移到了树上 块的大小开到(n^2/3)/2 比较好- 这是一个卡OJ好题 //By SiriusRen #include <cmath> #include <c ...

  9. BZOJ 4129 树上带修莫队+线段树

    思路: 可以先做做BZOJ3585 是序列上的mex 考虑莫队的转移 如果当前数字出现过 线段树上把它置成1 对于询问 二分ans 线段树上查 0到ans的和 是不是ans+1 本题就是把它搞到了序列 ...

随机推荐

  1. 如何用tomcat实现类似weblogic那样的热部署方式

    平时weblogic部署程序包时一般是到控制台去部署,不需要重启. 相反之前用tomcat部署应用时,我一般都是把tomcat重启来完成程序包的更新或新包部署.但是这次要部署的应用有点多,大概10几个 ...

  2. NOIP2012 提高组 Day 2

    http://www.cogs.pro/cogs/page/page.php?aid=16 期望得分:100+100+0=0 实际得分:100+20+0=120 T2线段树标记下传出错 T1 同余方程 ...

  3. vue的简单tab

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  4. raid5 / raid5e / raid5ee的性能对比及其数据恢复原理

    RAID 5 是一种存储性能.数据安全和存储成本兼顾的存储解决方案. RAID 5可以理解为是RAID 0和RAID 1的折中方案.RAID 5可以为系统提供数据安全保障,但保障程度要比Mirror低 ...

  5. Something about SeekingJob---TelInterview(电话面试)

    昨天和今天分别收到两次电话面试,有一点小小感悟,遂注之. 作为一枚还未毕业的大三狗来说,我在想,找个实习真的是西天取金,必定要先经历九九八十一难吗(伤心)?所以在这里整理了电话面试遇到的问题: 集合框 ...

  6. N阶台阶问题(详解)

    原创 问题描述: 有N阶台阶,每一步可以走1步台阶或者2步台阶,求出走到第N阶台阶的方法数. 解题思路: 类似于建立树的过程 1 2 1 2   1 2  1        2      1    2 ...

  7. C# 使用 GDI+ 画图

    最近做一个微信公众号服务,有一些简单的图片处理功能.主要就是用户在页面操作,前端做一些立刻显示的效果,然后提交保存时后端真正修改原图. 我们的后端是 ASP.NET,也就是 C# 语言了,C# 本身处 ...

  8. docker安装+测试环境的搭建---

    漏洞演练环境docker地址:http://vulhub.org/#/environments/ 环境:kali-linux-2017.2-amd64.iso 一.docker安装 1.先更新一波源: ...

  9. 20165226 2017-2018-4 《Java程序设计》第6周学习总结

    20165226 2017-2018-4 <Java程序设计>第6周学习总结 教材学习内容总结 第八章 常用实用类 string类 并置 两个常量进行并置,得到的仍是常量. public ...

  10. linux下mongodb安装、服务器、客户端、备份、账户命令

    在linux环境安装mongoDB: 一般认为偶数版本为稳定版 如 1.6.x,奇数版本为开发版如1.7.x 32bit的mongoDB最大能存放2g的数据,64bit没有限制 方法1: 终端执行: ...