题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3924

度数只有20,所以从一个点暴力枚举其出边,就能知道往哪个方向走。

知道方向之后直接走到点分树的那个部分的儿子上,即一下走到了那个方向的重心。这样只会走 log 次。

需要通过点分树上维护的信息实现 log 查询一个点作为根的答案。

可以维护 f [  i  ] 表示自己作为重心管辖部分的点 j 的 \( \sum dis( i , j ) * w[ j ] \), g [ i ] 表示自己管辖的点 j 的 \( \sum dis( pre[ i ] , j ) * w[ j ] \) ,再维护自己管辖的点的 \( \sum w[ j ] \) ,就能查询答案了。每次就是枚举自己点分树上的父亲,用它们的 f 减去它们下一层孩子的 g 加到自己的答案里,再用它们的 w 减去他们下一层孩子的 w 再乘上到自己的距离加到自己的答案里。

不知为什么时限是 100 s ,所以这样就能过了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e5+,K=;
int n,hd[N],xnt,to[N<<],nxt[N<<],ew[N<<],eto[N<<];
int dep[N],pre[N][K],dis[N][K],siz[N],mn,rt; bool vis[N];
ll f[N],g[N],w[N];int xt,go[N],nt[N],hed[N];
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
int Mx(int a,int b){return a>b?a:b;}
int Mn(int a,int b){return a<b?a:b;}
void add(int x,int y,int z){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;ew[xnt]=z;}
void addx(int x,int y){go[++xt]=y;nt[xt]=hed[x];hed[x]=xt;}
void getrt(int cr,int fa,int s)
{
siz[cr]=;int mx=;
for(int i=hd[cr],v;i;i=nxt[i])
if(!vis[v=to[i]]&&v!=fa)
{
getrt(v,cr,s);siz[cr]+=siz[v];mx=Mx(mx,siz[v]);
}
mx=Mx(mx,s-siz[cr]); if(mx<mn)mn=mx,rt=cr;
}
void dfs(int cr,int fa,int ds)
{
pre[cr][++dep[cr]]=rt;dis[cr][dep[cr]]=ds;
for(int i=hd[cr],v;i;i=nxt[i])
if(!vis[v=to[i]]&&v!=fa)dfs(v,cr,ds+ew[i]);
}
void init(int cr,int s)
{
vis[cr]=;dfs(cr,,);
for(int i=hd[cr],v;i;i=nxt[i])
if(!vis[v=to[i]])
{
int ts=(siz[v]<siz[cr]?siz[v]:s-siz[cr]);
mn=N;getrt(v,cr,ts);addx(cr,rt);
eto[i]=rt;init(rt,ts);
}
}
void mdfy(int cr,int k)
{
for(int i=dep[cr],v;i;i--)
{
w[v=pre[cr][i]]+=k;
f[v]+=(ll)dis[cr][i]*k;
g[v]+=(ll)dis[cr][i-]*k;
}
}
ll calc(int cr)
{
ll ret=f[cr];
for(int i=dep[cr]-,x,y;i;i--)
ret+=f[x=pre[cr][i]]-g[y=pre[cr][i+]]+(w[x]-w[y])*dis[cr][i];
return ret;
}
void solve(int cr,ll nw)
{
ll mn=nw;int bh=;
for(int i=hd[cr];i;i=nxt[i])
{
ll tmp=calc(to[i]);
if(tmp<nw&&tmp<mn)mn=tmp,bh=i;
}
if(!bh){printf("%lld\n",nw);return;}
solve(eto[bh],calc(eto[bh]));
}
int main()
{
n=rdn();int Q=rdn();
for(int i=,u,v,k;i<n;i++)
u=rdn(),v=rdn(),k=rdn(),add(u,v,k),add(v,u,k);
mn=N;getrt(,,n);int cr=rt;init(rt,n);
int x,k;
while(Q--)
{
x=rdn();k=rdn();mdfy(x,k);
solve(cr,f[cr]);
}
return ;
}

bzoj 3924 [Zjoi2015]幻想乡战略游戏——动态点分治(暴力移动找重心)的更多相关文章

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

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

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

    [ZJOI2015]幻想乡战略游戏 带修改下,边点都带权的重心 随着变动的过程中,一些子树内的点经过会经过一些公共边.考虑能不能对这样的子树一起统计. 把树上贡献分块. 考虑点分治算法 不妨先把题目简 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. bzoj 3924: [Zjoi2015]幻想乡战略游戏

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

随机推荐

  1. 使用cronolog工具给tomcat进行日志切割

    关于cronolog的用法查看:https://www.freebsd.org/cgi/man.cgi?query=cronolog&apropos=0&sektion=0&m ...

  2. Openldap基于digest-md5方式的SASL认证配置

    1. openldap编译 如果需要openldap支持SASL认证,需要在编译时加上–enable-spasswd选项安装完cyrus-sasl,openssl(可选),BDB包后执行: 1 2 $ ...

  3. codevs 2216 行星序列 线段树+延迟标记(BZOJ 1798)

    2216 行星序列  时间限制: 2 s  空间限制: 256000 KB     题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始, ...

  4. Java 集合-Map接口和三个子类实现

    2017-10-31 22:05:59 Map 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. HashMap是基于散列表实现的,插入.删除和定位元素时间复杂度平均能达到O ...

  5. centos7(debian,manjora,freebsd)命令及安装mysql、git、gpg、gogs,安装docker,zsh,chrome

    最小安装: 1. 选择English 2. DATE & TIME 修改好本地时间 SOFTWARE SELECTION默认的Minimal Install就好 INSTALLATION DE ...

  6. java 实现断点续传

    请求头一:>>>>>>>>>>>>>>>>>>>>>>>> ...

  7. BZOJ3239 Discrete Logging

    一道裸的BSGS题目(叫baby step, giant step) 从爱酱的blog里学来的,是一个很神的根号算法. 如果我们有hash的工具的话,就是O(sqrt(p))的,这里又用了一个map所 ...

  8. Webroot SecureAnywhere AntiVirus 2014 – 免费6个月

    Webroot SecureAnywhere 是由webroot推出的一款云安全软件,除了能够清除病毒外,特点是体积小.强力查杀木马.间谍软件.Rootkit 等等,为你的个人私隐信息提供全面的保护. ...

  9. 流程设计器jQuery + svg/vml(Demo5 - 撤消与重做)

    上篇完成了画线,接下来是撤消与重做. 代码:GoFlow_05.zip 演示地址:Demo 微信演示公众号: 另:Silverlight版 Silverlight版Demo

  10. 20181009-6 选题 Scrum立会报告+燃尽图 05

    Scrum立会报告+燃尽图(05)选题 此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2195 一.小组介绍 组长:刘莹莹 ...