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】排队的更多相关文章

  1. 【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 数据范围 样例解释 解法 可推知原树可以转换为一个序列,即优先序列: ...

  2. C++ 事件驱动型银行排队模拟

    最近重拾之前半途而废的C++,恰好看到了<C++ 实现银行排队服务模拟>,但是没有实验楼的会员,看不到具体的实现,正好用来作为练习. 模拟的是银行的排队叫号系统,所有顾客以先来后到的顺序在 ...

  3. bzoj 2729: [HNOI2012]排队

    2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MB Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体 ...

  4. bzoj 2141: 排队

    2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MB Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我, ...

  5. 可重入锁 公平锁 读写锁、CLH队列、CLH队列锁、自旋锁、排队自旋锁、MCS锁、CLH锁

    1.可重入锁 如果锁具备可重入性,则称作为可重入锁. ========================================== (转)可重入和不可重入 2011-10-04 21:38 这 ...

  6. hdu 1872(看病要排队)(优先队列)

    看病要排队 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. 赴美工作常识(Part 6 - 绿卡排队)

    上一篇<赴美工作常识(Part 5 - 绿卡优先级)>解释完排队的优先级是怎么确定的,以及 PERM 和 I–140 表的意义,接下来就要解释一下队具体是怎么排的以及排到之后的 I–485 ...

  8. hdu 1873 看病要排队(优先级队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1873 题目大意: 三个医生看病,病人排队看病,病人有优先级,优先级高的提前看病,同样的优先级按先后.I ...

  9. 排队打饭 sdut 2443【最简单的贪心法应用举例】

    排队打饭 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu.cn/sdutoj/p ...

随机推荐

  1. 40-Ubuntu-用户管理-05-which查看命令所在位置

    which 查看执行命令所在的位置 例: 1.查看修改用户密码的命令--passwd所在位置 which passwd 注: /etc/passwd 是用于保存用户信息的文本文件. /usr/bin/ ...

  2. linux 套接字

    三.命名套接字 之前的socket只是创建了一个没有名字的资源,其他进程无法访问他.所以也无法从它接受消息.只有当bind给套接字绑定了端口和名字后,其他进程才能找到它. 一般服务器是一定要bind, ...

  3. Vultr账号被锁定的几个常见原因

    很多小伙伴使用都在问Vultr账号为什么又是会出现被锁定的情况,今天我们就来了解一下Vultr账号被锁定的几个常见原因. 1.Vultr主机违规使用 按照Vultr主机商的要求,我们的Vultr主机也 ...

  4. nodejs MYSQL数据库执行多表查询

    1.设计数据库 2.设计数据库表 genres表: books表: 3.安装MySQL模块 4. 代码编写 (1) 第一种方法: 在query中使用nextTables属性,将属性值设置为ture d ...

  5. Cacti 发送警告邮件

    Cacti版本: 0.8.8a 目的:监听CPU 高于1个设定值时发送警告邮件(范例这一台主机有1颗实体CPU,总共2核心) 需要安装的插件: 1.1. thold Threshold,下载使用的是v ...

  6. js循环给li绑定事件实现和弹出对应的索引

    原文:http://www.cnblogs.com/wuchuanlong/p/5945286.html 方法一,动态添加click事件,并添加属性 var itemli = document.get ...

  7. Java环境配置:MacOS

    主要是在mac os下进行java环境配置. 下载jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads- ...

  8. DELPHI 让子窗体显示在任务栏上

    重载 CreateParams 方法即可 声明: procedure CreateParams(var Params: TCreateParams);override; procedure TForm ...

  9. 良田高拍仪集成vue项目

    一.硬件及开发包说明: 产品型号为良田高拍仪S1800A3,集成b/s系统,适用现代浏览器,图片使用BASE64数据.开发包的bin文件下的video.flt文件需要和高拍仪型号的硬件id对应,这个可 ...

  10. 2018-2019-2-20175323 java实验三敏捷开发与XP实践

    代码规范 安装alibaba插件 首先使用code栏里面的reformat code使代码的格式更加规范 再用编码规约扫描,alibaba把问题分为block/critical/major三个等级,出 ...