题目

分析

首先预处理出每个点的优先级,当有一个人进入时,一定会走到优先级最大的空房间中。

把所有空的房间扔到一个堆中,按优先级大小维护这个堆。

答案怎么求就不说了,很容易想到,就只讲操作吧。

对于第一种操作,我们就将一个一个扔进优先级最大的房间(即堆顶),因为堆顶的房间有人,所以将堆顶的房间踢出堆。

对于第二种操作,当一个房间空了,一定是从它的父亲房间补上来。

倍增将深度最大的空了的房间的祖宗取出来,因为它的祖宗们一定一个接一个往下走一个位置。

也就是说,深度最大的空了的房间的祖宗人的人会走掉,那么将这个房间加入堆。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const int mo=1000000007;
const int N=110005;
using namespace std;
struct ddx
{
int x,y;
}a[N*2];
int last[N*4],next[N*4],to[N*4],sum,n,m,t,ans,b[N*2],tot,belong[N*2];
int heap[N*2],th[N*2],g[N*2][20],tot1,deep[N*2];
bool bz[N*2];
bool cmp(ddx x,ddx y)
{
return x.x<y.x || (x.x==y.x && x.y<y.y);
}
void bj(int x,int y)
{
next[++tot]=last[x];
last[x]=tot;
to[tot]=y;
}
int up(int x)
{
while(th[heap[x/2]]>th[heap[x]] && x!=1)
{
belong[heap[x]]=x/2;
belong[heap[x/2]]=x;
heap[x]=heap[x]^heap[x/2];
heap[x/2]=heap[x]^heap[x/2];
heap[x]=heap[x]^heap[x/2];
x/=2;
}
}
int down(int x)
{
while((th[heap[x]]>th[heap[x*2]] || th[heap[x]]>th[heap[x*2+1]]) && x*2<=sum)
{
if(x*2+1>sum && th[heap[x]]<th[heap[x*2]]) break;
if(th[heap[x*2]]<th[heap[x*2+1]] || x*2+1>sum)
{
belong[heap[x]]=x*2;
belong[heap[x*2]]=x;
heap[x]=heap[x]^heap[x*2];
heap[x*2]=heap[x]^heap[x*2];
heap[x]=heap[x]^heap[x*2];
x=x*2;
}
else
{
belong[heap[x]]=x*2+1;
belong[heap[x*2+1]]=x;
heap[x]=heap[x]^heap[x*2+1];
heap[x*2+1]=heap[x]^heap[x*2+1];
heap[x]=heap[x]^heap[x*2+1];
x=x*2+1;
}
}
}
int insert(int x)
{
heap[++sum]=x;
belong[x]=sum;
up(sum);
}
int cut()
{
belong[heap[sum]]=1;
belong[heap[1]]=0;
heap[1]=heap[sum--];
heap[sum+1]=0;
down(1);
}
void dg(int x)
{
deep[x]=deep[g[x][0]]+1;
for(int i=b[x];a[i].x==x;i++)
{
if(a[i].y!=g[x][0])
{
g[a[i].y][0]=x;
bj(x,a[i].y);
dg(a[i].y);
}
}
th[x]=++tot1;
insert(x);
}
int lca(int x)
{
int num=x;
for(int i=log2(n);i>=0;i--)
if((!belong[g[x][i]]) && g[x][i])
x=g[x][i];
if((!belong[g[x][0]]) && g[x][0]) x=g[x][0];
printf("%d\n",deep[num]-deep[x]);
return x;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n-1;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
a[n+i-1].x=a[i].y;
a[n+i-1].y=a[i].x;
}
sort(a+1,a+n*2-1,cmp);
for(int i=1;i<=n*2-2;i++)
if(a[i].x!=a[i-1].x) b[a[i].x]=i;
dg(1);
for(int i=1;i<=log2(n);i++)
for(int j=1;j<=n;j++)
g[j][i]=g[g[j][i-1]][i-1];
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(x==1)
{
for(int j=1;j<=y;j++)
{
if(j==y)
printf("%d\n",heap[1]);
cut();
}
}
else
{
insert(lca(y));
}
}
}

