传送门: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. 设置批量商品优惠、如何修改ZenCart产品显示图片的大小

    利用下面的方法,可以实现: 买一送一.买一件第二件5折.买三件优惠10%等功能. 管理页面 - 商品管理 - 价格管理 - (选择商品) - 编辑 - 添加空白折扣. 应用上面的办法,能够完成:买一送 ...

  2. Android Studio ADB响应失败解决方法(2CTo.com)

    当启动Android Studio时,如果弹出 adb not responding. you can wait more,or kill "adb.exe" process ma ...

  3. Windows Server 2003 下如何安装及配置 FTP 服务器(转)

    Windows Server 2003 下如何安装及配置 FTP 服务器 一.安装 FTP 服务器组件: 写在这里的一点 : 安装及配置 FTP 服务器之前 , 必须先手工配置服务器本身的 IP 地址 ...

  4. TCP/IP网络协议栈(转载)

    原文:http://www.cnblogs.com/xuanku/p/tcpip.html TCP/IP网络协议栈分为四层, 从下至上依次是: 链路层 其实在链路层下面还有物理层, 指的是电信号的传输 ...

  5. 获取map中的一个value值以及遍历map获得map里所有key、value的值

    前言: 1.声明一个map: Map map = new HashMap();2.向map中放值,注意:map是key-value的形式存放的.如: map.put(”sa”,”dd”); 3.从ma ...

  6. Smarty模版

    smarty.inc.php <?php //创建一个实际路径 define('ROOT_PATH',dirname(__FILE__)); //引入Smarty require ROOT_PA ...

  7. (转)java判断string变量是否是数字的六种方法小结

    java判断string变量是否是数字的六种方法小结 (2012-10-17 17:00:17) 转载▼ 标签: it 分类: 转发 1.用JAVA自带的函数 public static boolea ...

  8. cc2530 T3定时器控制引脚P1_1的亮灭

    /**************************************************************************** * 文 件 名: main.c * 作 者: ...

  9. USACO Section 1.2 Name That Number 解题报告

    题目 题目描述 在一个农场里面,每一头牛都有一个数字编号,但是现在这些牛不喜欢这种编号,它们想把这些数字编号转化成为可以接受的字母的形式.数字与字母的转换表如下: 2: A,B,C 5: J,K,L ...

  10. Django之路: 模版篇

    一.Django 模版  上章是介绍简单的把django.http.HttpResponse的内容显示到网页上,下面就介绍以下如何使用渲染模版的方法来显示内容.本节代码是基于Django 1.8,但 ...