题目大意

维护一个数列 \(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. MySQL事务(四大特征)-存储过程

    目录 一:事务 1.四大特性(ACID) 2.事物存在的必要性(真实比喻) 3.如何使用事务 4.开启事务-回滚-确认 二:事务案例实战 1.模拟消费 2.创建 3.插入数据 4.开启事务 5.修改操 ...

  2. MySQL转义字符+存储过程的使用

    MySQL中大于,大于等于,小于,小于等于的转义写法 一.左边就是原来的符号,右边就是在mybatis中代替的符号 二.如何通过mysql的存储过程创建虚拟表(临时表),并插入1000条数据 这些表通 ...

  3. Python全栈工程师之从网页搭建入门到Flask全栈项目实战(6) - Flask表单的实现

    1.表单介绍 1.1.表单知识回顾 常见的表单元素: 表单标签<form> action:表单提交的URL地址 method:表单请求的方式(GET/POSt) enctype:请求内容的 ...

  4. 前后端开发必会的 HTTP 协议“十全大补丸”(万字长文)

    本文全面介绍了 HTTP 协议相关知识,包括 HTTP 请求报文.响应报文.持久连接.缓存.Cookie 以及 HTTP 版本升级等! HTTP 协议全称为 HyperText Transfer Pr ...

  5. vue3+ts 全局事件总线mitt

    Mitt 在vue3中 $ on,$off 和 $once 实例方法已被移除,组件实例不再实现事件触发接口,因此大家熟悉的EventBus便无法使用了.然而我们习惯了使用EventBus,对于这种情况 ...

  6. 2022CSP-J线上游记

    写在前面 安徽CSP取消了-- 去年CSP考炸的我本来想今年一雪前耻(bushi),结果-- T1 第一题大毒瘤! 首先观察数据可以分类如下两种情况: \(a = 1\) 直接输出\(1\),retu ...

  7. CLISP学习(一)

    Lisp Lisp发表于1960,是由数学家约翰·麦卡锡发明的. 在计算机有所发展时,数学家们对人工智能有着极大的兴趣,觉得可以实现一个共通的方法,使计算机能够处理链表中的符号数据,允许语言的处理.信 ...

  8. 【随笔】Ubuntu18.04下virtualbox卡死的解决办法

    //得到该进程ID X pgrep Xorg //杀掉进程 kill X 然后重新登陆帐号即可

  9. 《Effective C++》资源管理章节

    Item 13:以对象管理资源 关键的两个想法(这种方式其实在很多地方都可以看出影子,比如managing pool的模型): 1.获得资源后立刻放入管理对象(managing object):以对象 ...

  10. P8622 [蓝桥杯 2014 国 B] 生物芯片

    简要题意 有 \(N\) 个二进制数,编号为 \(1\sim N\),初始时都是 \(0\).博士进行了 \(N-1\) 次操作,在第 \(i\) 次操作时,会将 \(1\sim N\) 中所有编号为 ...