题目描述

https://www.lydsy.com/JudgeOnline/problem.php?id=3133

题解

还是分两个操作来说吧。

先看第一个操作,放球,可以发现,对于祖先节点和后代节点来说,后代节点没有放球,祖先节点就不能放,对于兄弟节点来说,子树编号小的没放满,编号大的就不能放,可以发现这是树的后序遍历。

用堆维护这个顺序,依次放就好了。

第二问更简单,就是找到最靠上的有球的祖先,把那个位置拿走就好了。

代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<vector>
#define N 100009
using namespace std;
int p[][N],deep[N],n,dfn[N],tot,root,dp[N];
bool tag[N];
struct node{
int x;
bool operator <(const node &b)const{
return dfn[x]>dfn[b.x];
}
};
priority_queue<node>q;
vector<int>vec[N];
inline int rd(){
int x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
inline bool cmp(int a,int b){return dp[a]<dp[b];}
void predfs(int u){
dp[u]=u;
for(int i=;i<vec[u].size();++i){
int v=vec[u][i];predfs(v);
dp[u]=min(dp[u],dp[v]);
}
}
void dfs(int u){
for(int i=;(<<i)<=deep[u];++i)p[i][u]=p[i-][p[i-][u]];
for(int i=;i<vec[u].size();++i){
int v=vec[u][i];deep[v]=deep[u]+;p[][v]=u;
dfs(v);
}
dfn[u]=++tot;
}
int main(){
n=rd();int qu=rd();int x,opt,fa;
for(int i=;i<=n;++i){fa=rd();if(!fa)root=i;vec[fa].push_back(i);}
predfs(root);
for(int i=;i<=n;++i)sort(vec[i].begin(),vec[i].end(),cmp);
dfs(root);
for(int i=;i<=n;++i)q.push(node{i});
while(qu--){
opt=rd();x=rd();
if(opt==){
int id;
for(int i=;i<=x;++i){
id=q.top().x;q.pop();
tag[id]=;
}
printf("%d\n",id);
}
else{
int now=x;
for(int i=;i>=;--i)if(p[i][now]&&tag[p[i][now]])now=p[i][now];
tag[now]=;q.push(node{now});printf("%d\n",deep[x]-deep[now]);
}
}
return ;
}

BZOJ3133[Baltic2013]ballmachine的更多相关文章

  1. [BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆)

    [BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆) 题面 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果 ...

  2. 【BZOJ 3133】 3133: [Baltic2013]ballmachine (线段树+倍增)

    3133: [Baltic2013]ballmachine Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 148  Solved: 66 Descri ...

  3. [Baltic2013]ballmachine BZOJ3133

    分析: 我们考虑,因为每次放置的时候,都是向子树中含有的编号最小的哪一个走,那么放置的顺序是固定的,我们将边以to的子树最小排序,之后得到的出栈序就是球的放入顺序.目测可以使用堆来实现,线段树也能实现 ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. BZOJ3133[ballmachine]——倍增+优先队列

    题目描述 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果同时有多个点可以走,那么会选择编号最小的节点所在路径的方向.比如依次在树根4放2个 ...

  6. 【BZOJ 3136】 3136: [Baltic2013]brunhilda (数论?)

    3136: [Baltic2013]brunhilda Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 238  Solved: 73[Submit][ ...

  7. BZOJ_3133_[Baltic2013]ballmachine_堆+倍增

    BZOJ_3133_[Baltic2013]ballmachine_堆+倍增 Description 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树 ...

  8. bzoj3135: [Baltic2013]pipesd

    Description 有n个水库,m条管道.Jester会在某些管道中间凿开一个洞,让水流出来或者用水泵把水打进去.保证这个流速是偶数.对于一条管道(u, v),如果在中间凿开了一个洞让水流出来,流 ...

  9. bzoj3137: [Baltic2013]tracks

    炸一看好像很神仙的样子,其实就是个sb题 万年不见的1A 但是我们可以反过来想,先选一个起点到终点的联通块,然后这联通块后面相当于就能够走了,继续找联通块 然后就能发现直接相邻的脚步相同的边权为0,否 ...

随机推荐

  1. Nginx Configuring HTTPS servers

    Configuring HTTPS servershttp://nginx.org/en/docs/http/configuring_https_servers.html Configuring HT ...

  2. Js中instanceof 的用法

    在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 “object”. ...

  3. C# Note11:如何优雅地退出WPF应用程序

    前言 I should know how I am supposed to exit my application when the user clicks on the Exit menu item ...

  4. 你不知道的JavaScript——第二章:this全面解析

    1调用位置 调用栈:为了到达当前执行位置所调用的所有函数. function baz(){ //当前调用栈:baz //因此,当前调用位置是全局作用域 console.log('baz'); bar( ...

  5. checkbox操作判断 Jquery选择器

    function checkAll(d){ console.log(d); console.log(d.checked); //注意 这里是d不是$(d) 不是jQuery对象 if(d.checke ...

  6. CentOS6.8 安装配置Mysql

    1.下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 2.安装mysql-commun ...

  7. WPF当属性值改变时利用PropertyChanged事件来加载动画

    在我们的程序中,有时我们需要当绑定到UI界面上的属性值发生变化从而引起数据更新的时候能够加载一些动画,从而使数据更新的效果更佳绚丽,在我们的程序中尽量将动画作为一种资源放在xaml中,而不是在后台中通 ...

  8. StringBuilder与String有哪些区别?

    System.String具备不可修改性,在程序中这样的特性容易产生性能上的问题.针对这个问题.NET提供的StringBuilder类可以解决类似的问题. String 和 StringBuilde ...

  9. LODOP打印控件如何提示用户升级下载安装新版本

    Lodop.C-Lodop在不断完善功能和更新中,新版本修复了很多问题,以及增加很多有利的功能,网站如何更新版本,提示用户下载新版本呢?更新版本很简单,只需要三步:1.替换提示安装部分的自己放置的路径 ...

  10. web跨域请求

    第一种情况: 1. sina.com=====>baidu.com/xxx.jsp 也就是前面的域名不相同,(url第三根斜杠之前的内容,也就是主机) 2:localhost =====> ...