宫水三叶是一个喜欢玩游戏的女孩子,但是这题和三叶没什么关系。

有一张地图,这张地图描述一个国家。地图上面有 n n n 个点,每一个点有一个值 f i f_i fi​ ,表示点 i i i 向点 f i f_i fi​ 连接了一条长度为 1 1 1 的有向边。最后保证 n n n 个点连接成一棵根为 1 1 1 的内向树。

每一个节点上都有一个村庄,每一个村庄上都有人居住。

国家打算建立 k k k 个避难所,每一个避难所设立在一个村庄中。如果某一天国家发生了灾难,那么所有村庄的人都会沿着边以每单位时间走长度为 1 1 1 的路程的速度往祖先走,直到走到一个有避难所的村庄。当所有人都躲进避难所后,则本次避难完成。从所有人开始移动到避难完成的用时为这次避难的用时。

因为国家并不确定有多少费用可以投资到建立避难所中,所有你需要对所有的 1 ≤ k ≤ n 1\le k \le n 1≤k≤n ,都计算一遍避难的最小用时。

形式化的说:给定一棵树 T = ( V , E ) T=(V,E) T=(V,E) ,其中 1 1 1 为根节点,你可以选择一个关键点集合 S S S。定义函数 f ( u , v ) f(u,v) f(u,v) ,如果 v v v 是 u u u 的祖先或 u = v u=v u=v,则 f ( u , v ) = d e p t h ( u ) − d e p t h ( v ) f(u,v)=depth(u)-depth(v) f(u,v)=depth(u)−depth(v) ,否则 f ( u , v ) = ∞ f(u,v)=\infty f(u,v)=∞。而 v a l u e ( S ) = m a x i = 1 n m i n j ∈ S f ( i , j ) value(S)=max_{i=1}^{n} min_{j\in S} f(i,j) value(S)=maxi=1n​minj∈S​f(i,j)。对于每一个 1 ≤ k ≤ n 1\le k \le n 1≤k≤n,你需要在所有 ∣ S ∣ = k |S|=k ∣S∣=k 中选择 v a l u e ( S ) value(S) value(S) 最小的那个集合,并输出 v a l u e ( S ) value(S) value(S) 。

第一行一个整数 n n n 。

第二行 n n n 个整数,第 i i i 个整数为 f i + 1 f_{i+1} fi+1​ 。

由于输出过大,你只需要输出对于所有 1 ≤ k ≤ n 1\le k \le n 1≤k≤n 的 k k k 的答案的总和即可。

此操作仅为了减小输出量,标程并不依赖此特性。

样例输入 1

3
1 2

样例输出 1

3

样例输入 2

3
1 1

样例输出 2

2

样例数据 3

见下发文件。

本题采用捆绑测试。

对于所有数据,满足 1 ≤ n ≤ 2 × 1 0 5 , 1 ≤ f i < i 1\le n \le 2\times 10^5,1\le f_i<i 1≤n≤2×105,1≤fi​<i。

子任务编号 n n n 特殊性质 分值
1 1 1 ≤ 20 \le 20 ≤20 10 10 10
2 2 2 ≤ 300 \le 300 ≤300 20 20 20
3 3 3 ≤ 2000 \le 2000 ≤2000 25 25 25
4 4 4 ≤ 2 × 1 0 5 \le 2\times 10^5 ≤2×105 f i = i − 1 f_i=i-1 fi​=i−1 5 5 5
5 5 5 ≤ 2 × 1 0 5 \le 2\times 10^5 ≤2×105 40 40 40

题解:
枚举答案,算出每个答案对应的最小避难所数就可以得到答案了。
再考虑如何求解。
假设我们当前答案为 l l l,那么贪心可得每次取最深的点,把他深度差为 l l l 的祖先的子树全部删掉,用线段树维护。
总时间复杂度为 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n)

