Time Limit: 100 Sec  Memory Limit: 256 MB
Submit: 817  Solved: 376

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<=105, Q<=105

Source

树 动态树分治

询问树的加权重心

可以发现这么一个性质:随便选一个点,如果加权重心不在当前点,那么从当前点往加权重心走,花费肯定单调减小。

从上次的答案开始走,用动态点分治维护和查询将当前点作为补给站的花费,然后暴力枚举走向哪个方向

qsum里i少减了一个1,调了俩小时

  1 /*by SilverN*/
  2 #include<algorithm>
  3 #include<iostream>
  4 #include<cstring>
  5 #include<cstdio>
  6 #include<cmath>
  7 #include<vector>
  8 #define LL long long
  9 using namespace std;
 10 const int INF=0x3f3f3f3f;
 11 const int mxn=120010;
 12 int read(){
 13     int x=0,f=1;char ch=getchar();
 14     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 15     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
 16     return x*f;
 17 }
 18 //inline int max(int a,int b){return a>b?a:b;}
 19 //inline LL max(LL a,LL b){return a>b?a:b;}
 20 //inline int min(int a,int b){return a<b?a:b;}
 21 //inline LL min(LL a,LL b){return a<b?a:b;}
 22 struct edge{
 23     int v,nxt,w;
 24 }e[mxn<<1];
 25 int hd[mxn],mct=0;
 26 void add_edge(int u,int v,int w){
 27     e[++mct].v=v;e[mct].nxt=hd[u];e[mct].w=w;hd[u]=mct;return;
 28 }
 29 int sz[mxn],mc[mxn],rt=0,smm;
 30 //int f[mxn][20];
 31 bool vis[mxn];
 32 void DFS_sz(int u,int fa){
 33     sz[u]=1;mc[u]=0;
 34     for(int i=hd[u],v;i;i=e[i].nxt){
 35         v=e[i].v;
 36         if(v==fa || vis[v])continue;
 37         DFS_sz(v,u);
 38         sz[u]+=sz[v];
 39         mc[u]=max(mc[u],sz[v]);
 40     }
 41     mc[u]=max(mc[u],smm-sz[u]);
 42     if(mc[u]<=mc[rt])rt=u;
 43     return;
 44 }
 45 int dis[mxn][20],act[mxn];
 46 int g[mxn][20];//ansi
 47 LL cost1[mxn],cost2[mxn];
 48 int num1[mxn],num2[mxn];
 49 //
 50 void getship(int x,int fa,int an,int dist){
 51 //        printf("x:%d  fa:%d an:%d dist:%d\n",x,fa,an,dist);
 52     for(int i=hd[x];i;i=e[i].nxt){
 53         int v=e[i].v;
 54         if(v==fa || vis[v])continue;
 55         g[v][++act[v]]=an;//新一级祖先
 56         dis[v][act[v]]=dist+e[i].w;//距离
 57         getship(v,x,an,dist+e[i].w);
 58     }
 59     return;
 60 }
 61 //
 62 LL nowans=0;int nowpos=0;
 63 int a[mxn];//军队人数
 64 //
 65 void solve(int x){
 66 //    printf("solve:%d\n",x);
 67     vis[x]=1;
 68     getship(x,0,x,0);
 69     g[x][++act[x]]=x;
 70     for(int i=hd[x];i;i=e[i].nxt){
 71         int v=e[i].v;
 72         if(vis[v])continue;
 73         smm=sz[v];
 74         rt=0;
 75         DFS_sz(v,x);
 76         solve(rt);
 77     }
 78     return;
 79 }
 80 void update(int u,int E){
 81     num1[u]+=E;
 82     for(int i=act[u];i>1;i--){
 83 //        int dist=dis[g[u][i]][act[g[u][i]]-1];
 84         int dist=dis[u][i-1];
 85         cost2[g[u][i]]+=(LL)dist*E;
 86         cost1[g[u][i-1]]+=(LL)dist*E;
 87         num2[g[u][i]]+=E;
 88         num1[g[u][i-1]]+=E;
 89     }
 90     return;
 91 }
 92 LL qsum(int x){
 93 //    printf("Qsum:%d   \n",x);
 94     LL res=cost1[x];
 95     for(int i=act[x];i>1;i--){
 96         LL dist=dis[x][i-1];
 97         res+=cost1[g[x][i-1]]-cost2[g[x][i]];
 98         res+=(LL)dist*(num1[g[x][i-1]]-num2[g[x][i]]);
 99     }
100     return res;
101 }
102 void Move(int x,int from){
103 //    printf("move:%d\n",x);
104     for(int i=hd[x];i;i=e[i].nxt){
105         int v=e[i].v;
106         if(v==from)continue;
107         LL co=qsum(v);
108         if(co<nowans){
109             nowans=co;
110             nowpos=v;
111             Move(v,x);
112             break;
113         }
114     }
115     return;
116 }
117 int n,Q;
118 int main(){
119 //    freopen("in.txt","r",stdin);
120 //    freopen("zjoi15_tree1.in","r",stdin);
121 //    freopen("zjoi15_tree1.out","w",stdout);
122     int i,j;
123     n=read();Q=read();
124     int a,b,c,u,e;
125     for(i=1;i<n;i++){
126         a=read();b=read();c=read();
127         add_edge(a,b,c);
128         add_edge(b,a,c);
129     }
130     mc[rt=0]=INF;
131     smm=n;
132     DFS_sz(1,0);
133     int rot=rt;
134     solve(rt);
135     nowpos=rot;
136     while(Q--){
137         u=read();e=read();
138         update(u,e);
139         nowans=qsum(nowpos);
140         Move(nowpos,0);
141         printf("%lld\n",nowans);
142     }
143     return 0;
144 }

