题目大意

维护一个数列 \(a_n\),\(m\) 次操作,每次对区间 \([l..r]\) 进行升序排序

求最后询问区间 \([L..R]\),输出 \(a_L,a_{L+1},···,a_{R}\)

思路

首先很容易想到暴力,这题暴力太好打了!!!

然而我们需要正解

于是有了后文

我们发现排序一段区间如果用冒泡排序的话就要 \(O(S^2)\),其中 \(S\) 为区间大小

进而挖掘冒泡排序的本质,如果 \(a[i]>a[i+1]\) 的话两数就要交换(本题需升序,故符号为大于,降序反之)

发现我们在进行交换时做了没必要的比较

如果能直接找到形如 \(a[i]>a[i+1]\) 的两个数直接交换,那么交换的次数一共加起来最多是 \(O(n^2)\) 级别的

那么,对于一个待排序区间,只有找到形如 \(a[i]>a[i+1]\) 的两个数直接交换,一直到区间没有这对数,那么排序就完成了

下次对于已经交换过的一对相邻的数是不会再交换的,即不会再花费时间

那么总的复杂度就是 \(O((n^2+m)\log n)\) 的

可以接受

用线段树维护,初始时全为极大数(例如 \(0x3f3f3f3f\)),根据冒泡排序的交换顺序,找到最靠左的一对数交换

所以我们如果发现形如 \(a[i]>a[i+1]\) 的两个数,就把把线段树 \(i\) 位置的值改成 \(i\),然后维护一个 \(min\) 值,这样查区间最小就能找到最靠左的数

具体考虑,就是对于一个操作,我们找到最靠左的一对形如 \(a[i]>a[i+1]\) 的两个数直接交换,考虑交换后 \(a[i]\) 对 \(a[i-1]\) 的影响和 \(a[i+1]\) 对 \(a[i+2]\) 的影响。如果又产生了形如 \(a[i]>a[i+1]\) 的一对数,我们把线段树 \(i\) 位置的值改成 \(i\),直到再无这种数。当然两数交换后我们要把线段树 \(i\) 位置的值改成 \(0x3f3f3f3f\)

\(Code\)

#include<cstdio>
#include<iostream>
using namespace std; const int N = 1505;
int n , m , L , R , a[N] , seg[N << 2]; inline void pushup(int k){seg[k] = min(seg[k << 1] , seg[k << 1 | 1]);} inline void build(int l , int r , int k)
{
if (l == r)
{
seg[k] = 0x3f3f3f3f;
return;
}
int mid = (l + r) >> 1;
build(l , mid , k << 1);
build(mid + 1 , r , k << 1 | 1);
pushup(k);
} inline void change(int x , int v , int l , int r , int k)
{
if (l == r && l == x)
{
seg[k] = v;
return;
}
int mid = (l + r) >> 1;
if (x <= mid) change(x , v , l , mid , k << 1);
if (x > mid) change(x , v , mid + 1 , r , k << 1 | 1);
pushup(k);
} inline int query(int x , int y , int l , int r , int k)
{
if (x <= l && r <= y) return seg[k];
int mid = (l + r) >> 1 ,res = 0x3f3f3f3f;
if (x <= mid) res = min(res , query(x , y , l , mid , k << 1));
if (y > mid) res = min(res , query(x , y , mid + 1 , r , k << 1 | 1));
return res;
} int main()
{
freopen("miku.in" , "r" , stdin);
freopen("miku.out" , "w" , stdout);
scanf("%d%d%d%d" , &n , &m , &L , &R);
build(1 , n , 1);
for(register int i = 1; i <= n; i++)
{
scanf("%d" , a + i);
if (i > 1 && a[i - 1] > a[i]) change(i - 1 , i - 1 , 1 , n , 1);
}
int x , y;
for(register int i = 1; i <= m; i++)
{
scanf("%d%d" , &x , &y);
if (x == y) continue;
while (1)
{
int l = query(x , y - 1 , 1 , n , 1);
if (l == 0x3f3f3f3f) break;
swap(a[l] , a[l + 1]);
change(l , 0x3f3f3f3f , 1 , n , 1);
if (l - 1 && a[l - 1] > a[l]) change(l - 1 , l - 1 , 1 , n , 1);
if (l + 2 <= n && a[l + 1] > a[l + 2]) change(l + 1 , l + 1 , 1 , n , 1);
}
}
for(register int i = L; i <= R; i++) printf("%d " , a[i]);
}

