#线段树#洛谷 3988 [SHOI2013]发牌
分析
fake:此题不就是链表模拟题吗,我一开始还真这么想
貌似链表什么用都没有,根据题意很清楚,要找一个支持删除和查询区间第\(k\)大的数据结构
解释一下为什么题目可以转换为查询区间第\(k\)大,
如果记录一下上一次删除的位置(这里指的是排名)和总牌数,是不是可以从\(上一次删除位置+kth\)对总牌数取模以重新找到下一次查询的排名,这样周而复始
那这个数据结构要找什么呢平衡树
平衡树当然可以,但是我目前只敲过模板,所以还是算了
也可以用线段树,维护区间未被删除的数的个数,查询第\(k\)大时,如果左区间未被删除的数的个数不小于在当前区间的排名,那么往左边走,否则往右边走
时间复杂度是\(O(n \log n)\)。(当然可以用树状数组+倍增解决,时间复杂度相同)
然而跑得比多带一个log的树状数组+二分还要慢
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
int w[2800011],n;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void build(int k,int l,int r){
if (l==r) {w[k]=1; return;}
rr int mid=(l+r)>>1;
build(k<<1,l,mid),build(k<<1|1,mid+1,r);
w[k]=w[k<<1]+w[k<<1|1];
}
inline void update(int k,int l,int r,int x){
if (l==r) {w[k]=0; return;}
rr int mid=(l+r)>>1;
if (x<=mid) update(k<<1,l,mid,x);
else update(k<<1|1,mid+1,r,x);
w[k]=w[k<<1]+w[k<<1|1];
}
inline signed kth(int k,int l,int r,int x){
if (l==r) return l;
rr int mid=(l+r)>>1;
if (w[k<<1]>=x) return kth(k<<1,l,mid,x);
else return kth(k<<1|1,mid+1,r,x-w[k<<1]);
}
signed main(){
n=iut(),build(1,1,n);
for (rr int i=1,now=1;i<=n;++i,putchar(10)){
rr int t=(iut()+now)%w[1],del; if (!t) t=w[1];
print(del=kth(1,1,n,now=t)),update(1,1,n,del);
}
return 0;
}
#线段树#洛谷 3988 [SHOI2013]发牌的更多相关文章
- BZOJ 4415 洛谷 3988 [Shoi2013]发牌
[题解] 权值线段树.查询当前牌堆顶的牌并且删掉就好了. #include<cstdio> #include<algorithm> #define N 3000010 #def ...
- 线段树 洛谷P3932 浮游大陆的68号岛
P3932 浮游大陆的68号岛 题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无 ...
- [线段树]洛谷P5278 算术天才⑨与等差数列
题目描述 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能否形成公差为k ...
- 区间连续长度的线段树——洛谷P2894 [USACO08FEB]酒店Hotel
https://www.luogu.org/problem/P2894 #include<cstdio> #include<iostream> using namespace ...
- 洛谷 P3998 [SHOI2013]发微博
洛谷 P3998 [SHOI2013]发微博 洛谷传送门 题目描述 刚开通的 SH 微博共有n个用户(1Ln标号),在这短短一个月的时间内, 用户们活动频繁,共有m 条按时间顺序的记录: ! x 表示 ...
- AC日记——校门外的树 洛谷 P1047
题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种 ...
- 带修主席树 洛谷2617 支持单点更新以及区间kth大查询
题目链接:https://www.luogu.com.cn/problem/P2617 参考博客:https://blog.csdn.net/dreaming__ldx/article/details ...
- 洛谷 P3989 [SHOI2013]阶乘字符串 解题报告
P3989 [SHOI2013]阶乘字符串 题目描述 给定一个由前\(n(\le 26)\)个小写字母组成的串\(S(|S|\le 450)\).串\(S\)是阶乘字符串当且仅当前 \(n\) 个小写 ...
- 洛谷 P3990 [SHOI2013]超级跳马 解题报告
P3990 [SHOI2013]超级跳马 题目描述 现有一个\(n\) 行 \(m\) 列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘. ...
- [bzoj4417] [洛谷P3990] [Shoi2013] 超级跳马
Description 现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.例如,当n = 3, m = 10时,下图是一种可 ...
随机推荐
- 【Azure Redis 缓存】Redis 连接失败
问题描述 Azure Redis 出现连接失败,过一会儿后,又能自动恢复. 问题解答 其实,因为Azure Redis服务一直都有升级维护的操作(平均每月一次),Redis服务更新是平台自动进行的计划 ...
- 【Azure 应用服务】如何查看App Service中的私网IP地址?
问题描述 在使用App Service服务时,可以通过Azure 门户中的属性功能查看出站IP列表. 如果把App Service与虚拟网络(VNET)集成后,它就可以直接访问虚拟网络内部资源,那么如 ...
- JVM内存模式
Java内存模型即Java Memory Model,简称JMM. JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式.JVM 是整个计算机虚拟模型,所以 JMM 是隶属于 JV ...
- clickhouse 安装启动报<Error> Application: DB::Exception: There is no profile 'default' in configuration file. 以及常见的错误的总结
1.启动时报错<Error> Application: DB::Exception: There is no profile 'default' in configuration file ...
- 记一次dockerfile无法构建问题追溯
我有一个dockerfile如下: ENTRYPOINT ["/sbin/tini","-g", "--"] CMD /home/scrap ...
- vmware完全卸载 防止出现各种问题治标不治本
首先打开系统盘根目录,搜索" VMware ",把搜到的都删掉,去控制面板那里卸载掉VMware 打开管理(右键"我的电脑"),管理打开设备管理器," ...
- 菜单导航tab切换样式的小技巧
1.最终效果 2.HTML结构 <div class="licaiMenu"> <ul class="navi"> <li> ...
- java.util.Arrays 快速学习教程
在 Java 中,java.util.Arrays类提供的多种数组操作功能,可以有效地执行各种数组相关的操作,使得数组处理变得简单和高效. 打印数组 String[] arr = new String ...
- Scyther 协议形式化验证翻译 (第二章)
论文概述:$\alpha +\forall (\sum \oint_{3}^{4})$ 第二章: 操作语义 在第二章中我提出了一种新的安全协议的模型,用于定义安全协议以及协议的行为,在明确的模型中执 ...
- 读书笔记:CSAPP 11章 网络编程
深入理解计算机系统 第11章 本章代码:Index of /afs/cs/academic/class/15213-f15/www/code/22-netprog2 其中包含本章课本示例代码,测试 T ...