Time Limit: 100 Sec  Memory Limit: 256 MB
Submit: 817  Solved: 376
[Submit][Status][Discuss]

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<=105, Q<=105

Source

转载于:https://www.cnblogs.com/SilverNebula/p/6723342.html

Bzoj3924 [Zjoi2015]幻想乡战略游戏相关推荐

  1. BZOJ3924 : [Zjoi2015]幻想乡战略游戏

    对于一个点,要求出它到所有点的带权距离和,只需记录下树分治的结构然后查询即可. 修改$O(\log n)$,查询$O(\log n)$. 到所有点带权距离和最小的点显然是这棵树的带权重心. 以1号点为 ...

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

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

  3. P3345 [ZJOI2015]幻想乡战略游戏

    P3345 [ZJOI2015]幻想乡战略游戏 带修改带权重心 这是经典的树上寻找关键点的题目,我们使用点分治处理这个问题,因为点分治的特性,就相当于在树上二分了.但是这与倍增不同,倍增只是在链上二分 ...

  4. [ZJOI2015] 幻想乡战略游戏——树链剖分

    [ZJOI2015]幻想乡战略游戏 题解 由于所有边的边权是正整数,所以可以发现任何时刻每个点的答案是从最优的点往周围递增的.如果有平台,那么一定是在最优点的连通块那儿. 我们先考虑如何快速求每个点的 ...

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

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

  6. luogu_P3345[zjoi2015]幻想乡战略游戏

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

  7. [zjoi2015]幻想乡战略游戏

    前言 略略略 题目相关 链接 题目大意 给出一棵树,每次修改一个点的权值,维护一个带权重心 啥是带权重心? 设点iii的值为ViV_iVi​我们要选一个点uuu,每个点对应一个值: ∑v=1nVv∗d ...

  8. [ZJOI2015] 幻想乡战略游戏(树链剖分 + 线段树二分 + 带权重心)

    problem luogu-P3345 solution 这是一个带权重心的题,考察动态点分治.点分治?呵,不可能的,这辈子都不可能写点分治 我们重新考虑重心的性质:以这个点为根时,所有子树的大小不会 ...

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

    二刷这题 在树上寻找带点权和边权的重心,考虑在原树上怎么做: 假设当前答案在根节点 uuu,考虑移动到子节点 vvv,贡献变化是 wu,v∗(tot−2sumv)w_{u,v} * (tot - 2s ...

最新文章

  1. Flutter开发之HTTP网络请求:Http库(27)
  2. Linux协议栈(7)——网络层实现
  3. x9此计算机上没有hasp_为什么我在别人电脑上好装mastercam9,在自己电脑装不成功,它没有出现什么HASP驱动安装的提示,为什么...
  4. ABAP Create Decision Step in Workflow
  5. excel怎么设置打印区域_别再浪费打印纸了!这样设置,Excel表格再大都能打印成一页!...
  6. php的变量、传值、传址、销毁变量
  7. 玩转Mybatis —— 一个小demo,带你快速入门Mybatis
  8. 计算机网络——数据链路层的概述
  9. python测开面试题_python十道经典面试题,测试你的python功底!
  10. python dll注入 网络_python – 检测反射型DLL注入
  11. 团队解散,项目被否,我苦修三年终将数据平台落地
  12. CentOS 7在虚拟机上安装之后没有桌面问题
  13. mysql配置文件编写_MySQL5.7.28 配置文件编写
  14. cadence 常见pcb电阻_不加端接电阻的快乐,你们绝对想象不到!
  15. jenkins教程菜鸟_jenkins 入门教程(上)
  16. HUSTOJ配置文件解释
  17. 奶粉php小蛋白易消化,揭开“小分子”奶粉真面目:真值得买还是瞎忽悠?
  18. CorelDRAW VBA - 发布(导出)PDF文档
  19. 前端模板引擎 -- Freemarker
  20. 阴阳师辅助(基于按键精灵)

热门文章

  1. php 下载限制,php实现限制文件下载速度的代码实例
  2. 强制生成32位arm程序_ARM版本系列及家族成员梳理
  3. wxpython制作表格界面_wxpython入门第二步(布局)
  4. python可视化神器_详解Python可视化神器Yellowbrick使用
  5. 获取字符串中的.前面的长度_算法连载之求解不含有重复字符的最长子串长度...
  6. 孤灯php加密,PHP实现观察者模式
  7. 华为新系统鸿蒙有哪些手机_华为鸿蒙OS系统传来新消息!外媒宣布:未来几年内华为手机都将无缘...
  8. 天水市一中2021高考成绩查询,天水高中成绩排名2021,天水中考分数线排行榜
  9. java annotation入门_JAVA - Annotation 注解 入门
  10. request如何setParamter