ZJOI2015 幻想乡战略游戏 动态点分治_树链剖分_未调完
Description
傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和别人打仗了。 在打仗之前,幽香现在面临一个非常基本的管理问题需要解决。 整个地图是一个树结构,一共有n块空地,这些空地被n-1条带权边连接起来,使得每两个点之间有一条唯一的路径将它们连接起来。在游戏中,幽香可能在空地上增加或者减少一些军队。同时,幽香可以在一个空地上放置一个补给站。 如果补给站在点u上,并且空地v上有dv个单位的军队,那么幽香每天就要花费dv×dist(u,v)的金钱来补给这些军队。由于幽香需要补给所有的军队,因此幽香总共就要花费为Sigma(Dv*dist(u,v),其中1<=V<=N)的代价。其中dist(u,v)表示u个v在树上的距离(唯一路径的权和)。 因为游戏的规定,幽香只能选择一个空地作为补给站。在游戏的过程中,幽香可能会在某些空地上制造一些军队,也可能会减少某些空地上的军队,进行了这样的操作以后,出于经济上的考虑,幽香往往可以移动他的补给站从而省一些钱。但是由于这个游戏的地图是在太大了,幽香无法轻易的进行最优的安排,你能帮帮她吗? 你可以假定一开始所有空地上都没有军队。
题解:
最近写动态点分治快自闭了QAQ.......
有时间再来写一下题解.
其实我不会告诉你我还没调出来呢QAQ
Code:
// luogu-judger-enable-o2 // luogu-judger-enable-o2 #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) // ,freopen(s".out","w",stdout) #define maxn 300000 #define N 300010 #define ll long long #define inf 0x7f7f7f using namespace std; int n,m,cnt,sn,root; int hd[N],to[N],nx[N],val[N]; void add(int u,int v,int c) { nx[++cnt] = hd[u],hd[u] = cnt,to[cnt] = v,val[cnt] = c; } namespace heavyedge { int fa[N],hson[N],siz[N],top[N],dep[N]; ll dis[N]; void dfs1(int u,int ff) { fa[u] = ff; for(int i = hd[u]; i ; i = nx[i]) { if(to[i] == ff) continue; dep[to[i]] = dep[u] + 1,dis[to[i]] = dis[u] + val[i]; dfs1(to[i],u); siz[u] += siz[to[i]]; if(siz[to[i]] > siz[hson[u]]) hson[u] = to[i]; } } void dfs2(int u,int tp) { top[u] = tp; if(hson[u]) dfs2(hson[u],tp); for(int i = hd[u]; i ; i = nx[i]) { if(to[i] == hson[u] || to[i] == fa[u]) continue; dfs2(to[i],to[i]); } } int LCA(int a,int b) { while(top[a] != top[b]) dep[top[a]] < dep[top[b]] ? b = fa[top[b]]: a = fa[top[a]]; return dep[a] < dep[b] ? a : b; } int main() { dfs1(1,0),dfs2(1,1); return 0; } }; ll Dis(int a,int b) { return heavyedge::dis[a] + heavyedge::dis[b] - (heavyedge::dis[heavyedge::LCA(a,b)] << 1); } int siz[N],vis[N],Fa[N],hto[N],f[N],tmp; ll sumv[N],sumd[N]; void GetRoot(int u,int ff) { siz[u] = 1,f[u] = 0; for(int i = hd[u]; i ; i = nx[i]) { if(vis[to[i]] || to[i] == ff) continue; GetRoot(to[i],u); siz[u] += siz[to[i]]; f[u] = max(f[u],siz[to[i]]); } f[u] = max(f[u],sn - siz[u]); if(f[root] > f[u]) root = u; } void dfs(int u) { vis[u] = 1; for(int i = hd[u]; i ; i = nx[i]) { if(vis[to[i]]) continue; root = 0, sn = siz[to[i]], GetRoot(to[i],u), hto[i] = root,Fa[root] = u, dfs(root); } } #define fax(i) (i + n) void Update(int x,int w) { sumv[x] += w; for(int i = x; Fa[i]; i = Fa[i]) { ll dis = Dis(x, Fa[i]); sumv[Fa[i]] += w; sumd[Fa[i]] += 1ll*dis * w; sumd[fax(i)] += 1ll*dis * w; } } ll calc(int x) { ll res = sumd[x]; for(int i = x; Fa[i]; i = Fa[i]) { ll dis = Dis(x, Fa[i]); res += 1ll*(sumv[Fa[i]] - sumv[i]) * dis; res += sumd[Fa[i]] - sumd[fax(i)]; } return res; } ll Query(int u) { ll tmp = calc(u); for(int i = hd[u]; i ; i = nx[i]) { if(calc(to[i]) < tmp) return Query(to[i]); } return tmp; } int main() { scanf("%d%d",&n,&m); for(int i = 1,a,b,c;i < n; ++i) scanf("%d%d%d",&a,&b,&c),add(a,b,c),add(b,a,c); heavyedge :: main(); f[0] = inf, sn = n, root = 0, GetRoot(1,0),tmp = root,dfs(root), root = tmp; int u,e; while(m--) { scanf("%d%d",&u,&e),Update(u,e),printf("%lld\n",Query(root)); } return 0; }
ZJOI2015 幻想乡战略游戏 动态点分治_树链剖分_未调完的更多相关文章
- [ZJOI2015]幻想乡战略游戏——动态点分治
[ZJOI2015]幻想乡战略游戏 带修改下,边点都带权的重心 随着变动的过程中,一些子树内的点经过会经过一些公共边.考虑能不能对这样的子树一起统计. 把树上贡献分块. 考虑点分治算法 不妨先把题目简 ...
- [BZOJ3924][ZJOI2015]幻想乡战略游戏(动态点分治)
题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和别人打 ...
- P3345 [ZJOI2015]幻想乡战略游戏 动态点分治
\(\color{#0066ff}{ 题目描述 }\) 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越 ...
- 【bzoj3924】[Zjoi2015]幻想乡战略游戏 动态点分治
题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和别人打 ...
- BZOJ 3924: [Zjoi2015]幻想乡战略游戏(动态点分治)
这种动态点分治嘛,GDKOI时听打到了,也有同学讲到了,所以印象比较深刻也就想出来了,然后就在实现方面卡了好久= = 不得不说CLJ说得真的太简单了,实现方面根本没提. 首先我们可以先用树分治构建出这 ...
- BZOJ 3924 / Luogu P3345 [ZJOI2015]幻想乡战略游戏 (动态点分治/点分树)
题意 树的结构不变,每个点有点权,每一条边有边权,有修改点权的操作,设xxx为树中一点.求∑idist(x,i)∗a[i]\sum_idist(x,i)*a[i]i∑dist(x,i)∗a[i]的最 ...
- 洛谷P3345 [ZJOI2015]幻想乡战略游戏 [动态点分治]
传送门 调了两个小时,终于过了-- 凭啥人家代码80行我180行啊!!! 谁叫你大括号换行 谁叫你写缺省源 思路 显然,补给点所在的位置就是这棵树的带权重心. 考虑size已知时如何找重心:一开始设答 ...
- bzoj 3924 [Zjoi2015]幻想乡战略游戏——动态点分治(暴力移动找重心)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3924 度数只有20,所以从一个点暴力枚举其出边,就能知道往哪个方向走. 知道方向之后直接走到 ...
- 【BZOJ3924】[Zjoi2015]幻想乡战略游戏 动态树分治
[BZOJ3924][Zjoi2015]幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网 ...
随机推荐
- PAT 1079. Total Sales of Supply Chain
A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...
- 3. IDEA 的样式设置和快捷键设置
一.样式设置 首先打开IDEA之后,点击任务栏的“File”→Settings 二.设置快捷键 1.首先打开IDEA之后,点击任务栏的“File”. 2.在下拉列表中中选择“Settings” 3.在 ...
- TotoiseSVN使用教程
TortoiseSVN百科 TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录.文件保存在中央版本库,除了能记住文件和目录的每次修改以外, ...
- (14)Spring Boot定时任务的使用【从零开始学Spring Boot】
本文介绍在 Spring Boot 中如何使用定时任务,使用非常简单,就不做过多说明了. com.kfit.base.scheduling.SchedulingConfig: package com. ...
- Spring Boot-整合Mybatis(五)
原始的整合方式 1.添加依赖 <!--mybatis起步依赖--> <dependency> <groupId>org.mybatis.spring.boot< ...
- [bzoj3505][CQOI2014]数三角形_组合数学
数三角形 bzoj-3505 CQOI-2014 题目大意:给你一个n*m的网格图,问你从中选取三个点,能构成三角形的个数. 注释:$1\le n,m\le 1000$. 想法:本来是想着等中考完了之 ...
- magento 的一些Sql查询
1,模拟使用getName()获取产品名称的sql SELECT `value` AS product_name FROM yo_catalog_product_entity_varchar WHER ...
- Linux显示使用命令who(转)
Linux who命令用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者ID.使用的终端机.从哪边连上来的.上线时间.呆滞时间.CPU使用量.动作等等. 使用权限:所有使用者都可使用. 语法 ...
- Java&&(面试题)初始化顺序总结
1 无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out.println(s) ...
- HDU 5355 Cake
HDU 5355 Cake 更新后的代码: 今天又一次做这道题的时候想了非常多种思路 最后最终想出了自觉得完美的思路,结果却超时 真的是感觉自己没救了 最后加了记忆化搜索,AC了 好了先说下思路吧.不 ...