题目描述

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[20][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=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);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=0;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=1;(1<<i)<=deep[u];++i)p[i][u]=p[i-1][p[i-1][u]];for(int i=0;i<vec[u].size();++i){int v=vec[u][i];deep[v]=deep[u]+1;p[0][v]=u;dfs(v);}dfn[u]=++tot;
}
int main(){n=rd();int qu=rd();int x,opt,fa;for(int i=1;i<=n;++i){fa=rd();if(!fa)root=i;vec[fa].push_back(i);}predfs(root);for(int i=1;i<=n;++i)sort(vec[i].begin(),vec[i].end(),cmp);dfs(root);for(int i=1;i<=n;++i)q.push(node{i});while(qu--){opt=rd();x=rd();if(opt==1){int id;for(int i=1;i<=x;++i){id=q.top().x;q.pop();tag[id]=1;}printf("%d\n",id);}else{int now=x;for(int i=19;i>=0;--i)if(p[i][now]&&tag[p[i][now]])now=p[i][now];tag[now]=0;q.push(node{now});printf("%d\n",deep[x]-deep[now]);}}return 0;
} 

转载于:https://www.cnblogs.com/ZH-comld/p/10261135.html

BZOJ3133[Baltic2013]ballmachine相关推荐

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

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

最新文章

  1. Oracle 聚合函数(Aggregate Functions)说明
  2. 小猿圈之git 的几个好用自定义命令
  3. 来自于参赛队伍所反映的总决赛落选之后的建议
  4. LDAP操作过程中出现的错误代码
  5. java鼠标图片裁剪,如何用Java中的鼠标指针捕获屏幕图像
  6. [Everyday Mathematics]20150104
  7. zigbee 空中消息溯源
  8. oracle_home path,ORACLE_HOME迁移后需要设置LD_LIBRARY_PATH环境变量
  9. oracle recover redo,oracle redo log日志(当前或非当前日志)损坏之后的db恢复
  10. 在 java 的 bin 目录下,jdk 提供了很多使用的工具,下面学习一些监控和故障处理的工具。...
  11. 关于卡尔曼滤波详细推导的理解
  12. nnie yolov3 svp
  13. win10电脑怎么将html网页做成壁纸,win10系统怎么在电脑桌面上创建网页的快捷方式...
  14. 1330_硬件测试中的BCI测试
  15. word删除空白页删不了怎么办?Word怎么删除空白页?
  16. C语言知识层次结构图
  17. 关于获取电信光猫超级密码
  18. 古筝d调变降e调怎么办_古筝转调方法_古筝怎么转调
  19. mysql 合并函数_MySQL GROUP_CONCAT()函数 -- 字段合并查询
  20. 富士康Java开发面试题目

热门文章

  1. 【uoj#139】[UER #4]被删除的黑白树 贪心
  2. JAVA实现创建Excel表并导出(转发)
  3. 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡 期望DP+高斯消元
  4. win10 如何配置 java jdk1.8环境变量(2017.8.17 )jdk1.8.0_144
  5. [转]关于有偿提供拼图响应式后台的通知
  6. python-I/O-文件操作
  7. MySQL完全备份与恢复
  8. git学习六:git提交忽略不必要的文件或文件夹
  9. 时间更新服务器推荐 - NTP时间同步服务器集群:ntp.api.bz
  10. Linux如何在线修改hostname