JZOJ 5947.初音未来(miku)
题目大意
维护一个数列 \(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)的更多相关文章
- [jzoj NOIP2018模拟11.02]
嗯T1忘记取模了,100到20 嗯T2忘记了那啥定理,暴力也写炸了,这题我认 嗯T3线段树合并分裂没有写炸,考场上就知道妥妥的70分.但是,分数出的时候听到有人说暴力也是70分,我???脸黑,枉我敲了 ...
- 你不一定知道的、并没有什么卵用的一些python库
1. delorean,用来处理时间的库 import datetime import pytz # 一般情况下,我们想表示时间的话 est = pytz.timezone("Asia/Sh ...
- 爬虫 selenium + phantomjs / chrome
selenium 模块 Web自动化测试工具, 可运行在浏览器,根据指定命令操作浏览器, 必须与第三方浏览器结合使用 安装 sudo pip3 install selenium phantomjs 浏 ...
- [转]爬虫 selenium + phantomjs / chrome
目录 selenium 模块 安装 phantomjs 浏览器 安装 chromedriver 接口 安装 对比两个接口 整合使用 基本实例 常用属性方法 定位节点 节点操作 其他操作 实例解析 - ...
- python基本数据类型;字符串及其方法三:
###################判断类型################### ######################################################### ...
- 什么是A站、B站、C站、D站、E站、F站、G站、HIJKLM站N站?
A站AcFun弹幕视频网,简称“A站”,成立于2007年6月,取意于Anime Comic Fun,是中国大陆第一家弹幕视频网站.A站以视频为载体,逐步发展出基于原生内容二次创作的完整生态,拥有高质量 ...
- python爬虫学习(2) —— 爬一下ZOL壁纸
我喜欢去ZOL找一些动漫壁纸当作桌面,而一张一张保存显然是太慢了. 那怎么办呢,我们尝试使用简单的爬虫来解决这个问题. 0. 本爬虫目标 抓取给定分类「或子分类」网址的内容 分析并得到每个分类下的所有 ...
- 他们在军训,我在搞 OI(一)
Day 1 理论上,我现在不应该坐在电脑前打字,因为早在今天上午 6:20 全体新高一同学就坐车前往军(无)训(尽)基(炼)地(狱)了,而今天上午 6:20 我还在被窝里呢…… 没错,我旷掉了军训,然 ...
- Gartner: Hype Cycle for Emerging Technologies-2012 (技术成熟度曲线) [转]
英文稿: The “Hype Cycle for Emerging Technologies” report is the longest-running annual Hype Cycle, p ...
- 编程语言拟人化: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つの ...
随机推荐
- MyBatis02:流程分析、注解、代理dao实现CRUD、参数深入、传统DAO、配置
今日内容 回顾 mybatis的自定义.分析和环境搭建 完善基于注解的mybatis mybatis的curd(基于代理dao的方式)※ mybatis的参数深入及结果集的深入 mybatis中基于传 ...
- 【消息队列面试】15-17:高性能和高吞吐、pull和push、各种MQ的区别
十五.kafka高性能.高吞吐的原因 1.应用 日志收集(高频率.数据量大) 2.如何保证 (1)磁盘的顺序读写-pagecache关联 rabbitmq基于内存读写,而kafka基于磁盘读写,但却拥 ...
- 【笔面试真题】ThoughtWorks-笔试-2022年1月21日
一.选择填空判断 2n-1 二.算法题 算法题1:配对括号 算法题2:计算有效票数? 算法题3:求字符串中指定单词的数量 package com.jhliu20.real; import java.u ...
- VSCode解决Python中空格和制表符混用报错
Python对缩进的要求非常严格,缩进控制不正确可能会造成代码执行不正确甚至报错. 遇到报错"TabError: inconsistent use of tabs and spaces in ...
- js 定时器(setInterval)
js 定时器 分类 编程技术 js 定时器有以下两个方法: setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式.方法会不停地调用函数,直到 clearInterval() ...
- Java7提供的Fork/Join框架实现高并发程序,你会使用吗?
摘要:Fork/Join框架位于J.U.C(java.util.concurrent)中,是Java7中提供的用于执行并行任务的框架,其可以将大任务分割成若干个小任务,最终汇总每个小任务的结果后得到最 ...
- CVE-2020-1938与CVE-2020-13935漏洞复现
前言 最近在腾讯云上买了个服务器,准备用来学习.在安装了7.0.76的tomcat后,腾讯云提醒我存在两个漏洞,分别是CVE-2020-1938和CVE-2020-13935,在修复完漏洞后,准备复现 ...
- [随笔所想] UBC学习生活经验分享
当时受到了很多人的帮助,在网上也查到了很多经验帖子,比如如何办理签证,如何填写表格,要准备哪些材料以及生活上要带哪些物品,等等.当时就想到等我办理好这些,也一定和大家分享,为更多的人提供一些参考. 1 ...
- [python] 圆形嵌套图Circular Packing
圆形嵌套图Circular Packing 文章目录 圆形嵌套图Circular Packing 1 具有一级层次的圆形嵌套图绘制 1.1 绘图数据与circlify计算 1.2 图形绘制 1.2.1 ...
- 《《关于我把好好的c++小游戏改的很ex》》
#undef UNICODE#undef _UNICODE#include <iostream>#include <iomanip>#include <string> ...