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

参考了博客:https://blog.csdn.net/qq_34564984/article/details/53791482

然后感觉这题其实是很好想的,为了计算答案而维护答案、权值和以及到父亲的答案;

只要记三个数即可,实现起来也不麻烦;

查询时可以利用性质(感性理解是对的),枚举原树上的20条出边,哪里更优走哪里;

为了减少走的次数,每次走到那个出边所在分治块的 rt 即可,这个 rt 一定是原来点在分治树上的一个儿子,因为不会走回父亲(原本就是从父亲走来的,走回去显然不优);

复杂度算一算应该是 m*20*log2n 的,过不了...?但这题给了 100s 的时限,怎么也过了。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=1e5+;
int n,hd[xn],ct,to[xn<<],nxt[xn<<],w[xn<<],tt[xn<<];
int siz[xn],dep[xn],fa[xn][],dis[xn][],son[xn][],num[xn],mx,rt;
ll f[xn],sum[xn],g[xn];
bool vis[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int Max(int x,int y){return x>y?x:y;}
int Min(int x,int y){return x<y?x:y;}
void add(int x,int y,int z){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct; w[ct]=z;}
void getrt(int x,int ff,int sum)
{
int nmx=; siz[x]=;
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==ff||vis[u])continue;
getrt(u,x,sum); siz[x]+=siz[u];
nmx=Max(nmx,siz[u]);
}
nmx=Max(nmx,sum-siz[x]);
if(nmx<mx)mx=nmx,rt=x;
}
void build(int x,int ff,int d)
{
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==ff||vis[u])continue;
fa[u][++dep[u]]=rt; dis[u][dep[u]]=d+w[i];
build(u,x,d+w[i]);
}
}
void work(int x,int sum)
{
vis[x]=; build(x,,);
for(int i=hd[x],u;i;i=nxt[i])
{
if(vis[u=to[i]])continue;
int ns=(siz[u]>siz[x]?sum-siz[x]:siz[u]);
mx=xn; getrt(u,,ns); tt[i]=rt; work(rt,ns);//tt
}
}
void change(int x,ll v)
{
for(int i=dep[x];i;i--)
{
int ff=fa[x][i],d=dis[x][i];
f[ff]+=v*d; sum[ff]+=v;
if(i>)g[ff]+=v*dis[x][i-];
}
}
ll cal(int x)
{
ll ret=;
for(int i=dep[x];i;i--)
{
int nw=fa[x][i]; ret+=f[nw]; ret-=g[nw];
if(i>)ret+=(sum[fa[x][i-]]-sum[nw])*dis[x][i-];
}
return ret;
}
ll query(int x)
{
ll val=cal(x);
//for(int i=1,u;i<=num[x];i++)
//if(cal(u=son[x][i])<val)return query(u);
for(int i=hd[x],u;i;i=nxt[i])
if(cal(u=to[i])<val)return query(tt[i]);
return val;
}
int main()
{
n=rd(); int m=rd();
for(int i=,x,y,z;i<n;i++)
x=rd(),y=rd(),z=rd(),add(x,y,z),add(y,x,z);
mx=xn; getrt(,,n); int yrt=rt; work(rt,n);
//for(int i=1,ff;i<=n;i++)son[ff=fa[i][dep[i]]][++num[ff]]=i;
for(int i=;i<=n;i++)fa[i][++dep[i]]=i;
for(int i=,x,v;i<=m;i++)
{
x=rd(); v=rd(); change(x,v);
printf("%lld\n",query(yrt));
}
return ;
}

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

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

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

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

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

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

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

  4. bzoj 3924 幻想乡战略游戏

    题目大意: 有边权点权的树,动态修改点权 每次修改后求带权重心x (\(minimize\) \(S=\sum_i val[i]*dist[x][i]\)) 分析: 从暴力找突破口: 对于边x,y,设 ...

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

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

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

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

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

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

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

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

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

    唉:-(动态点分治的思想真是复杂...... 先码住,再做几道题再来填坑 PS:接下来的Code因为用了倍增lca所以TLE一部分,但是懒得改成RMQ了...... Code: #include< ...

随机推荐

  1. Gaby Ivanushka(快排)

    Gaby Ivanushka Once upon a time there lived a tsar that has a daughter — Beautiful Vasilisa. There w ...

  2. java Filter的简单使用

    java web中的过滤器的简单使用.直接上代码.1.web.xml <?xml version="1.0" encoding="UTF-8"?> ...

  3. 九度OJ 1349:数字在排序数组中出现的次数 (排序、查找)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2489 解决:742 题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小. ...

  4. 6.1-AliasRegistry

    AliasRegistry //AliasRegistry package org.springframework.core; /** * Common interface for managing ...

  5. JS异错面试题

    转自 http://www.codeceo.com/article/one-javascript-interview.html function Foo() { getName = function ...

  6. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之实现游戏逻辑(五)

    在上一篇<我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)>中提到的两个类: GameConf:负责管理游戏的 ...

  7. 我的Android进阶之旅------>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam

    由于上一篇文章:我的Android进阶之旅------>Android之动画之Frame Animation实例 中展示的是Frame动画效果,但是之前我是将图片截取下来,不好说明确切的动画过程 ...

  8. hdu2563——统计问题

    Problem Description 在一无限大的二维平面中,我们做例如以下如果: 1.  每次仅仅能移动一格. 2.  不能向后走(如果你的目的地是"向上",那么你能够向左走, ...

  9. Hive与Hbase关系整合

    近期工作用到了Hive与Hbase的关系整合,虽然从网上参考了很多的资料,但是大多数讲的都不是很细,于是决定将这块知识点好好总结一下供大家分享,共同掌握! 本篇文章在具体介绍Hive与Hbase整合之 ...

  10. [原创]java WEB学习笔记40:简单标签概述(背景,使用一个标签,标签库的API,SimpleTag接口,创建一个自定义的标签的步骤 和简单实践)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...