感谢:

http://vfleaking.blog.163.com/blog/static/174807634201311011201627/

http://hzwer.com/5250.html

好吧,收获两点:

  1、带修改,其实就是暴力,只是将同一块的查询再按照时间顺序排,这样就能减少在修改操作上“爬"的时间,其实就是利用了数据随机这个特点,可以构造数据来卡。

  2、以前排序的方法是u按照块,v按照dfs序,这次两个都是按照块,其实差不多。

 /**************************************************************
Problem: 3052
User: idy002
Language: C++
Result: Accepted
Time:101223 ms
Memory:21792 kb
****************************************************************/ #include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#define P(p) ((1)<<(p))
#define maxn 100010
#define maxp 16
using namespace std; typedef long long dint; int n, m, q, qq, qm;
int cc[maxn], ww[maxn], vv[maxn];
vector<int> g[maxn], stk;
int mno[maxn], mcc_siz, mcc_cnt;
int anc[maxn][maxp+], depth[maxn], dfn[maxn], dfs_clock;
bool stat[maxn];
dint cnt[maxn], cur_ans;
dint ans[maxn];
int mdu[maxn], mdc[maxn], mdo[maxn], mdcc[maxn]; struct Qu {
int u, v, t, id;
bool operator<( const Qu & b ) const {
if( mno[u]^mno[b.u] ) return mno[u]<mno[b.u];
if( mno[v]^mno[b.v] ) return mno[v]<mno[b.v];
return t<b.t;
}
};
Qu qu[maxn]; int dfs( int u ) {
dfn[u] = ++dfs_clock;
depth[u] = depth[anc[u][]]+;
for( int p=; p<=maxp; p++ ) {
anc[u][p] = anc[anc[u][p-]][p-];
if( !anc[u][p] ) break;
} int sz = ;
for( int t=; t<g[u].size(); t++ ) {
int v = g[u][t];
if( v==anc[u][] ) continue;
anc[v][] = u;
sz += dfs(v);
if( sz > mcc_siz ) {
mcc_cnt++;
for( int i=; i<=sz; i++ ) {
mno[stk.back()] = mcc_cnt;
stk.pop_back();
}
sz = ;
}
}
stk.push_back( u );
return sz+;
} int lca( int u, int v ) {
if( depth[u]<depth[v] ) swap(u,v);
int t = depth[u]-depth[v];
for( int p=; t; t>>=, p++ )
if( t& ) u=anc[u][p];
if( u==v ) return u;
for( int p=maxp; p>= && anc[u][]!=anc[v][]; p-- )
if( anc[u][p]!=anc[v][p] )
u = anc[u][p], v = anc[v][p];
return anc[u][];
} void inv_sig( int u ) {
if( stat[u] ) {
cur_ans -= (dint)ww[cnt[cc[u]]]*vv[cc[u]];
cnt[cc[u]]--;
} else {
cnt[cc[u]]++;
cur_ans += (dint)ww[cnt[cc[u]]]*vv[cc[u]];
}
stat[u] ^= ;
} void chg_sig( int u, int type ) {
if( stat[u] ) {
inv_sig(u);
cc[u] = type;
inv_sig(u);
} else cc[u] = type;
} void inv_chain( int u, int v ) {
int ca = lca(u,v);
for( ; u!=ca; u=anc[u][] ) inv_sig(u);
for( ; v!=ca; v=anc[v][] ) inv_sig(v);
}
void app_time( int fm, int to ) {
while( fm<to ) {
fm++;
chg_sig(mdu[fm],mdc[fm]);
}
while( to<fm ) {
chg_sig(mdu[fm],mdo[fm]);
fm--;
}
} void work() {
sort( qu+, qu++qq );
int ou=qu[].u;
int ov=qu[].u;
int ot=;
for( int i=; i<=qq; i++ ) {
int u = qu[i].u, v = qu[i].v;
inv_chain( u, ou );
inv_chain( v, ov );
app_time( ot, qu[i].t );
ot = qu[i].t;
ou = u;
ov = v;
int ca = lca(u,v);
inv_sig( ca );
ans[qu[i].id] = cur_ans;
inv_sig( ca );
}
} int main() {
scanf( "%d%d%d", &n, &m, &q );
for( int i=; i<=m; i++ ) scanf( "%d", vv+i );
for( int i=; i<=n; i++ ) scanf( "%d", ww+i );
for( int i=,u,v; i<n; i++ ) {
scanf( "%d%d", &u, &v );
g[u].push_back(v);
g[v].push_back(u);
}
mcc_siz = (int)(pow(n,2.0/3.0))+;
dfs();
while( !stk.empty() ) {
mno[stk.back()] = mcc_cnt;
stk.pop_back();
}
for( int i=; i<=n; i++ ) {
scanf( "%d", cc+i );
mdcc[i] = cc[i];
}
for( int i=,type,x,y; i<=q; i++ ) {
scanf( "%d%d%d", &type, &x, &y );
if( !type ) {
qm++;
mdu[qm]=x, mdc[qm]=y, mdo[qm]=mdcc[x];
mdcc[x] = y;
} else {
qq++;
qu[qq].u=x, qu[qq].v=y, qu[qq].t=qm, qu[qq].id=qq;
}
}
work();
for( int i=; i<=qq; i++ )
printf( "%lld\n", ans[i] );
}

