[ZJOI2015]幻想乡战略游戏

带修改下,边点都带权的重心

随着变动的过程中,一些子树内的点经过会经过一些公共边。考虑能不能对这样的子树一起统计。

把树上贡献分块。

考虑点分治算法

不妨先把题目简化一下:

假设没有修改,多次询问,每次给定一个s,求$\sum d_v*dis(s,v)$

为了让一块可以一起统计,

我们设:

$sum[x]:$x为根的点分治树管辖部分的权值和

$df[x]$:x为根的点分治树管辖部分到x分治树father的带权距离和$\sum d[v]*dis[v,fa[x]]$

$dm[x]:$ x为根的点分治树管辖部分到x自己的带权距离和

自底向上统计总距离

开始加上$dm[s]$,然后不断加上$dis(s,fa)*(sum[fa]-sum[las])+dm[fa]-df[las]$

las代表上一个father

$dis(s,fa)$可以开始点分治的时候保存(反正就log个)

对于一个s,可以$logn$找到答案

$dm,sum,df$也可以轻而易举$logn$修改

问题是现在我们不知道s是哪一个。

我们比较熟悉一个叫货仓选址问题。

这个重心,很类似于带权中点。

从分治树的root开始,枚举原树上的出边,到y,y所在的这一层的分治树的father叫做son。如果存在一个子树的sum[son]要大于x的剩下分支的点值总和,那么重心一定在son里。