#include<bits/stdc++.h>
#define N 200005
#define A p<<1
#define B p<<1|1
using namespace std;
inline int read(){int x=0,f=1;char s=getchar();while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}while(s>='0'&&s<='9'){x=(x<<3)+(x<<1)+s-'0';s=getchar();}return x*f;
}
int tot=1,head[N],ver[N<<1],nex[N<<1];
inline void add(int x,int y){nex[++tot]=head[x];head[x]=tot;ver[tot]=y;
}
int ans[N],f[N][21],T=20,dep[N],dfn[N],odfn[N],dfs_num,to[N];
void dfs(int x,int las){dfn[x]=++dfs_num;to[dfs_num]=x;for(int i=head[x];i;i=nex[i]){int y=ver[i];if(y==las)continue;dep[y]=dep[x]+1;f[y][0]=x;for(int j=1;j<=T;++j)f[y][j]=f[f[y][j-1]][j-1];dfs(y,x);}odfn[x]=dfs_num;
}
struct node{int x,dep;
}d[N];
bool cmp(node a,node b){return a.dep>b.dep;}
inline int get(int x,int to){for(int i=T;i+1;--i)if(dep[f[x][i]]>=to)x=f[x][i];return x;
}
struct seg{int l,r,b,maxn,pos;
}t[N<<2];
inline void up(int p){t[p].maxn=0;t[p].pos=0;if(!t[A].b&&t[p].maxn<t[A].maxn)t[p].maxn=t[A].maxn,t[p].pos=t[A].pos;if(!t[B].b&&t[p].maxn<t[B].maxn)t[p].maxn=t[B].maxn,t[p].pos=t[B].pos;
}
void build(int p,int l,int r){t[p].l=l,t[p].r=r,t[p].b=0,t[p].maxn=0,t[p].pos=0;if(l==r){t[p].maxn=dep[to[l]],t[p].pos=to[l];return ;}int mid=(l+r)>>1;build(A,l,mid);build(B,mid+1,r);up(p);
}
void change(int p,int tl,int tr,int val){if(t[p].l>=tl&&t[p].r<=tr){t[p].b+=val;return ;}int mid=(t[p].l+t[p].r)>>1;if(tl<=mid)change(A,tl,tr,val);if(tr>mid)change(B,tl,tr,val);up(p);
}
int q[N],qt;
int main(){//  freopen("tree.in","r",stdin);
//  freopen("tree.out","w",stdout);int n=read();for(int i=2;i<=n;++i){int x=read();add(x,i);add(i,x);}dep[1]=1;dfs(1,0);build(1,1,dfs_num);//cout<<1<<endl;for(int i=0;i<=n;++i)ans[i]=n;//cout<<dfn[1]<<" "<<odfn[1]<<" "<<get(1,1)<<endl;//change(1,1,3,1);//cout<<t[1].pos<<endl;//change(1,3,3,1);//cout<<t[1].pos<<endl;for(int l=0;l<=n;++l){int now=0;qt=0;//cout<<l<<":"<<endl;int cnt=5;while(t[1].b==0){//cout<<t[1].pos<<endl;int x=t[1].pos,to=max(1,dep[x]-l),y=get(x,to);now++;//cout<<x<<" "<<to<<" "<<y<<endl;q[++qt]=y;change(1,dfn[y],odfn[y],1);}if(!t[1].b)++now;//cout<<l<<" "<<now<<endl;for(int j=1;j<=qt;++j){change(1,dfn[q[j]],odfn[q[j]],-1);}ans[now]=min(ans[now],l);}for(int i=2;i<=n;++i)ans[i]=min(ans[i-1],ans[i]);for(int i=2;i<=n;++i)ans[i]=ans[i-1]+ans[i];printf("%d\n",ans[n]);return 0;
}/*
3
1 2
*/

