BZOJ3133[ballmachine]——倍增+优先队列
题目描述
有一个装球机器,构造可以看作是一棵树。有下面两种操作:
- 从根放入一个球,只要下方有空位,球会沿着树滚下。如果同时有多个点可以走,那么会选择编号最小的节点所在路径的方向。比如依次在树根
4放2个球,第一个球会落到1,第二个会落到3: .jpg)
- 从某个位置拿走一个球,那么它上方的球会落下来。比如依次拿走
5, 7, 8三个球:
.jpg)
输入
第一行:球的个数N,操作个数Q (N, Q <= 100 000)下面N行:第i个节点的父亲。如果是根,则为0 接下来Q行:op num
op == 1:在根放入num个球op == 2:拿走在位置num的球
输出
保证输入合法
op == 1:输出最后一个球落到了哪里op == 2:输出拿走那个球后有多少个球会掉下来
样例输入
0
1
2
2
3
3
4
6
1 8
2 5
2 7
2 8
样例输出
3
2
2
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
priority_queue< int,vector<int>,greater<int> >q;
vector<int>v[200010];
int n,Q;
int f[20][200010];//倍增祖先
int m[200010];//子树最小的编号
int s[200010];//优先度
int r[200010];//优先度对应节点
int cnt;
int root;
int x,y;
int opt;
int d[200010];//深度
int vis[200010];//是否被填标记
bool cmp(int x,int y)
{
return m[x]<m[y];
}
void dfs(int x)//按子树最小编号大小排序并处理深度
{
m[x]=x;
for(int i=0;i<v[x].size();i++)
{
f[0][v[x][i]]=x;
d[v[x][i]]=d[x]+1;
dfs(v[x][i]);
m[x]=min(m[x],m[v[x][i]]);
}
sort(&v[x][0],&v[x][v[x].size()],cmp);
}
void getsign(int x)//处理优先度
{
for(int i=0;i<v[x].size();i++)
{
getsign(v[x][i]);
}
s[x]=++cnt;
r[cnt]=x;
}
int main()
{
scanf("%d%d",&n,&Q);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(x==0)
{
root=i;
}
else
{
v[x].push_back(i);
}
}
for(int i=1;i<=n;i++)
{
q.push(i);
}
d[root]=1;
dfs(root);
getsign(root);
for(int i=1;i<=20;i++)
{
for(int j=1;j<=n;j++)
{
f[i][j]=f[i-1][f[i-1][j]];
}
}
while(Q--)
{
scanf("%d%d",&opt,&x);
if(opt==1)
{
while(x--)
{
y=r[q.top()];
q.pop();
vis[y]=1;
}
printf("%d\n",y);
}
else
{
int fa=x;
for(int i=20;i>=0;i--)
{
if(vis[f[i][x]]==1)
{
x=f[i][x];
}
}
vis[x]=0;
printf("%d\n",d[fa]-d[x]);
q.push(s[x]);
}
}
}
BZOJ3133[ballmachine]——倍增+优先队列的更多相关文章
- CF786C-Till I Collapse【树状数组倍增,优先队列】
正题 题目链接:https://www.luogu.com.cn/problem/CF786C 题目大意 给出一个长度为\(n\)的序列. 对于每个\(k\in[1,n]\)求将\(n\)分成最少的段 ...
- [BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆)
[BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆) 题面 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果 ...
- bzoj4458 GTY的OJ (优先队列+倍增)
把超级钢琴放到了树上. 这次不用主席树了..本来以为会好写一点没想到细节更多(其实是树上细节多) 为了方便,对每个点把他的那个L,R区间转化成两个深度a,b,表示从[a,b)选一个最小的前缀和(到根的 ...
- 【BZOJ 3133】 3133: [Baltic2013]ballmachine (线段树+倍增)
3133: [Baltic2013]ballmachine Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 148 Solved: 66 Descri ...
- [Baltic2013]ballmachine BZOJ3133
分析: 我们考虑,因为每次放置的时候,都是向子树中含有的编号最小的哪一个走,那么放置的顺序是固定的,我们将边以to的子树最小排序,之后得到的出栈序就是球的放入顺序.目测可以使用堆来实现,线段树也能实现 ...
- BZOJ3133[Baltic2013]ballmachine
题目描述 https://www.lydsy.com/JudgeOnline/problem.php?id=3133 题解 还是分两个操作来说吧. 先看第一个操作,放球,可以发现,对于祖先节点和后代节 ...
- Problem 1016 咒文卷轴 优先队列+前缀和+rmq
题目链接: 题目 Problem 1016 咒文卷轴 Time Limit: 3000 mSec Memory Limit : 131072 KB 问题描述 小Y 是一个魔法师,有一天他获得了一卷神秘 ...
- BZOJ 4144 Dijkstra+Kruskal+倍增LCA
思路: 先把所有的加油站 push进按weight排序的优先队列里 对于每个不是加油站的点 找到到它的点的最短路以及它来源的加油站 如果x和y有边 且x和y加油站的来源不一样 则它可以连边 跑一边Kr ...
- PAT1057 Stack(树状数组+倍增)
目录 题目大意 题目分析 题目大意 要求维护一个栈,提供压栈.弹栈以及求栈内中位数的操作(当栈内元素\(n\)为偶数时,只是求第\(n/2\)个元素而非中间两数的平均值).最多操作100000次,压栈 ...
随机推荐
- Node+GitLab实现小程序CI系统
为什么要实现自动部署 小程序开发迭代里,有以下几个个头痛的问题, 如何准确并快速的的把小程序上传去后台,并让测试人员进行测试? 测试同事找开发要二维码,效率较低 本地生成的二维码会出现携带本地代码.未 ...
- IIS6下使用多域名和通配符证书
由于SSL协议,在完成握手以前,都只能采用IP地址通信方式,没有办法获取访问地址中的域名信息,所以针对每个IP地址的每个端口,服务器只能返回相同的一张证书.如果要实现多个不同域名共享一个IP地址的缺省 ...
- 蛙蛙推荐: TensorFlow Hello World 之平面拟合
tensorflow 已经发布了 2.0 alpha 版本,所以是时候学一波 tf 了.官方教程有个平面拟合的类似Hello World的例子,但没什么解释,新手理解起来比较困难. 所以本文对这个案例 ...
- 论一类每次修改log个结点更新的线段树标记方法
楼房重建(BZOJ2957) 多次询问一个区间中大于区间内这个数之前所有数的数的数量. 每个线段树结点维护该节点的答案c和区间内最大值m.假设有函数get(x,cm)=结点x中答案>cm的长度. ...
- Minimal string CodeForces – 797C
题目链接 题目难度: 1700rating 题目类型:string+贪心+STL 题目思路: 由于题目要求的最终结果是字典序最小的那个字符串,那么我们从贪心的从’a’开始查找字符串里是否存在,如果存在 ...
- js中的join(),reverse()与 split()函数用法解析
<script> /* * 1:arrayObject.reverse() * 注意: 该方法会改变原来的数组,而不会创建新的数组.此函数可以将数组倒序排列 * 2:arrayObject ...
- 《梦断代码》Scott Rosenberg著(一)
两打程序员,3年时间,4732个bug,只为打造超卓软件. --序 在我们平时看到的大部分书籍只是讲技术和理论,但我们其实并不知道在真实的软件开发过程中,这些技术和理论究竟是被什么样的人如何去使用, ...
- MySQL 使用左连接替换not in
众所周知,左连接和右连接的含义是以哪一张表为准. 左连接就是以左表为准,查出的结果中包含左表所有的记录,如果右表中没有与其对应的记录,那么那一行记录中B表部分的内容就全是NULL. 现在有两个表,一个 ...
- How to Configure Email Notification in Jenkins
How to Configure Email Notification in Jenkins? - The Official 360logica Bloghttps://www.360logica.c ...
- css 图片文字垂直居中
先来看张图片 相信很多css新手遇到过这种问题,就是当图片和文本显示在一行的时候,效果很奇葩,文字和图片没法对齐, 这时我们需要做的是: 1,先给块级元素设置 display: inline-bloc ...