(简单证明:

如果存在sum[son]>sum[x]-sum[son],那么这样的son一定只有一个

存在往son走,减去的代价多,增加的代价少。存在代价更小的情况。(至少是y)

而往其他子树走,代价一定是单调递增上涨的。不可能更优。

所以,重心一定在son管辖的分治树这块区域

可以递归处理下去。

但是一个问题是,

如果到了son位置,但是对于son的1号子树,权值和必须考虑上B的所有权值和。

否则肯定不能直接走。

我们还要返回去考虑father们的权值?

发现难以处理。因为之后的划分可能较多。还要$logn$暴力找father

发现B的权值只有在询问包含y的子树的块才会用到。

所以,我们干脆直接把y点的权值加上sum[B]。回溯回来再减去。

然后就可以放心大胆查询子树的权值和了。

(因为这个小trick瞎写了半天。。。。)

由于只会找到一个son,所以,每次找s的复杂度是:$O(20logn+log^2n)$

就可以了。

(虽然暴力$20*log^2n$每次也可以过,因为时限6s)

代码:

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=1e5+;
int n,m;
struct node{
int nxt,to;
int son;
ll val;
}e[*N];
int hd[N],cnt;
void add(int x,int y,ll z){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
e[cnt].val=z;
hd[x]=cnt;
}
ll has[N];
int rt;
ll dm[N],df[N],sum[N];
ll dis[N][];
int fa[N];
int sz[N],mxsz[N];
int nowsz;
int gen;
int dep[N];
bool vis[N];
void dfs1(int x,int ff,int d){
dep[x]=d;
sz[x]=;mxsz[x]=;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==ff) continue;
if(vis[y]) continue;
dfs1(y,x,d);
sz[x]+=sz[y];
mxsz[x]=max(mxsz[x],sz[y]);
}
mxsz[x]=max(mxsz[x],nowsz-sz[x]);
if(mxsz[x]<=nowsz/){
rt=x;
}
}
void dfs2(int x,int ff,int d){
sz[x]=;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==ff||vis[y]) continue;
dis[y][d]=dis[x][d]+e[i].val;
dfs2(y,x,d);
sz[x]+=sz[y];
}
}
int divi(int x,int ff,int d){
rt=;
dfs1(x,,d);
dis[rt][d]=;
fa[rt]=ff;
dfs2(rt,,d); vis[rt]=;
int now=rt;
for(reg i=hd[now];i;i=e[i].nxt){
int y=e[i].to;
if(vis[y]) continue;
nowsz=sz[y];
e[i].son=divi(y,now,d+);
}
return now;
}
void upda(int x,ll c){//c is change
int gg=x;
int nd=dep[x];
while(x){
sum[x]+=c;
df[x]+=c*dis[gg][nd-];
dm[x]+=c*dis[gg][nd]; x=fa[x];
--nd;
}
}
int query(int x,int d){
//cout<<" querying "<<x<<" || "<<" "<<d<<endl;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(dep[y]<dep[x]) continue;
int lp=e[i].son;
if(sum[lp]>sum[x]-sum[lp]){
upda(y,sum[x]-sum[lp]);
int ret=query(lp,d+);
upda(y,sum[lp]-sum[x]);
return ret;
}
}
return x;
}
ll calc(int x){
ll ret=dm[x];
int gg=x;
int las=x;
x=fa[x];
int nd=dep[x];
while(x){
ret+=(dm[x]-df[las])+(sum[x]-sum[las])*dis[gg][nd];
--nd;
las=x;
x=fa[x];
}
return ret;
}
int main(){
rd(n);rd(m);
int x,y;
ll z;
for(reg i=;i<=n-;++i){
rd(x);rd(y);scanf("%lld",&z);
add(x,y,z);add(y,x,z);
}
nowsz=n;
gen=divi(,,);
//cout<<" ffafaf "<<endl;
// for(reg i=1;i<=n;++i){
// cout<<i<<" : "<<fa[i]<<endl;
// }
//cout<<" gen "<<gen<<endl;
while(m--){
rd(x);scanf("%lld",&z);
upda(x,z);
has[x]+=z;//warning!!!!
// for(reg i=1;i<=n;++i){
// cout<<i<<" : "<<sum[i]<<" "<<dm[i]<<" "<<df[i]<<endl;
// }
int core=query(gen,);
printf("%lld\n",calc(core)); }
return ;
} }
int main(){
// freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2018/11/29 8:55:17
*/

[ZJOI2015]幻想乡战略游戏——动态点分治的更多相关文章

  1. 【BZOJ3924】[Zjoi2015]幻想乡战略游戏 动态树分治

    [BZOJ3924][Zjoi2015]幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网 ...

  2. [BZOJ3924][ZJOI2015]幻想乡战略游戏(动态点分治)

    题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和别人打 ...

  3. P3345 [ZJOI2015]幻想乡战略游戏 动态点分治

    \(\color{#0066ff}{ 题目描述 }\) 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越 ...

  4. 【bzoj3924】[Zjoi2015]幻想乡战略游戏 动态点分治

    题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和别人打 ...

  5. ZJOI2015 幻想乡战略游戏 动态点分治_树链剖分_未调完

    Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来, ...

  6. BZOJ 3924: [Zjoi2015]幻想乡战略游戏(动态点分治)

    这种动态点分治嘛,GDKOI时听打到了,也有同学讲到了,所以印象比较深刻也就想出来了,然后就在实现方面卡了好久= = 不得不说CLJ说得真的太简单了,实现方面根本没提. 首先我们可以先用树分治构建出这 ...

  7. BZOJ 3924 / Luogu P3345 [ZJOI2015]幻想乡战略游戏 (动态点分治/点分树)

    题意 树的结构不变,每个点有点权,每一条边有边权,有修改点权的操作,设xxx为树中一点.求∑idist(x,i)∗a[i]\sum_idist(x,i)*a[i]i∑​dist(x,i)∗a[i]的最 ...

  8. 洛谷P3345 [ZJOI2015]幻想乡战略游戏 [动态点分治]

    传送门 调了两个小时,终于过了-- 凭啥人家代码80行我180行啊!!! 谁叫你大括号换行 谁叫你写缺省源 思路 显然,补给点所在的位置就是这棵树的带权重心. 考虑size已知时如何找重心:一开始设答 ...

  9. bzoj 3924 [Zjoi2015]幻想乡战略游戏——动态点分治(暴力移动找重心)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3924 度数只有20,所以从一个点暴力枚举其出边,就能知道往哪个方向走. 知道方向之后直接走到 ...

随机推荐

  1. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 二

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

  2. Qt应用程序重启

    重启应用程序是一种常见的操作,在Qt中实现非常简单,需要用到QProcess类一个静态方法: // program, 要启动的程序名称 // arguments, 启动参数 bool startDet ...

  3. C++ STL中的Binary search(二分查找)

    这篇博客转自爱国师哥,这里给出连接https://www.cnblogs.com/aiguona/p/7281856.html 一.解释 以前遇到二分的题目都是手动实现二分,不得不说错误比较多,关于返 ...

  4. Scrum立会报告+燃尽图(十一月二十三日总第三十一次):界面修改及新页面添加

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2410 项目地址:https://git.coding.net/zhang ...

  5. 20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结

    20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结 小组成员 20172313 余坤澎 20172332 于欣月 20172326 康皓越 小组编程照片 设计思路 通过一个E ...

  6. psp项目计划

    日期/任务 听课 编写程序 阅读书籍 查阅资料 日总计 周一 2h 0.5h     2.5 周二     1h   1 周三     1h     周四 2h 0.5h     2.5 周五   3 ...

  7. 个人作业四:注册github

    注册Github账户 账户名称:liurunhan Github地址:https://github.com/liurunhan

  8. Requests库常用方法及其详解

    request库七个方法详解 1. request方法 所有方法的的基础方法,三个参数:method,url,**kwargs. 1.1 method:请求方式 method参数共有七个可选的值,分别 ...

  9. OOP 2.2 构造函数

    1.概念 成员函数的一种 名字与类名相同,可以有参数,没有返回值(void也不行) 作用:对对象进行初始化,如给成员函数赋初始值 如果定义时没有构造函数,则编译器生成一个默认无参数的构造函数 默认构造 ...

  10. Alpha 冲刺(6/10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 测试服务器并行能力 学习MSI.CUDA ...