Description

傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和别人打仗了。 在打仗之前,幽香现在面临一个非常基本的管理问题需要解决。 整个地图是一个树结构,一共有n块空地,这些空地被n-1条带权边连接起来,使得每两个点之间有一条唯一的路径将它们连接起来。在游戏中,幽香可能在空地上增加或者减少一些军队。同时,幽香可以在一个空地上放置一个补给站。 如果补给站在点u上,并且空地v上有dv个单位的军队,那么幽香每天就要花费dv×dist(u,v)的金钱来补给这些军队。由于幽香需要补给所有的军队,因此幽香总共就要花费为Sigma(Dv*dist(u,v),其中1<=V<=N)的代价。其中dist(u,v)表示u个v在树上的距离(唯一路径的权和)。 因为游戏的规定,幽香只能选择一个空地作为补给站。在游戏的过程中,幽香可能会在某些空地上制造一些军队,也可能会减少某些空地上的军队,进行了这样的操作以后,出于经济上的考虑,幽香往往可以移动他的补给站从而省一些钱。但是由于这个游戏的地图是在太大了,幽香无法轻易的进行最优的安排,你能帮帮她吗? 你可以假定一开始所有空地上都没有军队。

Input

第一行两个数n和Q分别表示树的点数和幽香操作的个数,其中点从1到n标号。 接下来n-1行,每行三个正整数a,b,c,表示a和b之间有一条边权为c的边。 接下来Q行,每行两个数u,e,表示幽香在点u上放了e单位个军队(如果e<0,就相当于是幽香在u上减少了|e|单位个军队,说白了就是du←du+e)。数据保证任何时刻每个点上的军队数量都是非负的。

Output

对于幽香的每个操作,输出操作完成以后,每天的最小花费,也即如果幽香选择最优的补给点进行补给时的花费。

Sample Input

10 5
1 2 1
2 3 1
2 4 1
1 5 1
2 61
2 7 1
5 8 1
7 91
1 10 1
3 1
2 1
8 1
3 1
4 1

Sample Output

0
1
4
5
6

HINT

对于所有数据,1<=c<=1000, 0<=|e|<=1000, n<=10^5, Q<=10^5
 
