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. 微信小程序开发系列之Hello World

    第一步:注册 在微信公众平台官网首页,点击注册.(相关文档可以找到,这里不再累述,望见谅.) 微信小程序注册成功后界面 第二步:编辑器.开发工具 我们假定你已经申请注册好微信小程序了,我们选定一个代码 ...

  2. linux下alsa架构音频驱动播放wav格式文件

    #include<stdio.h> #include<stdlib.h> #include <string.h> #include <alsa/asoundl ...

  3. union 或者 union all 与 order by 的联合使用

    首先清楚:多个select 语句 union 时不是简单的将查询结果拼接起来 而是将sql拼接起来编译(做为一个sql语句),然后去执行. 注: union 连接的语句中只会出现一个order by ...

  4. 【转】Git 修改已提交的commit注释

    https://www.jianshu.com/p/098d85a58bf1 [重点] 通过git rebase -i HEAD~2 你想修改哪条注释 就把哪条注释前面的pick换成edit git ...

  5. smarty基础总结

    前提: 1. 部署smarty模板目录: 2. 编写Smarty类的子类,定制好template_dir.compile_dir.config_dir.cache_dir.left_delimiter ...

  6. tomcat部署安全证书文件(阿里云SSL证书)

    1.下载安全证书文件: 这里使用的是阿里云SSL证书(免费一年) 2.把下载的压缩包进行解压 3.将pfx文件拷贝至服务器 4.利用jdk将pfx转jks 5.cmd进入命令行 6.切换至jdk的bi ...

  7. NOIp2018集训test-9-1(am)

    1.最大值 可以用FWT水过去,李巨写了FWT结果中途爆int了炸了几十分好像. 我乱搞了一下把除了大数据有or的搞出来然后90,还是蛮划算的.我yy的做法: 1.xor 字典树上贪心, 一开始我打了 ...

  8. HDU6331Problem M. Walking Plan

    传送门 分块floyd $f[i][j][k]$表示从i走k步到j的最短路 $g[i][j][k]$表示从i走k*100步到j的最短路 $h[i][j][k]$表示从i至少走k步到j的最短路 询问从x ...

  9. bs4修改html文件和保存

    一.需求 将2个html文件保存到本地浏览器,例如: A页面(我的博客主页) B页面(爬虫四大金刚) 然后将A页面中的爬虫链接,链接的a标签中的href属性修改成本地B页面的地址,实现在本地浏览A页面 ...

  10. cordova 与 phonegap关系

    Apache Cordova是PhoneGap贡献给Apache后的开源项目,是从PhoneGap中抽出的核心代码,是驱动PhoneGap的核心引擎.PhoneGap是一个开源的开发框架,使用HTML ...