http://uoj.ac/problem/58

树上带修莫队模板题

#include<bits/stdc++.h>
const int N=;
typedef long long i64;
char buf[N*],*ptr=buf-,ob[N*],*op=ob;
int _(){
int x=;
while(*ptr<)++ptr;
while(*ptr>)x=x*+*ptr++-;
return x;
}
void pr(i64 x){
int ss[],sp=;
do ss[++sp]=x%+;while(x/=);
while(sp)*op++=ss[sp--];
*op++=;
}
void maxs(int&a,int b){if(a<b)a=b;}
int n,m,q;
std::vector<int>e[N];
int v1[N],v2[N],c[N];
int tk=;
int os[N][];
int X=,Y=,Z=,in[N];
int ts[N],dep[N],fa[N],sz[N],top[N],son[N],md[N],id[N],idp=,D=;
i64 ans=;
inline void del(int x){ans-=i64(v1[x])*v2[ts[x]--];}
inline void ins(int x){ans+=i64(v1[x])*v2[++ts[x]];}
void f2(int w){
id[w]=idp;
for(int i=;i<e[w].size();++i){
int u=e[w][i];
if(u!=fa[w]&&!id[u])f2(u);
}
}
void f3(int w,int tp){
top[w]=tp;
if(son[w])f3(son[w],tp);
for(int i=;i<e[w].size();++i){
int u=e[w][i];
if(u!=fa[w]&&u!=son[w])f3(u,u);
}
}
void f1(int w,int pa){
dep[w]=dep[fa[w]=pa]+;
sz[w]=;
for(int i=;i<e[w].size();++i){
int u=e[w][i];
if(u!=pa){
f1(u,w);
sz[w]+=sz[u];
if(sz[u]>sz[son[w]])son[w]=u;
if(!id[u])maxs(md[w],md[u]+);
}
}
if(w==||md[w]==D)++idp,f2(w);
}
int lca(int x,int y){
int a=top[x],b=top[y];
while(a!=b){
if(dep[a]>dep[b])x=fa[a],a=top[x];
else y=fa[b],b=top[y];
}
return dep[x]<dep[y]?x:y;
}
i64 as[N];
struct Q{
int x,y,z,ID;
bool operator<(const Q&w)const{
if(id[x]!=id[w.x])return id[x]<id[w.x];
if(id[y]!=id[w.y])return (id[y]<id[w.y])^(id[x]&);
return z<w.z;
}
void mov(int&w0,int b){
int a=w0;w0=b;
int g=lca(a,b);
for(;a!=g;a=fa[a])(in[a]^=)?ins(c[a]):del(c[a]);
for(;b!=g;b=fa[b])(in[b]^=)?ins(c[b]):del(c[b]);
}
void cal(){
int w;
while(Z<z){
++Z;
if(in[w=os[Z][]]){
del(c[w]);
ins(c[w]=os[Z][]);
}
c[w]=os[Z][];
}
while(Z>z){
if(in[w=os[Z][]]){
del(c[w]);
ins(os[Z][]);
}
c[w]=os[Z][];
--Z;
}
mov(X,x);
mov(Y,y);
int g=lca(x,y);
ins(c[g]);
as[ID]=ans;
del(c[g]);
}
}qs[N];
int qp=;
int main(){
fread(buf,,sizeof(buf),stdin);
n=_();m=_();q=_();
for(int i=;i<=m;++i)v1[i]=_();
for(int i=;i<=n;++i)v2[i]=_();
for(int i=,a,b;i<n;++i){
a=_(),b=_();
e[a].push_back(b);
e[b].push_back(a);
}
for(int i=;i<=n;++i)c[i]=_();
for(int i=;i<q;++i){
int o=_(),x=_(),y=_();
if(o)qs[qp]=(Q){x,y,tk,qp},++qp;
else{
++tk;
os[tk][]=x;
os[tk][]=c[x];
os[tk][]=c[x]=y;
}
}
if(tk<=)D=sqrt(n)+;
else D=pow(n,0.67)+;
f1(,);f3(,);
std::sort(qs,qs+qp);
X=Y=,Z=tk;
for(int i=;i<qp;++i)qs[i].cal();
for(int i=;i<qp;++i)pr(as[i]);
fwrite(ob,,op-ob,stdout);
return ;
}

uoj #58【WC2013】糖果公园的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. COGS1817. [WC2013]糖果公园

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

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

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

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

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

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

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

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

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

随机推荐

  1. 2019寒假算法基础集训营1 - B 小a与"204"

    题目: 小a非常喜欢这个数字,因为. 现在他有一个长度为的序列,其中只含有这三种数字 设为序列中第个数,你需要重新排列这个数列,使得最大(公式的含义是:每个数与前一个数差的平方的和) 注意:我们默认 ...

  2. 51Nod 1084:矩阵取数问题 V2(多维DP)

    1084 矩阵取数问题 V2  基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励 ...

  3. doc 常用命令

    ★ 查看java环境变量 echo %JAVA_HOME% echo %PATH% echo %CLASSPATH%

  4. 经过强制类型转换以后,变量a, b的值分别为( )short a = 128; byte b = (byte) a;

    1.Java中用补码形式表示 2.第一位正负位,1表示负,0表示正. 3.原码:一个数的二进制表示.                  3的原码00000011   -3的 原码 10000011 4 ...

  5. pushpin 将web services 转换为realtime api 的反向代理工具

    pushpin 是一款反向代理工具,可以将web services 转换为实时的api 参考架构图 包含的特性 透明 无状态 共享nothing 发布&&订阅模型 几种灵活用法 基本使 ...

  6. pipenv 方便的python 开发工作流工具

    pipenv 将 composer.bundler.npm.yarn.cargo 等比较方便的包管理工具添加到了python 语言中,可以 帮助我们自动的管理virtualenv ,同时可以方便的从p ...

  7. sofa graphql 2 rest api 试用

      大部分代码还是来自sofa 的官方文档,同时添加了docker && docker-compose集成 备注: 代码使用typescript 同时运行的时候为了方便直接运行使用ts ...

  8. L老师 Shader编程教程 学习

    Shader "VoidGame/FixedShader" { Properties{ //颜色 _Color("Color",Color)=(1,1,1,1) ...

  9. C# 获取机器码

    using System.Runtime.InteropServices; using System.Management; using System; public class HardwareIn ...

  10. opencv人脸识别代码

    opencv人脸识别C++代码 /* * Copyright (c) 2011,2012. Philipp Wagner <bytefish[at]gmx[dot]de>. * Relea ...