题链:

http://uoj.ac/problem/58
题解:

树上带修莫队。
每个块的大小为$n^{\frac{2}{3}}$,在dfs时,把点集分为若干块。
然后类似序列带修莫队,三个关键字:bel[u],bel[v],time来排序,

从上一个询问(u,v)更新到新的询问(u',v')时,

首先把时间弄对,

然后再把u->lca(u,u')->u'(不含lca(u,u'))这条链上的点的信息取反(原来不存在,现在就存在;原来存在,现在就存在)。

同样对v->lca(v,v')->v'(不含lca(v,v'))这条链上的点的信息取反。

由于没有考虑到lca(u',v')的贡献,所以加上该lca的后,得到当前询问的答案。

(被洛谷的数据卡的不要不要的,勉强过了UOJ)

代码:

#include<bits/stdc++.h>
#define MAXN 100005
#define rint register int
using namespace std;
long long ans,ANS[MAXN];
int N,M,Qnt,BLOCK,nowU,nowV,nowT;
int candy[MAXN],s[MAXN],V[MAXN],W[MAXN],fa[MAXN][18],bel[MAXN],deep[MAXN],vis[MAXN],now[MAXN];
struct Edge{
int ent;
int to[MAXN*2],nxt[MAXN*2],head[MAXN];
Edge(){ent=2;}
void Adde(int u,int v){
to[ent]=v; nxt[ent]=head[u]; head[u]=ent++;
}
}E;
struct Query{
int u,v,t,id;
bool operator < (const Query &rtm) const{
return bel[u]==bel[rtm.u]?(bel[v]==bel[rtm.v]?t<rtm.t:bel[v]<bel[rtm.v]):bel[u]<bel[rtm.u];
}
}Q[MAXN];
struct Change{int p,nc,oc;}C[MAXN];
void read(int &x){
static int sign; static char ch;
sign=1; x=0; ch=getchar();
for(;ch<'0'||'9'<ch;ch=getchar()) if(ch=='-') sign=-1;
for(;'0'<=ch&&ch<='9';ch=getchar()) x=x*10+ch-'0';
x=x*sign;
}
void dfs(int u){
static int stk[MAXN],top,bnt;
for(rint k=1;k<17;k++)
fa[u][k]=fa[fa[u][k-1]][k-1];
for(rint e=E.head[u];e;e=E.nxt[e]){
int v=E.to[e]; if(v==fa[u][0]) continue;
fa[v][0]=u; deep[v]=deep[u]+1; dfs(v);
if(top>BLOCK){
++bnt;
while(top) bel[stk[top--]]=bnt;
}
}
stk[++top]=u;
if(u==1) while(top) bel[stk[top--]]=bnt;
}
int LCA(int u,int v){
static int d;
if(deep[u]>deep[v]) swap(u,v);
d=deep[v]-deep[u];
for(rint k=16;k>=0;k--)
if(d&(1<<k)) v=fa[v][k];
if(u==v) return u;
for(rint k=16;k>=0;k--)
if(fa[u][k]!=fa[v][k]) u=fa[u][k],v=fa[v][k];
return fa[u][0];
}
void modify(int p){
if(!vis[p]) candy[s[p]]++,ans+=1ll*W[candy[s[p]]]*V[s[p]];
else ans-=1ll*W[candy[s[p]]]*V[s[p]],candy[s[p]]--;
vis[p]^=1;
}
void trans(rint u,rint v){
while(u!=v)
deep[u]>=deep[v]?(modify(u),u=fa[u][0]):(modify(v),v=fa[v][0]);
}
void dotime(int p,int c){
if(vis[p]) modify(p),s[p]=c,modify(p);
else s[p]=c;
}
int main(){
int q,t,lca;
read(N); read(M); read(Qnt); BLOCK=pow(N,0.6);
for(rint i=1;i<=M;i++) read(V[i]);
for(rint i=1;i<=N;i++) read(W[i]);
for(rint i=1,a,b;i<N;i++)
read(a),read(b),E.Adde(a,b),E.Adde(b,a);
for(rint i=1;i<=N;i++) read(s[i]),now[i]=s[i];
deep[1]=1; dfs(1);
for(rint i=1,type,x,y;i<=Qnt;i++){
read(type),read(x),read(y);
if(type){
if(bel[x]>bel[y]) swap(x,y);
++q; Q[q]=(Query){x,y,t,q};
}
else ++t,C[t]=(Change){x,y,now[x]},now[x]=y;
}
sort(Q+1,Q+q+1);
nowU=nowV=1;nowT=0;
for(rint i=1;i<=q;i++){
while(nowT<Q[i].t) nowT++,dotime(C[nowT].p,C[nowT].nc);
while(nowT>Q[i].t) dotime(C[nowT].p,C[nowT].oc),nowT--;
trans(nowU,Q[i].u);
trans(nowV,Q[i].v);
nowU=Q[i].u; nowV=Q[i].v; lca=LCA(Q[i].u,Q[i].v);
modify(lca); ANS[Q[i].id]=ans; modify(lca);
}
for(int i=1;i<=q;i++) printf("%lld\n",ANS[i]);
return 0;
}

  

●UOJ58 [WC2013]糖果公园的更多相关文章

  1. bzoj 3052: [wc2013]糖果公园 带修改莫队

    3052: [wc2013]糖果公园 Time Limit: 250 Sec  Memory Limit: 512 MBSubmit: 506  Solved: 189[Submit][Status] ...

  2. 洛谷 P4074 [WC2013]糖果公园 解题报告

    P4074 [WC2013]糖果公园 糖果公园 树上待修莫队 注意一个思想,dfn序处理链的方法,必须可以根据类似异或的东西,然后根据lca分两种情况讨论 注意细节 Code: #include &l ...

  3. AC日记——[WC2013]糖果公园 cogs 1817

    [WC2013]糖果公园 思路: 带修改树上莫队(模板): 来,上代码: #include <cmath> #include <cstdio> #include <cst ...

  4. COGS1817. [WC2013]糖果公园

    1817. [WC2013]糖果公园 ★★★☆   输入文件:park.in   输出文件:park.out   简单对比时间限制:8 s   内存限制:512 MB [题目描述] Candyland ...

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

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

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

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

  7. 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法

    [题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...

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

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

  9. 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 ...

随机推荐

  1. Software Engineering-HW8 个人总结

    Software Engineering-HW8 个人总结 2017282110264 李世钰 一.请参考第一次作业,当初你对课程的承诺和期望都兑现了吗? 大致实现了.经过了最后的团队项目,基本了解一 ...

  2. 数字是否可以被3和5同时整除,use if and % (21.9.2017)

    #include <stdio.h> int main(){ int a; //a是所输入的数字 printf("输入数字: "); scanf("%d&qu ...

  3. Linux中Eclipse下搭建Web开发环境

    0. 准备工作 java环境,Linux下基本上都有含开源jdk的库,可直接下载,且不用配置环境变量,当然也可以官网下载后自己配置: Eclipse Neon,注意看清是64位还是32位,下载的应该是 ...

  4. jquery基本使用和实例

    一.寻找元素 表单选择器 $(":input") //匹配所有 input, textarea, select 和 button 元素 $(":text") / ...

  5. php面向对象相关内容

    1.什么是面向对象? 面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作 ...

  6. Hadoop学习笔记一(HDFS架构)

    介绍 Hadoop分布式文件系统(HDFS)设计的运行环境是商用的硬件系统.他和现存的其他分布式文件系统存在很多相似点.不过HDFS和其他分布式文件系统的区别才是他的最大亮点,HDFS具有高容错的特性 ...

  7. MySQL中使用sql语句获得表结构

    最近在研究PHP,那么就必须涉及到mysql.其中一个功能通过表数据自动生成页面,紧接着发现在一张空表中无法读取数据(因为人家刚刚新建,就是空的没有数据) 延伸出来便是直接查表结构获得字段名,再进行处 ...

  8. api-gateway实践(05)新网关工作 - 缓存定义

    一.缓存分类 1.服务注册信息 1.1.[GroupCode_VersionCode]对应[Version定义]的缓存                       缓存类型:hash         ...

  9. 粒子系统(二):Canvas绘制精美图案

    准备 IDE:Visual Studio Code Language:JavaScript / ECMAScript 6+ GitHub:Natural2D.JS 本文主要讲述 Particles - ...

  10. Python之面向对象四

    面向对象进阶 一.关于面向对象的两个内置函数 isinstance   判断类与对象的关系    isinstance(obj,cls)检查obj是否是类 cls 的对象,返回值是bool值 issu ...