问题就是算带修改带权重心。
考虑用动态树分治来做,建出重心树后就可以保证树高logn了。
那么我们先考虑如何计算一个点到所有点的带权距离(带修改)
对于一个节点Y,它的父亲x将贡献v2+v1*(w(x,y))的权值。
在重心树上不停地向根走,将所有权值累加即可。
那么怎么求重心呢?考虑先将重心设为root,每次更新。
如果当前的重心成了x,注意重心只可能在x最大的子树中。
具体看代码
#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define rep(s,t) for(int i=s;i<=t;i++)
#define ren for(int i=first[x];i;i=next[i])
#define ren2 for(int i=first2[x];i;i=next2[i])
using namespace std;
inline int read() {
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
typedef long long LL;
const int maxn=;
int n,m,first[maxn],next[maxn],es;
struct Edge {int to,dist;}edges[maxn];
void AddEdge(int w,int v,int u) {
edges[++es]=(Edge){v,w};next[es]=first[u];first[u]=es;
edges[++es]=(Edge){u,w};next[es]=first[v];first[v]=es;
}
int first2[maxn],next2[maxn],to[maxn],num[maxn],es2;
void AddEdge2(int u,int v,int w) {
to[++es2]=v;num[es2]=w;next2[es2]=first2[u];first2[u]=es2;
}
int mn[maxn][],Log[maxn],pos[maxn],dep[maxn],cnt;
void dfs(int x,int fa) {
mn[++cnt][]=dep[x];pos[x]=cnt;
ren {
Edge& e=edges[i];
if(e.to!=fa) {
dep[e.to]=dep[x]+e.dist;dfs(e.to,x);
mn[++cnt][]=dep[x];
}
}
}
int dist(int x,int y) {
int ans=dep[x]+dep[y],k;
x=pos[x];y=pos[y];if(x>y) swap(x,y);
k=Log[y-x+];return ans-min(mn[x][k],mn[y-(<<k)+][k])*;
}//In order to get the LCA of x and y for nlogn times,we should use the "LCA-RMQ algorithm" to calculate.
int root,size,s[maxn],f[maxn],vis[maxn];
void getroot(int x,int fa) {
s[x]=;int maxs=;
ren {
Edge& e=edges[i];
if(!vis[e.to]&&e.to!=fa) getroot(e.to,x),s[x]+=s[e.to],maxs=max(maxs,s[e.to]);
}
f[x]=max(maxs,size-s[x]);
if(f[root]>f[x]) root=x;
}
int fa[maxn];
void solve(int x,int F) {
vis[x]=;fa[x]=F;
ren {
Edge& e=edges[i];
if(!vis[e.to]) {
size=f[]=s[e.to];getroot(e.to,root=);
AddEdge2(x,root,e.to);
solve(root,x);
}
}
}
LL sum[maxn],dis1[maxn],dis2[maxn];
//sum1[x]=sigma(y's val) | y is included in x's subtree.
//dis1[x]=sigma(dist(x,y)) | y is included in x's subtree.
//dis2[x]=sigma(dist(fa[x],y)) | y is included in x's subtree.
void add(int x,int v) {
sum[x]+=v;
for(int i=x;fa[i];i=fa[i]) {
int d=dist(fa[i],x);
dis1[fa[i]]+=(LL)d*v;
dis2[i]+=(LL)d*v;
sum[fa[i]]+=v;
}
}
LL cal(int x) {
LL ret=dis1[x];
for(int i=x;fa[i];i=fa[i]) {
int d=dist(fa[i],x);
ret+=dis1[fa[i]]-dis2[i];
ret+=d*(sum[fa[i]]-sum[i]);
}
return ret;
}
LL query(int x) {
LL ans=cal(x);
ren2 {
LL tmp=cal(num[i]);// Consider x's subnode y in previous tree, if the result is smaller than x then the center of gravity must be in y's conquer 's tree.
if(tmp<ans) return query(to[i]);
}
return ans;
}
int main() {
n=read();m=read();
rep(,n-) AddEdge(read(),read(),read());
dfs(,);Log[]=-;
rep(,cnt) Log[i]=Log[i>>]+;
for(int j=;(<<j)<=cnt;j++)
for(int i=;i+(<<j)-<=cnt;i++)
mn[i][j]=min(mn[i][j-],mn[i+(<<j-)][j-]);//pre-process
size=f[]=n;getroot(,root=);
int t=root;solve(root,);root=t;
while(m--) {
int x=read(),v=read();
add(x,v);
printf("%lld\n",query(root));
}
return ;
}

BZOJ3924 [Zjoi2015]幻想乡战略游戏的更多相关文章

  1. BZOJ3924 ZJOI2015 幻想乡战略游戏 【动态点分治】

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

  2. bzoj3924 [Zjoi2015]幻想乡战略游戏 点分树,动态点分

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

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

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

  4. BZOJ3924——[Zjoi2015]幻想乡战略游戏

    0.题意:动态维护带权中心 1.分析:妈的,这题做了一天,mdzzzzzzzzzzzzzzzzzz-.. 这个题是边权,我们首先要将边权转化成点权... 我们维护一个分支结构中到根的距离和,一个分支结 ...

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

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

  6. 【BZOJ3924】幻想乡战略游戏(动态点分治)

    [BZOJ3924]幻想乡战略游戏(动态点分治) 题面 权限题...(穷死我了) 洛谷 题解 考虑不修改 发现一个贪心的做法 假设当前放在当前位置 如果它有一个子树的兵的总数大于总数的一半 那么,放到 ...

  7. 洛谷 P3345 [ZJOI2015]幻想乡战略游戏 解题报告

    P3345 [ZJOI2015]幻想乡战略游戏 题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做 ...

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

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

  9. AC日记——[ZJOI2015]幻想乡战略游戏 洛谷 P3345

    [ZJOI2015]幻想乡战略游戏 思路: 树剖暴力转移: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...

随机推荐

  1. 谷歌、百度、1万ip能赚多少钱?1000IP能够值多少钱呢?

    谷歌.百度.1万ip能赚多少钱?1000IP能够值多少钱呢? (2014-04-03 11:50:52) 转载▼ 标签: 广告联盟 百度联盟 谷歌联盟 ip赚钱       很多在人问:谷歌.百度:1 ...

  2. iOS 一个工程中引用其他工程时要注意Skip Install选项

    当主工程引用其他工程,以便使用他们生成的库的时候,在发布时,主要注意这个选项.这个选项的说明如下 Activating this setting when deployment locations a ...

  3. php对象引用和析构函数的关系

    在php中构造函数和析构函数都属于魔术方法,比如构造函数在某一个类中,当这个类被实例化的时候就会自动调用,而析构函数是在这个类的对象被销毁的时候自动调用,默认情况下是在程序执行结束时自动调用. 如果我 ...

  4. HDU 5754 Life Winner Bo (各种博弈) 2016杭电多校联合第三场

    题目:传送门 题意:一个国际象棋棋盘,有四种棋子,从(n,m)走到(1,1),走到(1,1)的人赢,先手赢输出B,后手赢输出G,平局输出D. 题解:先把从(n,m)走到(1,1)看做是从(1,1)走到 ...

  5. [Ant] Ant之MacroDef—“宏

    转载自:http://lhq1013.iteye.com/blog/1157234 Ant是一个基于Java的跨平台构建工具,它易于使用,并且可扩展.可升级.    MacroDef——“宏”,在An ...

  6. July 24th, Week 31st Sunday, 2016

    Miracles happen every day. 奇迹每天都在发生. Miracles actually happen every day, every moment. You may think ...

  7. RocketMQ最佳实践

    1.RocketMQ中的专业术语 Topic topic表示消息的第一级类型,比如一个电商系统的消息可以分为:交易消息.物流消息...... 一条消息必须有一个Topic. Tag Tag表示消息的第 ...

  8. Eclipse 中Tomcat 启动 与直接启动Tomcat的区别

    这段时间不用Java 了突然发现在用的时候出问题了. 首先现在Eclipse和Tomcat,解压后 如图1所示: 图1: 进入里面的bin文件目录后发现有 如图2所示包含了startup.bat,st ...

  9. 如何 ︰ 执行批量更新和插入使用.NET 提供程序在 C#.NET OpenXML

    https://support.microsoft.com/zh-cn/kb/315968 如何 ︰ 执行批量更新和插入使用.NET 提供程序在 C#.NET OpenXML Email Prin ...

  10. Android悬浮窗注意事项

    一 动画无法运行 有时候,我们对添加的悬浮窗口,做动画的时候,始终无法运行. 那么,这个时候,我们可以对要做动画的View,再添加一个parent,即容器.将要做动画的View放入容器中. 二 悬浮窗 ...