BZOJ_3133_[Baltic2013]ballmachine_堆+倍增
BZOJ_3133_[Baltic2013]ballmachine_堆+倍增
Description
有一个装球机器,构造可以看作是一棵树。有下面两种操作:
- 从根放入一个球,只要下方有空位,球会沿着树滚下。如果同时有多个点可以走,那么会选择编号最小的节点所在路径的方向。比如依次在树根
4放2个球,第一个球会落到1,第二个会落到3: .jpg)
- 从某个位置拿走一个球,那么它上方的球会落下来。比如依次拿走
5, 7, 8三个球:
.jpg)
Input
第一行:球的个数N,操作个数Q (N, Q <= 100 000)下面N行:第i个节点的父亲。如果是根,则为0 接下来Q行:op num
op == 1:在根放入num个球op == 2:拿走在位置num的球
Output
保证输入合法
op == 1:输出最后一个球落到了哪里op == 2:输出拿走那个球后有多少个球会掉下来
Sample Input
0
1
2
2
3
3
4
6
1 8
2 5
2 7
2 8
Sample Output
1
3
2
2
可以发现球的位置顺序是固定的,预处理出来每个点应该被放入小球的优先度,然后这个可以把边表排序之后dfs一遍求出。
用一个堆来维护当前没被放入的球的编号。
删除时倍增祖先,找到第一个没被放球的位置即可。
代码:
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define N 200050
priority_queue<int>q;
vector <int> v[N];
int n,T,mn[N],dfn[N],idx[N],tdfn[N],tidx[N],c[N],vis[N],f[21][N],dep[N],rt,son[N];
bool cmp(int x,int y) {
return mn[x]<mn[y];
}
void dfs(int x) {
int i;
int t=v[x].size(); mn[x]=x;
for(i=0;i<t;i++) {
f[0][v[x][i]]=x;
dep[v[x][i]]=dep[x]+1;
dfs(v[x][i]);
mn[x]=min(mn[x],mn[v[x][i]]);
}
sort(&v[x][0],&v[x][t],cmp);
}
void solve(int x) {
int i,t=v[x].size();
for(i=0;i<t;i++) {
solve(v[x][i]);
}
idx[x]=++idx[0];
tidx[idx[0]]=x;
}
int main() {
scanf("%d%d",&n,&T);
int i,x,y,j;
for(i=1;i<=n;i++) {
scanf("%d",&x);
if(!x) rt=i;
else v[x].push_back(i);
}
for(i=1;i<=n;i++) {
q.push(-i);
}
dep[rt]=1;
dfs(rt);
solve(rt);
for(i=1;(1<<i)<=n;i++) {
for(j=1;j<=n;j++) {
f[i][j]=f[i-1][f[i-1][j]];
}
}
int opt;
while(T--) {
scanf("%d%d",&opt,&x);
if(opt==1) {
while(x--) {
y=tidx[-q.top()]; q.pop();
vis[y]=1;
}
printf("%d\n",y);
}else {
int t=x;
for(i=20;i>=0;i--) {
if(vis[f[i][x]]) x=f[i][x];
}
vis[x]=0;
printf("%d\n",dep[t]-dep[x]);
q.push(-idx[x]);
}
}
}
BZOJ_3133_[Baltic2013]ballmachine_堆+倍增的更多相关文章
- [BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆)
[BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆) 题面 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果 ...
- BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...
- 【BZOJ 3133】 3133: [Baltic2013]ballmachine (线段树+倍增)
3133: [Baltic2013]ballmachine Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 148 Solved: 66 Descri ...
- Codeforces 828F Best Edge Weight - 随机堆 - 树差分 - Kruskal - 倍增算法
You are given a connected weighted graph with n vertices and m edges. The graph doesn't contain loop ...
- CF827D Best Edge Weight[最小生成树+树剖/LCT/(可并堆/set启发式合并+倍增)]
题意:一张图求每条边边权最多改成多少可以让所有MST都包含这条边. 这题还是要考察Kruskal的贪心过程. 先跑一棵MST出来.然后考虑每条边. 如果他是非树边,要让他Kruskal的时候被选入,必 ...
- [CF1051F]The Shortest Statement_堆优化dij_最短路树_倍增lca
The Shortest Statement 题目链接:https://codeforces.com/contest/1051/problem/F 数据范围:略. 题解: 关于这个题,有一个重要的性质 ...
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
- BZOJ 2819: Nim dfs序维护树状数组,倍增
1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...
- BZOJ3133[ballmachine]——倍增+优先队列
题目描述 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果同时有多个点可以走,那么会选择编号最小的节点所在路径的方向.比如依次在树根4放2个 ...
随机推荐
- Laravel核心解读 -- 扩展用户认证系统
扩展用户认证系统 上一节我们介绍了Laravel Auth系统实现的一些细节知道了Laravel是如何应用看守器和用户提供器来进行用户认证的,但是针对我们自己开发的项目或多或少地我们都会需要在自带的看 ...
- LeetCode1---两数之和
import java.util.Arrays;import java.util.HashMap;import java.util.Map; /** *功能描述 :两数之和 * @author lkr ...
- java获取类的全类名----类名.class.getName()的作用是获取这个类的全类名
类名.class.getName()的作用是获取这个类的全类名
- 添物零基础到架构师(基础篇) - JavaScript
JavaScript是什么? JavaScript是web开发必须学习的,ECMAScript是其规则来源. JavaScript的历史 Developed by Brendan Eich of Ne ...
- Android BGABadgeView:BGABadgeLinearLayout以整体线性布局作为BadgeView(3)
Android BGABadgeView:BGABadgeLinearLayout以整体线性布局作为BadgeView(3) Android BGABadgeView不仅可以把某个View作为B ...
- restful(2):视图
视图部分小结: # as_view()中的参数:利用参数(一个字典)来指定什么方式用什么方法来执行(哪种请求方式由哪种内部方法来执行) # 例如 Retrieve时,需要在对应的url中添加有名分组 ...
- JVM(三):深入分析Java字节码-上
JVM(三):深入分析Java字节码-上 字节码文章分为上下两篇,上篇也就是本文主要讲述class文件存在的意义,以及其带来的益处.并分析其内在构成之一 ---字节码,而下篇则从指令集方面着手,讲解指 ...
- java.lang.RuntimeException: JPedal Trial has now expired
具体提示: java.lang.RuntimeException: JPedal Trial has now expired jpedal-server-trial.jar jar包过期了,jpeda ...
- openstack setup demo Identity service
openstack Identity service 名叫keystone.它提供了用户校验,以及服务目录查询(即列出所有的服务以及相关信息)等功能. keystone 主要包含以下几个部分 Serv ...
- python中的is判断引用的对象是否一致,==判断值是否相等
python中的is判断引用的对象是否一致,==判断值是否相等 a = 10 b = 20 list = [1,2,3,4,5] print(a in list) print(b not in lis ...