JZOJ 5947.初音未来(miku)的更多相关文章

  1. [jzoj NOIP2018模拟11.02]

    嗯T1忘记取模了,100到20 嗯T2忘记了那啥定理,暴力也写炸了,这题我认 嗯T3线段树合并分裂没有写炸,考场上就知道妥妥的70分.但是,分数出的时候听到有人说暴力也是70分,我???脸黑,枉我敲了 ...

  2. 你不一定知道的、并没有什么卵用的一些python库

    1. delorean,用来处理时间的库 import datetime import pytz # 一般情况下,我们想表示时间的话 est = pytz.timezone("Asia/Sh ...

  3. 爬虫 selenium + phantomjs / chrome

    selenium 模块 Web自动化测试工具, 可运行在浏览器,根据指定命令操作浏览器, 必须与第三方浏览器结合使用 安装 sudo pip3 install selenium phantomjs 浏 ...

  4. [转]爬虫 selenium + phantomjs / chrome

    目录 selenium 模块 安装 phantomjs 浏览器 安装 chromedriver 接口 安装 对比两个接口 整合使用 基本实例 常用属性方法 定位节点 节点操作 其他操作 实例解析 - ...

  5. python基本数据类型;字符串及其方法三:

    ###################判断类型################### ######################################################### ...

  6. 什么是A站、B站、C站、D站、E站、F站、G站、HIJKLM站N站?

    A站AcFun弹幕视频网,简称“A站”,成立于2007年6月,取意于Anime Comic Fun,是中国大陆第一家弹幕视频网站.A站以视频为载体,逐步发展出基于原生内容二次创作的完整生态,拥有高质量 ...

  7. python爬虫学习(2) —— 爬一下ZOL壁纸

    我喜欢去ZOL找一些动漫壁纸当作桌面,而一张一张保存显然是太慢了. 那怎么办呢,我们尝试使用简单的爬虫来解决这个问题. 0. 本爬虫目标 抓取给定分类「或子分类」网址的内容 分析并得到每个分类下的所有 ...

  8. 他们在军训,我在搞 OI(一)

    Day 1 理论上,我现在不应该坐在电脑前打字,因为早在今天上午 6:20 全体新高一同学就坐车前往军(无)训(尽)基(炼)地(狱)了,而今天上午 6:20 我还在被窝里呢…… 没错,我旷掉了军训,然 ...

  9. Gartner: Hype Cycle for Emerging Technologies-2012 (技术成熟度曲线) [转]

      英文稿: The “Hype Cycle for Emerging Technologies” report is the longest-running annual Hype Cycle, p ...

  10. 编程语言拟人化:Java、C++、Python、Ruby、PHP、C#、JS!--隆重推荐转

    http://next.rikunabi.com/tech/docs/ct_s03600.jsp?p=002412 Java.C++.Python.Ruby.C#.PHP.JavaScript.7つの ...

随机推荐

  1. 【Java EE】Day12 XML、约束(DTD、Schema)、解析方式、Jsoup、选择器(Selector、XPath)

    一.XML介绍 1.概述 Extensible Markup Language--可扩展标记语言 标记语言 :标签构成 可扩展:可以自定义标签 2.功能 存储数据 作为配置文件使用 作为数据载体在网络 ...

  2. .NET周报【12月第1期 2022-12-08】

    国内文章 CAP 7.0 版本发布通告 - 支持延迟消息,性能炸了? https://www.cnblogs.com/savorboard/p/cap-7-0.html) 今天,我们很高兴宣布 CAP ...

  3. .NET 云原生架构师训练营(基于 OP Storming 和 Actor 的大型分布式架构一)--学习笔记

    目录 为什么我们用 Orleans Dapr VS Orleans Actor 模型 Orleans 的核心概念 为什么我们用 Orleans 分布式系统开发.测试的难度(服务发现.通信) 运维的复杂 ...

  4. 使用 SmartIDE 开发golang项目

    目录 概述 架构 开发视图 快速开始 安装 SmartIDE CLI 环境 启动 创建环境 安装工具 调试 基本调试 Start 命令调试 很荣幸在去年加入到 SmartIDE 产品组,从事开发工作, ...

  5. python函数及算法

    算法二分法 二分算法图 什么是算法? ​ 算法是高效解决问题的办法. 需求:有一个按照从小到大顺序排列的数字列表,查找某一个数字 # 定义一个无序的列表 nums = [3,4,5,67,8,9,12 ...

  6. 零基础入门 Java 后端开发,有哪些值得看的视频?

    目前网络上充满了大量的 Java 视频教程,然而内容却鱼龙混杂,为了防止小伙伴们踩坑,一枫结合自己的学习经验,向大家推荐一些不错的学习资源. 作为一名非科班转码选手,可以说,我是在哔哩哔哩上的研究生! ...

  7. python Modbus 进行通讯时抛出Modbus Error: Exception code = 2

    源码: import modbus_tk from modbus_tk import modbus_tcp import modbus_tk.defines as cst PORT = 'com1' ...

  8. 金融科技 DevOps 的最佳实践

    随着软件技术的发展,越来越多的企业已经开始意识到 DevOps 文化的重要价值.DevOps 能够消除改变公司业务开展方式,并以更快的速度实现交付,同时创建迭代反馈循环以实现持续改进.而对于金融科技( ...

  9. 模仿 vscode-server 把本地代码目录映射到外网

    目录 概述 分析 解决方案 准备一台VM 创建容器 SmartIDE 创建 直接使用 docker 创建 SSH 远程转发 内网穿透 ngrok frp 服务端 客户端 本文模仿 vscode-ser ...

  10. wsl2 kali修改语言

    直接执行sudo dpkg-reconfigure locales 会提示 dpkg-query: package 'locales' is not installed and no informat ...