洛谷题目

看到题面,很容易就想到,这是要你找树上的重心,只不过这个重心是在带边权的树上

所以对于这个我们在树上找这个重心

一开始我想的是,我要更新权值,然后把每个点的答案更新一下

就取最大值,这好像是O(....),我也不会算这个复杂度,好像太大了

后来去学习了一下,点分树;;

知道了有点分树这个东西,立刻就想到

如果我们在点分树上寻找这个带权重心,是不是就可以保证复杂度了???

我先去打了板子,就是上一篇博客,一开始我就想用树状数组

然后我发现自己狭隘了,用树状数组根本维护不了每个点的军队数量

然后我就想别的办法,想不出来,颓一发题解,可是刚看到题解,他竟然没用树状数组,而是维护了两个数组,一个存答案,一个存数量

和树状数组的思想类似,还是要维护两个值,维护自己的,维护爹的,不过这里还有另外一个套路

  ans加上爹的,减去自己的,还要加上x到爹的价值

然后还有一道题也是这样维护,没啥意思,不过那个题调了一晚上加上一早起(MLE+TLE),为啥呢? 手残打错一个变量;

所以这个题就这样做,加入军队就是在点分树上更新,然后记录一下第一次树的重心,然后由这个树根沿着点分树的父子关系向下搜索

所以我们还要开另外一个临界表来存储他们的儿子;

记得我们判断答案是否在他这个儿子里,要在原树上判断,一开始就在点分树上判断,WA了好几遍

然后搜索的时候,要回到点分树上搜索。。。。

  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define int long long
4 #define re register int
5 const int N=100005;
6 int n,m;
7 int to[N<<1],nxt[N<<1],val[N<<1],head[N],rp;
8 void add_edg(int x,int y,int z){
9 to[++rp]=y;val[rp]=z;nxt[rp]=head[x];head[x]=rp;
10 }
11 int siz[N],son[N],dep[N],len[N],fa[N],top[N];
12 void dfs1(int x,int f){
13 siz[x]=1;
14 dep[x]=dep[f]+1;fa[x]=f;
15 for(re i=head[x];i;i=nxt[i]){
16 int y=to[i];
17 if(y==f)continue;
18 len[y]=len[x]+val[i];
19 dfs1(y,x);
20 siz[x]+=siz[y];
21 if(!son[x]||siz[y]>siz[son[x]])son[x]=y;
22 }
23 }
24 void dfs2(int x,int f){
25 top[x]=f;
26 if(son[x])dfs2(son[x],f);
27 for(re i=head[x];i;i=nxt[i]){
28 int y=to[i];
29 if(y==fa[x]||y==son[x])continue;
30 dfs2(y,y);
31 }
32 }
33 int get_lca(int x,int y){
34 while(top[x]!=top[y]){
35 if(dep[top[x]]<dep[top[y]])swap(x,y);
36 x=fa[top[x]];
37 }
38 return dep[x]<dep[y]?x:y;
39 }
40 int get_dis(int x,int y){
41 return len[x]+len[y]-2*len[get_lca(x,y)];
42 }
43 int rt,alsiz,mx,ms[N];
44 bool vis[N];
45 void get_rt(int x,int f){
46 siz[x]=1;ms[x]=0;
47 for(re i=head[x];i;i=nxt[i]){
48 int y=to[i];
49 if(y==f||vis[y])continue;
50 get_rt(y,x);
51 siz[x]+=siz[y];
52 ms[x]=max(ms[x],siz[y]);
53 }
54 ms[x]=max(ms[x],alsiz-siz[x]);
55 if(ms[x]<mx)mx=ms[x],rt=x;
56 }
57 void get_siz(int x,int f){
58 siz[x]=1;
59 for(re i=head[x];i;i=nxt[i]){
60 int y=to[i];
61 if(y==f||vis[y])continue;
62 get_siz(y,x);
63 siz[x]+=siz[y];
64 }
65 }
66 int newfa[N];
67 int t[N<<1],nx[N<<1],he[N<<1],va[N<<1],r;
68 void add_ed(int x,int y,int z){
69 t[++r]=y;
70 va[r]=z;
71 nx[r]=he[x];
72 he[x]=r;
73 }
74 void pre_dfs(int x){
75 vis[x]=1;get_siz(x,0);
76 for(re i=head[x];i;i=nxt[i]){
77 //cout<<"sb"<<rt<<endl;
78 int y=to[i];
79 if(vis[y])continue;
80 alsiz=mx=siz[y];get_rt(y,0);
81 add_ed(x,y,rt);
82 newfa[rt]=x;pre_dfs(rt);
83 }
84 }
85 int sum1[N],sum2[N];
86 int siz1[N],siz2[N];
87 void get_up(int x,int v){
88 for(re i=x;i;i=newfa[i])sum1[i]+=get_dis(i,x)*v,siz1[i]+=v;
89 for(re i=x;newfa[i];i=newfa[i])sum2[i]+=get_dis(newfa[i],x)*v,siz2[i]+=v;
90 }
91 int get_sum(int x){
92 int ret=sum1[x];
93 for(re i=x;newfa[i];i=newfa[i]){
94 ret+=sum1[newfa[i]];
95 ret-=sum2[i];
96 ret+=get_dis(newfa[i],x)*(siz1[newfa[i]]-siz2[i]);
97 }
98 return ret;
99 }
100 int get_ans(int x){
101 int ret=get_sum(x);
102 for(re i=he[x];i;i=nx[i]){
103 if(get_sum(t[i])<ret)return get_ans(va[i]);
104 }
105 return ret;
106 }
107 signed main(){
108 scanf("%lld%lld",&n,&m);
109 for(re i=1;i<n;i++){
110 int x,y,z;
111 scanf("%lld%lld%lld",&x,&y,&z);
112 add_edg(x,y,z);add_edg(y,x,z);
113 }
114 dfs1(1,0);
115 dfs2(1,1);
116 alsiz=mx=n;
117 get_rt(1,0);
118 //cout<<rt<<endl;
119 pre_dfs(rt);
120 memset(vis,0,sizeof(vis));
121 alsiz=mx=n;
122 get_rt(1,0);
123 //cout<<rt<<endl;
124 for(re i=1;i<=m;i++){
125 int x,y;
126 scanf("%lld%lld",&x,&y);
127 get_up(x,y);
128 //cout<<rt<<" ";
129 printf("%lld\n",get_ans(rt));
130 }
131 }

