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个 ...
随机推荐
- http主要请求头
一.内容协商 1.Accept:希望服务器返回的数据格式,如下面的:text/javascript, application/javascript, application/ecmascript, a ...
- 【makefile】symbol <函数> : can't resolve symbol 问题分析
调试程序的时候,在linux编译器上可以编译通过,但是编译生成的firmware烧录到板子上的后出现以下异常: can't resolve symbol,无法解析元素符号. review一下code, ...
- Python之模块和包的创建与使用
一.模块的概念 在计算机的开发过程中,随着程序代码越写越多,在一个文件里代码就越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,放在不同的文件里面,这样,每个文件包含的代码就相对 ...
- private关键字
Student.java /* * 学生类 * * 通过对象直接访问成员变量,会存在数据安全问题 * 这个时候,我们就想能不能不让外界对象直接访问成员变量呢? * 答案:能 * 如何实现呢? * pr ...
- Analyzer原理
[常用分词器] SimpleAnalyzer StopAnalyzer WhitespaceAnalyzer StandardAnalyze [TokenStream] she is a studen ...
- 添物不花钱学JavaEE(基础篇)- Java
Java Java是一面向对象语言 Write Once Run Anywhere Designed for easy Web/Internet applications, Mobile Widesp ...
- Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框
Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框 在Android早期的开发中,如果涉及到圆形图片的处理,往往需要借助于第三方的实现,见附录文章1,2.And ...
- Javascript类型转换的规则全面&附有实例
Javascript的变量是松散类型的,它可以存储Javascript支持的任何数据类型,其变量的类型可以在运行时被动态改变.请看示例: 1 2 3 var n = 10; n = "hel ...
- JS基础:函数
函数声明和函数表达式 在 JS 中定义函数的方式有两种:一种是函数声明,一种是函数表达式. 例如: //函数声明 function fun() { ... } //函数表达式 var f = func ...
- 到达时间自动点击按钮弹出提示并跳转【JavaScript实现】
原文发布时间为:2008-10-11 -- 来源于本人的百度文章 [由搬家工具导入] 其实我本来是想 做 在线考试的时候 规定时间到达时候自动交卷的,就想到这个例子了。。。。 代码: <html ...