P6753 [BalticOI 2013 Day1] Ball Machine
P6753 [BalticOI 2013 Day1] Ball Machine
题意
给你一个树,每次从根节点放一个求,如果其子节点有空这个球会向下滚,若有多个节点为空则找儿子中以子树内编号的最小值为优先级从小到大找第一个为空的位置滚。
有两种操作,第一种插入若干个球,输出最后一个球到的节点编号;第二种删除一个位置,此时若有可以向下滚的球那么这个球就会滚,输出有多少个球滚了。
保证数据合法。
思路
首先我们思考只有1操作的情况。
对于1操作,球加入的顺序为按照以子树内编号的最小值为优先级的后序遍历 dfs 序。我们得到了 40pts。
对于2操作,删掉一个球后答案一定是其所有祖先中有球的位置的个数。原因显然,因为删球前一定是最佳状态,即没有球能动,所以删掉这个球后只有其祖先会向下移动并且一定会向下移动。
发现祖先有球的段一定是连续的,于是我们就可以用倍增找到最浅的有球的祖先,并且顺便输出答案。
但是2操作后会把父亲节点删去。注意这时候删去的节点并非最后加入的点。而且下一次加入球时会找 dfs 序最小的。这时候我们就需要一些东西比如 stl 的 vector / priority_queue / set 进行维护了。
还有最最最重要的一点!对于操作1,我们是依次一个一个加入的,这样的时间复杂度为什么是正确的?
显然,因为每个2操作只会删1个点,所以我们最多会插入 n+q 个点。所以要什么重链剖分和线段树暴力就能过
实现
我用的是 vector 存储空节点来实现这个过程的。它的好处在于对于1操作删除是 \(O(1)\) 的。不过插入必须用 upper_bound 和 insert 。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cctype>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
inline int read(){
int w=0,x=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c))x=x*10+(c^48),c=getchar();
return w?-x:x;
}
namespace star
{
const int maxn=1e5+10;
int n,Q;
int fa[maxn][21],rt,dfn[maxn],tot,id[maxn],mn[maxn];
bool vis[maxn];
vector<int> q,G[maxn];
void dfs1(int x){
mn[x]=x;
for(int i=0;i<G[x].size();i++)
dfs1(G[x][i]),mn[x]=min(mn[x],mn[G[x][i]]);
}
inline bool cmp1(int a,int b){return mn[a]<mn[b];}
void dfs(int x){
for(int i=0;i<20;i++) fa[x][i+1]=fa[fa[x][i]][i];
sort(G[x].begin(),G[x].end(),cmp1);
for(int i=0;i<G[x].size();i++)
dfs(G[x][i]);
dfn[x]=++tot;
id[tot]=x;
}
inline bool cmp(int a,int b){return dfn[a]>dfn[b];}
inline void work(){
n=read(),Q=read();
for(int i=1;i<=n;i++){
if((fa[i][0]=read())==0) rt=i;
G[fa[i][0]].push_back(i);
}
dfs1(rt);
dfs(rt);q.resize(n),q.clear();
for(int i=n;i;i--) q.push_back(id[i]);
while(Q--)
if(read()==1){
int num=read();
while(--num)vis[q.back()]=1,q.pop_back();
printf("%d\n",q.back());
vis[q.back()]=1;q.pop_back();
}else{
int x=read();
if(!vis[x]){puts("0");continue;}//数据合法,好像没用
int f=x,ans=0;
for(int i=20;~i;i--) if(vis[fa[f][i]])f=fa[f][i],ans|=(1<<i);
vis[f]=0;
q.insert(upper_bound(q.begin(),q.end(),f,cmp),f);
printf("%d\n",ans);
}
}
}
signed main(){
star::work();
return 0;
}
其他
强烈吐槽洛谷的翻译!一直以为是以直接相连节点的编号大小为优先级,结果是子树内的最小值……建议大家看原题面。
P6753 [BalticOI 2013 Day1] Ball Machine的更多相关文章
- luoguP6754 [BalticOI 2013 Day1] Palindrome-Free Numbers
目录 luoguP6754 [BalticOI 2013 Day1] Palindrome-Free Numbers 简述题意: Solution: Code luoguP6754 [BalticOI ...
- LOJ#2632. 「BalticOI 2011 Day1」打开灯泡 Switch the Lamp On
题目描述 译自 BalticOI 2011 Day1 T3「Switch the Lamp On」有一种正方形的电路元件,在它的两组相对顶点中,有一组会用导线连接起来,另一组则不会.有 N×M 个这样 ...
- P6739 [BalticOI 2014 Day1] Three Friends 题解
目录 写在前面 Solution 何为字符串哈希(可跳过): Code 写在前面 P6739 [BalticOI 2014 Day1] Three Friends 听说这题可以用比较暴力的做法过,比如 ...
- NOIP 2013 day1
tags: 模拟 快速幂 逆序对 树状数组 归并排序 最小生成树 lca 倍增 categories: 信息学竞赛 总结 tex live 2017.iso 转圈游戏 火柴排队 货车运输 转圈游戏 s ...
- P4675 [BalticOI 2016 day1]Park (并查集)
题面 在 Byteland 的首都,有一个以围墙包裹的矩形公园,其中以圆形表示游客和树. 公园里有四个入口,分别在四个角落( 1 , 2 , 3 , 4 1, 2, 3, 4 1,2,3,4 分别对应 ...
- django开发个人简易Blog—nginx+uwsgin+django1.6+mysql 部署到CentOS6.5
前面说完了此项目的创建及数据模型设计的过程.如果未看过,可以到这里查看,并且项目源码已经放大到github上,可以去这里下载. 代码也已经部署到sina sea上,地址为http://fengzhen ...
- 经过各种坑之后centos+ uwsgi + nginx +django 终于配好了
https://pypi.python.org/pypi/setuptools#downloads https://www.python.org/ftp/python/ 开机 加入 uwsgi ngi ...
- LOJ 一本通一句话题解系列:
第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...
- 【搜索 ex-BFS】bzoj2346: [Baltic 2011]Lamp
关于图中边权非零即一的宽度优先搜索 Description 译自 BalticOI 2011 Day1 T3「Switch the Lamp On」有一种正方形的电路元件,在它的两组相对顶点中,有一组 ...
随机推荐
- Springboot自定义starter打印sql及其执行时间
前面写到了通过实现mybatis提供的org.apache.ibatis.plugin.Interceptor接口实现了打印SQL执行时间,并格式化SQL及其参数,如果我们使用的是ssm还得再配置文件 ...
- IDEA2020.2版本设置类和方法的自定义注释模板
IDEA是目前普遍使用的Java开发编辑器,添加自定义的注释模板,一方面便捷好用,另外一方面可以规范开发.IDEA中设置模板分两种:1.创建Java类的注释,2.方法的注释. 一.Java类的注释模板 ...
- C# 设置Word文本框中的文字旋转方向
在Word中可插入文本框,默认情况下插入的文本框中的文字方向为横向排列,对于一些特殊文档的设计要求,需要改变文字方向,如本次测试中的文档排版为考生试卷类型,考生信息栏的内容为下图中的这种, 本文将以C ...
- ES6学习笔记之函数(二)
5.作用域 使用默认参数时,参数会形成一个独立的作用域,此作用域与函数体中的作用域是平行关系,互不影响. var x = 1; function show(x, y= function () { x= ...
- Kubernetes自动伸缩pod-HPA
在运维中,虽然能预先知道负载何时会飙升,或者如果负载的变化是较长时间内逐渐发生的,手动扩容也是可以接受的,但指望靠人工干预来处理突发而不可预测的流量增长,仍然不够理想. 幸运的是,Kubernetes ...
- Redis的数据类型以及应用场景
1. Redis的作用 1.1 Redis可以做什么 1.缓存:缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力.Redis提供了键值 ...
- LAMP——搭建基于Apache、wordpress、nfs、mysql、DNS的系统
一.部署架构 二.部署过程 1.在10.0.0.8和10.0.0.18服务器上安装apache服务 [17:10:06 root@centos8 ~]#yum -y install httpd 安装p ...
- 13.7Cloneable接口
要点提示:Cloneable接口给出了一个可克隆对象.
- 企业管理CRM不只是客户录入系统
企业在举办营销活动或者展会之后,将会收集到大量的客户信息,将这些信息有效地整理.完善.储存也是一个不小的工程.如果您的企业经常面遇到这样的情况,不妨使用Zoho CRM系统来帮您完成.但是,Zoho ...
- CentOS-配置JDK(压缩包)
卸载openjdk $ rpm -qa | grep jdk 以上命令用来检查linux上是否安装openjdk,如果安装需要将其全部卸载掉,卸载命令: $ rpm -e --nodeps java- ...