所以对于点分树的题,第一找好这个题寻找的是啥

第二搞对容斥,就上面那个公式

第三打代码得细心,细节太多了

这类题多会求lca,我习惯用树链剖分,好大也好看

注意距离和深度不是一回事,找lca用深度,找dis用距离(权值);

<题解>幻想乡战略游戏的更多相关文章

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

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

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

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

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

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

  4. LOJ2135 「ZJOI2015」幻想乡战略游戏

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

  5. LOJ #2135. 「ZJOI2015」幻想乡战略游戏

    #2135. 「ZJOI2015」幻想乡战略游戏 链接 分析: 动态点分治,求加权重心,带修改. 考虑如果知道了一个点s,如何求答案,那么首先可以点分治的思想,求每个联通块内所有点到分治中心距离和,然 ...

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

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

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

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

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

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

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

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

随机推荐

  1. Windows PE 第十二章 PE变形技术

    PE变形技术 这章东西太多,太细了.这里我只记录了一些重点概念.为后面学习做铺垫. PE变形:改变PE结构之后,PE加载器依然可以成功加载运行我们的程序. 一 变形常用技术: 结构重叠技术.空间调整技 ...

  2. 快速运行cmd

    方法一 运行 windows+r 输入cmd 指定要手动输入cd ...... 方法二 文件地址栏 在指定路径在文件地址栏前面输入cmd 方法三 shift+鼠标右键 打开到指定文件夹,shift+鼠 ...

  3. docker学习之使用 DockerFile 构建镜像并搭建 swarm+compose 集群

    题目要求 (1)将springboot应用程序打成jar包:Hot.jar (2)利用dockerfile将Hot.jar构建成镜像 (3)构建 Swarm 集群 (4)在 Swarm 集群中使用 c ...

  4. Windows进程间通讯(IPC)----管道

    管道的分类 管道其实际就是一段共享内存,只不过Windows规定需要使用I/O的形式类访问这块共享内存,管道可以分为匿名管道和命名管道. 匿名管道就是没有名字的管道,其支持单向传输数据,如果需要双向传 ...

  5. 有趣的css—简单的下雨效果2.0版

    简单的下雨效果2.0版 前言 笔者上一篇发布的文章有趣的css-简单的下雨效果中有位老哥给我提了一个很棒的建议,大致意思是波纹应该产生于雨滴的消失处. 这是按照老哥的建议完善后的效果图: 由于我制作G ...

  6. Pytorch_Part2_数据模块

    VisualPytorch beta发布了! 功能概述:通过可视化拖拽网络层方式搭建模型,可选择不同数据集.损失函数.优化器生成可运行pytorch代码 扩展功能:1. 模型搭建支持模块的嵌套:2. ...

  7. composer 更新命令及常用命令

    composer 安装 官方地址:https://getcomposer.org/download/ 下载地址:https://getcomposer.org/Composer-Setup.exe 下 ...

  8. jQuery 实现 全选/全不选/反选

    <button id="getall" class="btn btn-warning">全选</button><button id ...

  9. 1Spring注入小结

    Spring注入小结 (在Application.xml中) Spring学习笔记 周芋杉2021/5/14 1.基本注入类型注入 注入前的准备 <bean id="#配置文件的唯一标 ...

  10. .NET程序崩溃了怎么抓 Dump ? 我总结了三种方案

    一:背景 1. 讲故事 最近几天接到了几个crash的求助,可能这几个朋友没玩过怎么去生成dump,只能手把手教,感觉也不是一个办法,所以有必要总结一下,后续再有朋友咨询的话,我就可以把这篇文章丢过去 ...