BZOJ3133[Baltic2013]ballmachine
2024-05-17 21:35:11
题目描述
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相关推荐
- BZOJ3133[ballmachine]——倍增+优先队列
题目描述 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果同时有多个点可以走,那么会选择编号最小的节点所在路径的方向.比如依次在树根4放2个 ...
最新文章
- Oracle 聚合函数(Aggregate Functions)说明
- 小猿圈之git 的几个好用自定义命令
- 来自于参赛队伍所反映的总决赛落选之后的建议
- LDAP操作过程中出现的错误代码
- java鼠标图片裁剪,如何用Java中的鼠标指针捕获屏幕图像
- [Everyday Mathematics]20150104
- zigbee 空中消息溯源
- oracle_home path,ORACLE_HOME迁移后需要设置LD_LIBRARY_PATH环境变量
- oracle recover redo,oracle redo log日志(当前或非当前日志)损坏之后的db恢复
- 在 java 的 bin 目录下,jdk 提供了很多使用的工具,下面学习一些监控和故障处理的工具。...
- 关于卡尔曼滤波详细推导的理解
- nnie yolov3 svp
- win10电脑怎么将html网页做成壁纸,win10系统怎么在电脑桌面上创建网页的快捷方式...
- 1330_硬件测试中的BCI测试
- word删除空白页删不了怎么办?Word怎么删除空白页?
- C语言知识层次结构图
- 关于获取电信光猫超级密码
- 古筝d调变降e调怎么办_古筝转调方法_古筝怎么转调
- mysql 合并函数_MySQL GROUP_CONCAT()函数 -- 字段合并查询
- 富士康Java开发面试题目
热门文章
- 【uoj#139】[UER #4]被删除的黑白树 贪心
- JAVA实现创建Excel表并导出(转发)
- 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡 期望DP+高斯消元
- win10 如何配置 java jdk1.8环境变量(2017.8.17 )jdk1.8.0_144
- [转]关于有偿提供拼图响应式后台的通知
- python-I/O-文件操作
- MySQL完全备份与恢复
- git学习六:git提交忽略不必要的文件或文件夹
- 时间更新服务器推荐 - NTP时间同步服务器集群:ntp.api.bz
- Linux如何在线修改hostname