【JZOJ4811】排队
description
analysis
堆\(+\)树上倍增
考虑后序遍历搞出\(dfs\)序,那么要填肯定是从\(dfs\)序开始填
把每个点是序里第几位看成优先级,用小根堆来维护当前空着的优先级最小的点
插入每次弹\(x\)次堆顶,然后把这些点全部打上标记,注意标记一定是先打儿子再打父亲
然后找一个点深度最浅的打过标记的祖先,由于标记肯定打完了该点到祖先的所有点,于是倍增就可以找出
找完祖先后,把该祖先入堆,删除标记即可
code
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<iostream>
#define MAXN 100005
#define MAXM MAXN*2
#define ll long long
#define fo(i,a,b) for (ll i=a;i<=b;++i)
#define fd(i,a,b) for (ll i=a;i>=b;--i)
using namespace std;
vector<ll>a[MAXN];
ll b[MAXN],c[MAXN],f[MAXN],heap[MAXN],depth[MAXN];
ll pre[MAXN][17];
bool bz[MAXN];
ll n,t,tot;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline bool cmp(ll x,ll y){return f[x]<f[y];}
inline void swap(ll &x,ll &y){ll z=x;x=y,y=z;}
inline void dfs(ll x,ll y)
{
fo(i,0,a[x].size()-1)if (a[x][i]!=y)depth[a[x][i]]=depth[x]+1,dfs(a[x][i],x);
f[x]=++tot,pre[x][0]=y;
}
inline void insert(ll x)
{
heap[++heap[0]]=x;ll now=heap[0];
while (c[heap[now>>1]]>c[heap[now]] && now>1)swap(heap[now],heap[now>>1]),now>>=1;
}
inline ll get()
{
ll tmp=heap[1],now=1;
heap[1]=heap[heap[0]--],heap[heap[0]+1]=0;
while ((now<<1)<=heap[0])
{
ll next=now<<1;
if (next<heap[0] && c[heap[next+1]]<c[heap[next]])++next;
if (c[heap[now]]<=c[heap[next]])break;
swap(heap[now],heap[next]),now=next;
}
return tmp;
}
inline ll find(ll x)
{
fd(i,16,0)if (bz[pre[x][i]])x=pre[x][i];
return x;
}
int main()
{
freopen("T1.in","r",stdin);
n=read(),t=read();
fo(i,1,n-1)
{
ll x=read(),y=read();
a[x].push_back(y);
a[y].push_back(x);
}
fo(i,1,n)sort(a[i].begin(),a[i].end()),b[i]=i;
tot=0,dfs(1,0),sort(b+1,b+n+1,cmp);
fo(i,1,n)c[b[i]]=i;
fo(i,1,n)insert(b[i]);
fo(j,1,16)fo(i,1,n)pre[i][j]=pre[pre[i][j-1]][j-1];
while (t--)
{
ll op=read(),x=read(),y;
if (op==1)
{
fo(i,1,x)bz[y=get()]=1;
printf("%lld\n",y);
}
else
{
y=find(x),printf("%lld\n",depth[x]-depth[y]);
insert(y),bz[y]=0;
}
}
return 0;
}
【JZOJ4811】排队的更多相关文章
- 【JZOJ4811】【NOIP2016提高A组五校联考1】排队
题目描述 输入 输出 样例输入 5 4 1 2 1 3 3 4 3 5 1 4 2 4 1 2 2 5 样例输出 3 1 1 2 数据范围 样例解释 解法 可推知原树可以转换为一个序列,即优先序列: ...
- C++ 事件驱动型银行排队模拟
最近重拾之前半途而废的C++,恰好看到了<C++ 实现银行排队服务模拟>,但是没有实验楼的会员,看不到具体的实现,正好用来作为练习. 模拟的是银行的排队叫号系统,所有顾客以先来后到的顺序在 ...
- bzoj 2729: [HNOI2012]排队
2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MB Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体 ...
- bzoj 2141: 排队
2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MB Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我, ...
- 可重入锁 公平锁 读写锁、CLH队列、CLH队列锁、自旋锁、排队自旋锁、MCS锁、CLH锁
1.可重入锁 如果锁具备可重入性,则称作为可重入锁. ========================================== (转)可重入和不可重入 2011-10-04 21:38 这 ...
- hdu 1872(看病要排队)(优先队列)
看病要排队 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 赴美工作常识(Part 6 - 绿卡排队)
上一篇<赴美工作常识(Part 5 - 绿卡优先级)>解释完排队的优先级是怎么确定的,以及 PERM 和 I–140 表的意义,接下来就要解释一下队具体是怎么排的以及排到之后的 I–485 ...
- hdu 1873 看病要排队(优先级队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1873 题目大意: 三个医生看病,病人排队看病,病人有优先级,优先级高的提前看病,同样的优先级按先后.I ...
- 排队打饭 sdut 2443【最简单的贪心法应用举例】
排队打饭 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu.cn/sdutoj/p ...
随机推荐
- 40-Ubuntu-用户管理-05-which查看命令所在位置
which 查看执行命令所在的位置 例: 1.查看修改用户密码的命令--passwd所在位置 which passwd 注: /etc/passwd 是用于保存用户信息的文本文件. /usr/bin/ ...
- linux 套接字
三.命名套接字 之前的socket只是创建了一个没有名字的资源,其他进程无法访问他.所以也无法从它接受消息.只有当bind给套接字绑定了端口和名字后,其他进程才能找到它. 一般服务器是一定要bind, ...
- Vultr账号被锁定的几个常见原因
很多小伙伴使用都在问Vultr账号为什么又是会出现被锁定的情况,今天我们就来了解一下Vultr账号被锁定的几个常见原因. 1.Vultr主机违规使用 按照Vultr主机商的要求,我们的Vultr主机也 ...
- nodejs MYSQL数据库执行多表查询
1.设计数据库 2.设计数据库表 genres表: books表: 3.安装MySQL模块 4. 代码编写 (1) 第一种方法: 在query中使用nextTables属性,将属性值设置为ture d ...
- Cacti 发送警告邮件
Cacti版本: 0.8.8a 目的:监听CPU 高于1个设定值时发送警告邮件(范例这一台主机有1颗实体CPU,总共2核心) 需要安装的插件: 1.1. thold Threshold,下载使用的是v ...
- js循环给li绑定事件实现和弹出对应的索引
原文:http://www.cnblogs.com/wuchuanlong/p/5945286.html 方法一,动态添加click事件,并添加属性 var itemli = document.get ...
- Java环境配置:MacOS
主要是在mac os下进行java环境配置. 下载jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads- ...
- DELPHI 让子窗体显示在任务栏上
重载 CreateParams 方法即可 声明: procedure CreateParams(var Params: TCreateParams);override; procedure TForm ...
- 良田高拍仪集成vue项目
一.硬件及开发包说明: 产品型号为良田高拍仪S1800A3,集成b/s系统,适用现代浏览器,图片使用BASE64数据.开发包的bin文件下的video.flt文件需要和高拍仪型号的硬件id对应,这个可 ...
- 2018-2019-2-20175323 java实验三敏捷开发与XP实践
代码规范 安装alibaba插件 首先使用code栏里面的reformat code使代码的格式更加规范 再用编码规约扫描,alibaba把问题分为block/critical/major三个等级,出 ...