bzoj 3052 树上莫队 待修改的更多相关文章

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

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

  2. P4074 [WC2013]糖果公园 树上莫队带修改

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

  3. uoj #58. 【WC2013】糖果公园(树上莫队算法+修改操作)

    [题目链接] http://uoj.ac/problem/58 [题意] 有一棵树,结点有自己的颜色,若干询问:u,v路径上的获益,并提供修改颜色的操作. 其中获益定义为Vc*W1+Vc*W2+…+V ...

  4. bzoj 3757 树上莫队

    感谢以下文章作者: http://blog.csdn.net/kuribohg/article/details/41458639 http://vfleaking.blog.163.com/blog/ ...

  5. BZOJ - 3757 树上莫队解决离线路径问题 & 学习心得

    题意:给你一棵树,求u,v最短路径的XXX(本题是统计权值种类) 今天课上摸鱼学了一种有意思的处理路径方式(其实是链式块状树翻车了看别的),据说实际运行跑的比XX记者还快 大概就是像序列莫队那样 首先 ...

  6. 【bzoj3052】[wc2013]糖果公园 带修改树上莫队

    题目描述 给出一棵n个点的树,每个点有一个点权,点权范围为1~m.支持两种操作:(1)修改一个点的点权 (2)对于一条路径,求$\sum\limits_{i=1}^m\sum\limits_{j=1} ...

  7. [BZOJ 3052] [wc2013] 糖果公园 【树上莫队】

    题目链接:BZOJ - 3052 题目分析 这道题就是非常经典的树上莫队了,并且是带修改的莫队. 带修改的莫队:将询问按照 左端点所在的块编号为第一关键字,右端点所在的块为第二关键字,位于第几次修改之 ...

  8. BZOJ 4129: Haruna’s Breakfast [树上莫队 分块]

    传送门 题意: 单点修改,求一条链的mex 分块维护权值,$O(1)$修改$O(S)$求mex...... 带修改树上莫队 #include <iostream> #include < ...

  9. 【bzoj4129】Haruna’s Breakfast 带修改树上莫队+分块

    题目描述 给出一棵树,点有点权.支持两种操作:修改一个点的点权,查询链上mex. 输入 第一行包括两个整数n,m,代表树上的结点数(标号为1~n)和操作数.第二行包括n个整数a1...an,代表每个结 ...

随机推荐

  1. python笔记之BytesIO

    1. 什么是BytesIO BytesIO与StringIO类似,不同的是StringIO只能存放string,BytesIO是用来存放bytes的,它提供了在内存中读写字节的能力. 即在内存中读写字 ...

  2. 初识smarty

    个人体会(不完全正确):就是smarty就是为了更好的使得php/html结合做出来的一个框架. ,

  3. [转载]Selenium実行中にJavaScriptのコードを実行する

    Selenium実行中にJavaScriptのコードを実行する JavaScriptで画面の値を取得/設定するコードをメモ. WebDriverEx.cs // JavaScriptを実行(戻り値なし ...

  4. Nginx源码分析--数组(转)

    原文地址:http://blog.csdn.net/marcky/article/details/5747431 备注:以下关于Nginx源码的分析基于淘宝开源项目Tengine. Nginx中对数组 ...

  5. leetcode 之trap water(8)

    这题不太好想.可以先扫描找到最高的柱子,然后分别处理两边:记录下当前的局部最高点,如果当前点小于局部最高点,加上, 反则,替换当前点为局部最高点. int trapWater(int A[], int ...

  6. beego学习笔记(2)

    BEEGO的几个特点: 简单化 RESTful 支持.MVC 模型,可以使用 bee 工具快速地开发应用,包括监控代码修改进行热编译.自动化测试代码以及自动化打包部署. 智能化 支持智能路由.智能监控 ...

  7. cocos2dx 开发配置的一些环境变量(mac/linux)

    通常开发需要配置一些环境变量,下面把我电脑的部分配置分析一下. 1.android开发配置,ndk,sdk,ant 2.cocos2dx开发配置,cocos2d-x export COCOS2DX_R ...

  8. web2.0 HW3 相关阅读材料

    W3C官网的材料简直看花眼……除了挂出的文档,www-style@w3.org的一堆邮件也藏着很多宝,但是看下来又眼花了……(好在宝们基本都被W3C吸收了=.=) 主要来自W3C的官网w3.org的一 ...

  9. Js数组的常用的方法概述

    学习JS的同学们,也曾对数组进行学习掌握,所以我也把数组中常用的方法列举下来,相互学习 不多废话,直接上正文 .                 快乐的分割线... 一.对象继承的方法 数组是一种特殊 ...

  10. <<Javascript Patterns>>阅读笔记 -- 第2章 基本技巧(一)

    第一次写这种东西, 有些生涩和蹩脚, 也是为了自己在表达或是总结方面有所提高, 同时为看过的东西留个痕迹, 以便日后查阅. 有错误或是不妥的地方, 还望各位指正, 谢谢! 第1章 简介 本章主要介绍了 ...