DTOJ#5010. 避难所选址问题相关推荐

  1. 电动汽车充电站的最优选址matlab程序

    ​摘要:以规划期内充电站的总成本 (包括投资.运行和维护成本)和网损费用之和最小为目标,考虑了相关的约束条件,构造了电动汽车充电站最优规划的数学模型, 关键词:电动汽车:充电站:选址和定容 1 充电站 ...

  2. CSP 201912-2 回收站选址 python实现+详解

    试题 代码 # 读入点的个数 n = int(input())# 创建字典,键为点的坐标,值为true,存放所有点 dict = {} for i in range(n):x, y = [int(m) ...

  3. gis中的擦除_GIS案例分析 | 公园建设选址

    题目: 某市准备建立一公园,请利用GIS空间分析方法确定适合建立公园的区域.要求该公园必须相对安静(离公路0.2公里之外)且交通方便(离公路0.8公里之内) ,公园最好依附在大小适中的天然河流上(即河 ...

  4. 解题报告 - 牛客练习赛63 C - 牛牛的揠苗助长(货仓选址+二分)

    链接:https://ac.nowcoder.com/acm/contest/5531/C 来源:牛客网 题目描述 牛牛有一块长度大小为n的菜园,他首先对这块菜园从1到n进行了编号,每一块地分别为1号 ...

  5. 医院选址问题--数据结构课程设计

    2019年12月份的课程设计. 问题描述: n个村庄之间的路径用有向加权图表示,要从这n个村庄中选择一个村庄建立一所医院,问这所医院应建在哪个村庄,能使所有的村庄都离这家医院最近(能使离医院最远的村庄 ...

  6. 黄埔大学,选址定了!

    消息来源:广州黄埔发布 编辑:双一流高校 3月24日,微信公众号"广州黄埔发布"公布消息:黄埔大学项目选址知识城科教创新区. 今年1月22日,黄埔区一届七次党代会召开.会议期间,黄 ...

  7. FAST选址与三维仿真模拟研究

    1993年国际无线电联大会上, 包括中国在内的10国天文学家提出共同建造接收面积为一平方公里的阵国际大射电望远镜(Square Kilometer Array,简称SKA)计划.从1994年开始,以国 ...

  8. bzoj[1835][ZJOI2010]base 基地选址

    bzoj[1835][ZJOI2010]base 基地选址 标签: 线段树 DP 题目链接 题解 这个暴力DP的话应该很容易看出来. dp[i][j]表示造了i个通讯站,并且j是第i个的最小费用. \ ...

  9. Android中级篇之百度地图SDK v3.5.0-一步一步带你仿各大主流APP地图定位移动选址功能

    from: http://blog.csdn.net/y1scp/article/details/49095729 定位+移动选址 百学须先立志-学前须知: 我们经常在各大主流APP上要求被写上地址, ...

最新文章

  1. outlook qr码在哪里_明日方舟兑换码在哪里输入 附1200合成玉兑换码
  2. Luogu P5244 [USACO2019Feb Platinum] Mowing Mischief (动态规划、决策单调性)
  3. 道路交通安全违法行为图像取证技术规范_海康移动取证方案中的设备介绍
  4. 论文小综 | 文档级关系抽取方法(下)
  5. matlab 贝叶斯工具箱,matlab的BNT贝叶斯工具箱错误求教
  6. 【转】阿里巴巴性能测试规划思路
  7. Excel批量转Word
  8. c语言表达ch是大写英文字母,如何用C语言输出26个英文字母和其ascii码的对照表...
  9. 基于STM32的人体红外测温
  10. QT上位机学习(一)
  11. 线性代数笔记29——正定矩阵和最小值
  12. 弘辽科技:拼多多超时发货罚款规则是什么?具体介绍
  13. Revit平台盗版软件的陷阱与风险
  14. python爬虫之selenium的使用
  15. 数据库组成和存储引擎
  16. windows下服务器的数据的迁移解决方案
  17. CIDR地址规划方法
  18. E.03.12 For Planet Earth, No Tourism is a Curse and a Blessing
  19. 学习MySQL看这一篇就够了
  20. 如何快速修复谷歌浏览器扩展插件频繁损坏问题

热门文章

  1. 个人项目总结-瑞吉外卖/传智健康/黑马点评
  2. 关于mac双系统安装SQL Server卡在starting server的解决办法
  3. Toronto Research Chemicals丨艾美捷 链格孢酚
  4. 学了这么久编程,你还分不清编译型语言和解释型语言?他们的区别你全知道吗?
  5. 青海这个不起眼的小镇,竟藏着一个千万千瓦级光伏发电基地
  6. C语言随机生成1到50中7个数,c语言生成50个随机数,对随机数进行快速排序。
  7. jQuery插件使用总结六:nice validator表单验证
  8. 排序算法的稳定性判断原则及其意义
  9. c++算法训练(4)
  10. Python队列总结以及求队列元素平均数的方法