[Baltic2013]ballmachine BZOJ3133
分析:
我们考虑,因为每次放置的时候,都是向子树中含有的编号最小的哪一个走,那么放置的顺序是固定的,我们将边以to的子树最小排序,之后得到的出栈序就是球的放入顺序。目测可以使用堆来实现,线段树也能实现,链表和并查集不能实现。
每次放球可以暴力的放入,因为满足实际不可以放入超过n个球。
每次取走的球可以通过倍增来找到,因为满足球是连续的。
附上代码:
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <queue>
#include <cmath>
using namespace std;
#define N 100005
priority_queue<int>q;
int a[N],head[N],cnt,fa[21][N],dep[N],used[N],n,Q,vis[N],minn[N];
bool cmp(int x,int y)
{
return minn[x]<minn[y];
}
vector<int> e[N];
void dfs(int x,int from)
{
fa[0][x]=from,dep[x]=dep[from]+1;minn[x]=x;
int t=e[x].size();
for(int i=0;i<t;i++)
{
int to1=e[x][i];
if(to1!=from)
{
dfs(to1,x);
minn[x]=min(minn[x],minn[to1]);
}
}
}
int num,ans,idx[N],p[N],tims;
int get(int x)
{
int ans=0;
for(int i=19;i>=0;i--)
{
if(used[fa[i][x]])
{
ans+=(1<<i);
x=fa[i][x];
}
}
used[x]=0;
q.push(-idx[x]);
return ans;
}
void dfs1(int x,int from)
{
int t=e[x].size();
for(int i=0;i<t;i++)
{
int to1=e[x][i];
if(to1!=from)
{
dfs1(to1,x);
}
}
idx[x]=++tims;p[tims]=x;
}
int rot=0;
int main()
{
// freopen("ball.in","r",stdin);
// freopen("ball.out","w",stdout);
scanf("%d%d",&n,&Q);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
if(!x)rot=i;
else e[x].push_back(i);
q.push(-i);
}
dfs(rot,0);
for(int i=1;i<=19;i++)
{
for(int j=1;j<=n;j++)
{
fa[i][j]=fa[i-1][fa[i-1][j]];
}
}
for(int i=1;i<=n;i++)
{
if(e[i].begin()==e[i].end())continue;
sort(e[i].begin(),e[i].end(),cmp);
}
dfs1(rot,0);
while(Q--)
{
int x,y;
scanf("%d%d",&x,&y);
if(x==1)
{
int z;
while(y--)
{
z=p[-q.top()];q.pop();
used[z]=1;
}
printf("%d\n",z);
}else
{
printf("%d\n",get(y));
}
}
}
[Baltic2013]ballmachine BZOJ3133的更多相关文章
- [BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆)
[BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆) 题面 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果 ...
- 【BZOJ 3133】 3133: [Baltic2013]ballmachine (线段树+倍增)
3133: [Baltic2013]ballmachine Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 148 Solved: 66 Descri ...
- BZOJ3133[Baltic2013]ballmachine
题目描述 https://www.lydsy.com/JudgeOnline/problem.php?id=3133 题解 还是分两个操作来说吧. 先看第一个操作,放球,可以发现,对于祖先节点和后代节 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ3133[ballmachine]——倍增+优先队列
题目描述 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果同时有多个点可以走,那么会选择编号最小的节点所在路径的方向.比如依次在树根4放2个 ...
- 【BZOJ 3136】 3136: [Baltic2013]brunhilda (数论?)
3136: [Baltic2013]brunhilda Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 238 Solved: 73[Submit][ ...
- BZOJ_3133_[Baltic2013]ballmachine_堆+倍增
BZOJ_3133_[Baltic2013]ballmachine_堆+倍增 Description 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树 ...
- bzoj3135: [Baltic2013]pipesd
Description 有n个水库,m条管道.Jester会在某些管道中间凿开一个洞,让水流出来或者用水泵把水打进去.保证这个流速是偶数.对于一条管道(u, v),如果在中间凿开了一个洞让水流出来,流 ...
- bzoj3137: [Baltic2013]tracks
炸一看好像很神仙的样子,其实就是个sb题 万年不见的1A 但是我们可以反过来想,先选一个起点到终点的联通块,然后这联通块后面相当于就能够走了,继续找联通块 然后就能发现直接相邻的脚步相同的边权为0,否 ...
随机推荐
- H5 canvas 实现飞机大战游戏
首先看几张效果图: 上面三张图分别对应游戏的三种状态 ready,play,pause.体验一下 先介绍一下canvas 画图的原理,在这个游戏中的背景,飞机,子弹以及飞机被击中爆炸的效果都是一张张的 ...
- mongodb基础环境搭建
一.准备工具 (1)mongodb(https://www.mongodb.com/dr/fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus- ...
- 百度Ocr文字识别
简述 最近开发一个项目需要用到Ocr文字识别技术来识别手写文字,在评估过程中体验了百度的文字识别和腾讯的文字识别.查找官方开发文档,发现它们都有印刷体和手写体两种符合项目需求的识别模式,但是腾讯的手写 ...
- React Native八大Demo
参考资料:http://www.cnblogs.com/shaoting/p/7148240.html 下一个项目公司也打算使用react native.大致看了下原型设计,写几个小demo先试试水. ...
- MAC安装了mumu安卓模拟器,但无法检测到该模拟器
1.adb devices 看不到模拟器 2.adb connect 127.0.0.1:5555 3.adb kill-server 没有报错,即成功 4. adb start-server ...
- MySQL 命令行操作集合
1.导入数据库 ) 登录 mysql -uroot -p Enter password: 2) 创建数据库create database pluto_0; 3)导入 source /var/www/m ...
- Web Api通过文件流下载文件到本地实例
最近项目里面需要和C++的客户端互动,其中一个接口就是需要提供文件下载的接口,保证C++项目调用这个接口的时候能够正常下载文件到本地.参考了一下网上的代码,其原理就是读取服务器上指定路径的文件流,并将 ...
- LeetCode 题解之Goat Latin
1.问题描述 2.问题分析 将句子拆分成单词,然后放入vector中,对每一个单词做改变,最后连成句子返回. 3.代码 string toGoatLatin(string S) { vector< ...
- ubuntu下给raspy pi2 编译qt5库
交叉编译时,通常要准备mkspec, 参考: http://wiki.qt.io/Building_Qt_for_Embedded_Linux mkspec包含两个文件: qmake.conf- Th ...
- 通过ajax GET方式查询数据,Django序列化objects
点击“查找2”按钮,通过ajax GET方式进行查询数据,这样页面不需要整体刷新,之后清空tbody数据,将查询结果重新附加到tbody 前端html: <div class="box ...