题目传送门


题目描述

在2016年,佳媛姐姐喜欢上了数字序列。

因而她经常研究关于序列的一些奇奇怪怪的问题,现在她在研究一个难题,需要你来帮助她。

这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排序分为两种:1:(0,l,r)表示将区间[l,r]的数字升序排序2:(1,l,r)表示将区间[l,r]的数字降序排序最后询问第q位置上的数字。


输入格式

输入数据的第一行为两个整数n和m。n表示序列的长度,m表示局部排序的次数。
第二行为n个整数,表示1到n的一个全排列。
接下来输入m行,每一行有三个整数op,l,r,op为0代表升序排序,op为1代表降序排序,l,r表示排序的区间。
最后输入一个整数q,q表示排序完之后询问的位置。


输出格式

输出数据仅有一行,一个整数,表示按照顺序将全部的部分排序结束后第q位置上的数字。


样例

样例输入

6 3
1 6 2 5 3 4
0 1 4
1 3 6
0 2 4
3

样例输出

5


数据范围与提示

$1\leqslant n,m\leqslant {10}^5$

$1\leqslant q\leqslant n$


题解

它放在了“不打正解的我”这一板块,正解是线段树,时间复杂度$\Theta (m\log^2n)$。

确实,这道题我打的暴力。

首先考虑暴力sort,时间复杂度:$\Theta (m\times n\log n)$。

但是,$10^5$的数据范围显然跑不过,于是我便想到了一个并不常用的排序方法:桶排序。

这道题保证了这$n$个数是$n$的全排列,于是桶排序可行。

但是稳妥的桶排序在统计答案的时候需要扫整个区间,在$m$次询问后时间复杂度会变为$\Theta (n\times m)$,显然有不可做了。

那么我在往桶里放数的时候标记一下放进去的最大值和最小值,然后在往外拿的时候只扫描这个区间,成功卡过,甚至比某些打的不怎么优秀的线段树还要快。

码长和内存才是亮点。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int a[100001],t[100001];
void change0(int l,int r)//升序
{
int maxn=0,minn=20020923,flag=l;
for(int i=l;i<=r;i++)
{
t[a[i]]=1;
minn=min(minn,a[i]);
maxn=max(maxn,a[i]);
}
for(int i=minn;i<=maxn;i++)
if(t[i])a[flag++]=i,t[i]=0;
}
void change1(int l,int r)//降序
{
int maxn=0,minn=20020923,flag=l;
for(int i=l;i<=r;i++)
{
t[a[i]]=1;
minn=min(minn,a[i]);
maxn=max(maxn,a[i]);
}
for(int i=maxn;i>=minn;i--)
if(t[i])a[flag++]=i,t[i]=0;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
while(m--)
{
int op,l,r;
scanf("%d%d%d",&op,&l,&r);
if(op)change1(l,r);
else change0(l,r);
}
scanf("%d",&n);
printf("%d",a[n]);
return 0;
}

rp++

[BZOJ4552]:[Tjoi2016&Heoi2016]排序(桶排序)的更多相关文章

  1. 记数排序 & 桶排序 & 基数排序

    为什么要写这样滴一篇博客捏...因为一个新初一问了一道水题,结果就莫名其妙引起了战斗. 然后突然发现之前理解的桶排序并不是真正的桶排序,所以写一篇来区别下这三个十分相似的排序辣. 老年菜兔的觉醒!!! ...

  2. bzoj千题计划128:bzoj4552: [Tjoi2016&Heoi2016]排序

    http://www.lydsy.com/JudgeOnline/problem.php?id=4552 二分答案 把>=mid 的数看做1,<mid 的数看做0 这样升序.降序排列相当于 ...

  3. BZOJ4552:[TJOI2016&HEOI2016]排序(线段树,二分)

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他. 这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  4. BZOJ4552 Tjoi2016&Heoi2016排序 【二分+线段树】*

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个 ...

  5. Python线性时间排序——桶排序、基数排序与计数排序

    1. 桶排序 1.1 范围为1-M的桶排序 如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort).留置一个数组S,里面含有M个桶,初始化为0.然 ...

  6. python 排序 桶排序

    算法思想: 桶排序将数组分到有限数量的桶里.然后每个桶里再分别排序(使用任何算法) 当要倍排序的数组内的数值时均匀分配的时候,桶排序使用线性时间O(n) 步骤: 根据最大值.最小值.桶内数据范围设定一 ...

  7. [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树/线段树分裂与合并)

    解法一:二分答案+线段树 首先我们知道,对于一个01序列排序,用线段树维护的话可以做到单次排序复杂度仅为log级别. 这道题只有一个询问,所以离线没有意义,而一个询问让我们很自然的想到二分答案.先二分 ...

  8. BZOJ4552 [Tjoi2016&Heoi2016]排序 【二分 + 线段树】

    题目链接 BZOJ4552 题解 之前去雅礼培训做过一道题,\(O(nlogn)\)维护区间排序并能在线查询 可惜我至今不能get 但这道题有着\(O(nlog^2n)\)的离线算法 我们看到询问只有 ...

  9. [bzoj4552][Tjoi2016][Heoi2016]排序

    Description 给出一个$1$到$n$的全排列,现在对这个全排列序列进行$m$次局部排序,排序分为$2$种: $1.(0,l,r)$表示将区间$[l,r]$的数字升序排序; $2.(1,l,r ...

随机推荐

  1. [BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增)

    [BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增) 题面 题面较长,略 分析 首先套路的断环为链.对于从l到r的环上区间,若l<=r,我们 ...

  2. D-多连块拼图

    多连块是指由多个等大正方形边与边连接而成的平面连通图形. – 维基百科 给一个大多连块和小多连块,你的任务是判断大多连块是否可以由两个这样的小多连块拼成.小多连块只能平移,不能旋转或者翻转.两个小多连 ...

  3. Django之F和Q查询

    一.F查询 rom django.db.models import F from app01.models import Book Book.objects.update(price=F(" ...

  4. Cypher 语句实战

    Cypher 语句实战 下载和安装 Neo4j windows 桌面版- 环境设置 https://www.w3cschool.cn/neo4j/neo4j_exe_environment_setup ...

  5. Redis---使用场景

    3.使用场景 计数器   可以对String进行自增自减运算,从而实现计算器功能.   Redis这种内存型数据库的读写性能非常高,很适合存储频繁读写的及数量 缓存   将热点数据放到内存中,设置内存 ...

  6. md5sum - 计算检验MD5效验码

    总览 (SYNOPSIS) ../src/md5sum [OPTION] [FILE]... ../src/md5sum [OPTION] --check [FILE] 描述 (DESCRIPTION ...

  7. opencv python 图像二值化/简单阈值化/大津阈值法

    pip install matplotlib 1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表 ...

  8. 使用HashSet实现不重复的随机数

    package demo; import java.util.HashSet; import java.util.Random; public class RandomDemo { public st ...

  9. django + celery的队列,路由与弹性

    #celery_app.py #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import absolute_import ...

  10. 长沙理工大学第十二届ACM大赛-重现赛 J 武藏牌牛奶促销

    链接:https://ac.nowcoder.com/acm/contest/1/J 来源:牛客网 武藏牌牛奶促销 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他 ...