【NOIP2016提高A组五校联考1】排队的更多相关文章

  1. NOIP2016提高A组五校联考4总结

    坑爹的第一题,我居然想了足足3个小时,而且还不确定是否正确. 于是,我就在这种情况下心惊胆跳的打了,好在ac了,否则就爆零了. 第二题,树形dp,本来差点就想到了正解,结果时间不够,没打完. 第三题, ...

  2. 【NOIP2016提高A组五校联考4】square

    题目 分析 首先,设\(f_{i,j}\)表示最大的以(i,j)为左下角的正方形的边长. 转移显然,\(f_{i,j}=\max(f_{i-1,j},f_{i,j-1},f_{i-1,j-1})+1\ ...

  3. 【NOIP2016提高A组五校联考4】label

    题目 题目 20%算法 设\(f_{i,j}\)表示第i个节点选了j这个权值的方案数. 显然转移方程为,\[f_{i,j}=\Pi_{v=son(i)}(\sum_{k=1}^{j-k}f_{v,k} ...

  4. 【NOIP2016提高A组五校联考4】ksum

    题目 分析 发现,当子段[l,r]被取了出来,那么[l-1,r].[l,r+1]一定也被取了出来. 那么,首先将[1,n]放入大顶堆,每次将堆顶的子段[l,r]取出来,因为它是堆顶,所以一定是最大的子 ...

  5. NOIP2016提高A组五校联考3总结

    第一题,本来一开始就想到了数位dp,结果脑残地打了十几个转移方程,总是调试不出来,一气之下放弃了. 调第一题几乎调了整节比赛,第二第三都没它. 第二题连边找联通块. 第三题题解都打了三页,看都不想看. ...

  6. 【NOIP2016提高A组五校联考2】tree

    题目 给一棵n 个结点的有根树,结点由1 到n 标号,根结点的标号为1.每个结点上有一个物品,第i 个结点上的物品价值为vi. 你需要从所有结点中选出若干个结点,使得对于任意一个被选中的结点,其到根的 ...

  7. 【NOIP2016提高A组五校联考2】running

    题目 小胡同学是个热爱运动的好孩子. 每天晚上,小胡都会去操场上跑步,学校的操场可以看成一个由n个格子排成的一个环形,格子按照顺时针顺序从0 到n- 1 标号. 小胡观察到有m 个同学在跑步,最开始每 ...

  8. 【NOIP2016提高A组五校联考2】string

    题目 给出一个长度为n, 由小写英文字母组成的字符串S, 求在所有由小写英文字母组成且长度为n 且恰好有k 位与S 不同的字符串中,给定字符串T 按照字典序排在第几位. 由于答案可能很大,模10^9 ...

  9. NOIP2016提高A组五校联考2总结

    第一题用组合数各种乱搞,其恶心程度不一般.搞了很久才调对,比赛上出了一点bug,只拿了30分. 第二题我乱搞得出个错误的结论,本来自信满满60分,结果爆零了. 第三题,树形dp,在一开始的时候想到了, ...

  10. NOIP2016提高A组五校联考1总结

    第一题二分,在比赛上明明想到的方法,结果考虑的时候似乎漏了什么,被否决掉了. 只打了个水法,10分. 第二题,最长不上升子序列,原题,类似的题目做过两道,直接搞定. 第三题,一开始想了一种通过在树上打 ...

随机推荐

  1. mysql 各数据类型的大小及长度

    数字型 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767) (0, ...

  2. 依赖注入——angular

    在Angular中创建一个对象时,需要依赖另一个对象,这是代码层的一种依赖关系,当这种依赖被声明后,Angular通过injector注入器将所依赖的对象进行注入操作. 一.依赖注入的原理 看下面的示 ...

  3. nanomsg安装和测试

    最近在构建一个中间层的通信架构,本来想用dbus,在实验过程中发现dbus对于国产系统支持版本比较低,安装比较麻烦,今天无意中看中了nanomsg,尽管没有dbus那么强悍的生态,但基本能满足需求. ...

  4. 自己用canvas写的贪吃蛇代码

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 【miscellaneous】GPRS本质论

    GPRS DTU最基本的用法是:在DTU中放入一张开通GPRS功能的SIM卡,DTU上电后先注册到GPRS网络,然后通过GPRS网络和数据处理中心建立连接.这条连接涉及了无线网络运营商,因特网宽 带供 ...

  6. Vmware ESXI 安装Windows

    Vmware ESXI 安装Windows >ESXi专为运行虚拟机.最大限度降低配置要求和简化部署而设计.只需几分钟时间,客户便可完成从安装到运行虚拟机的全过程,特别是在下载并安装预配置虚拟设 ...

  7. Elasticsearch-使用映射来定义各种文档

    ES-使用映射来定义各种文档 每篇文档属于一种类型,而每种类型属于一个索引.从数据的逻辑划分来看,可以认为索引是数据库,而类型是数据库中的表.类型包含了映射中每个字段的定义.映射包括了该类型的文档中可 ...

  8. vim中代码按照行对齐。

    在vim下, 用命令v, 然后移动光标,选种你的文本, 然后按下=键, 看看效果如何吧.

  9. Linux运维必会的100道MySql面试题之(一)

    01 如何启动MySql服务 /etc/init.d/mysqld start service mysqld start Centos 7.x 系统 sysctl  start mysqld 02 检 ...

  10. async 异步抓取 花瓣网高清大图 30s爬取500张

    废话 不多说,直接上代码,不懂得看注释 先安装  pip install aiohttp "异步抓取花瓣网图片" # pip install aiohttp import requ ...