题目: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. 洛谷 P2051 [AHOI2009]中国象棋

    题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...

  2. Django 视图之CBV

    CBV 所谓的CBV(class base view) 在视图里面,用类的方式来写逻辑 那么对于FBV,CBV有什么优势? CBV(class base views) 就是在视图里使用类处理请求. P ...

  3. Apache Shiro 使用手册(五)Shiro 配置说明(转发:http://kdboy.iteye.com/blog/1169637)

    Apache Shiro的配置主要分为四部分: 对象和属性的定义与配置 URL的过滤器配置 静态用户配置 静态角色配置 其中,由于用户.角色一般由后台进行操作的动态数据,因此Shiro配置一般仅包含前 ...

  4. shell编程2 ---条件判断语句

    shell编程2 一.条件判断语句 1.按照文件类型进行判断 eg:test -e /etc/passwd  或者  [ -e /etc/passwd ]  &&echo yes || ...

  5. 模仿jquery框架源码 -成熟---选择器

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  6. 《程序员代码面试指南》第二章 链表问题 删除中间节点和a/b处节点

    题目 例如 1-2-3-4 删除2,1-2-3-4-5 删除3 例如 a=1,b =2 java代码 /** * @Description:删除中间节点和a/b处节点 * @Author: lizho ...

  7. runtime-分类为什么不生成setter和getter

    前言 前几天有人问我一个问题:为什么分类不能自动创建get set方法.老实说,笔者从来没有去思考过这个问题.于是这次通过代码实践跟runtime源码来探究这个问题. 准备工作 为了能减少输出类数据的 ...

  8. 【leetcode刷题笔记】Maximal Rectangle

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...

  9. 【leetcode刷题笔记】Edit Distance

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

  10. Mac OS下新建文本文档

    ---恢复内容开始--- 介绍 不知道小伙伴们有没有发现这样一件事情:Mac下没有新建文本文档!如果你恰好经常需要新建类似于.cpp,.in,.out等文件的话,每次终端用一堆$ cd命令再加上一句$ ...