JZOJ 5947. 【NOIP2018模拟11.02】初音未来

这是一道关于模拟音调序列操作的题目,来自NOIP2018模拟赛。用户需要处理一个全排列的音调序列,通过升序排序区间来达到特定效果。解决方案包括70分的桶排和100分的逆序对分析,其中关键在于理解冒泡排序与逆序对的关系,并利用线段树进行高效操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

Hercier作为一位喜爱Hatsune Miku的OIer,痛下决心,将Vocaloid买回了家。打开之后,你发现界面是一个长为n的序列,代表音调,并形成了全排列。你看不懂日语,经过多次尝试,你只会用一个按钮:将一段区间按升序排序。不理解音乐的Hercier决定写一个脚本,进行m次操作,每次对一段区间进行操作。可惜Hercier不会写脚本,他找到了在机房里的你,请你模拟出最后的结果。

数据范围
在这里插入图片描述

题解

70分做法:
O(m log2n)O(m\ log^2n)O(m log2n)
40分送的。
测试点3-7,直接就二分答案就好了。变成只有0和1组成的序列。
O(nm)O(nm)O(nm)桶排,同样能拿到70分。
100分:
抓住重点:考虑冒泡排序与逆序对的关系。如果一段序列没有逆序对,那么可以不理之。
一种水法,暴力桶排,修改b[i]的前缀和s[i]。
b[i]表示a[i]和a[i-1]是否构成逆序对(0/1)
如果s[r]=s[l],那么操作[l,r]无用。
循环展开一下即可。
正解:
逆序对不超过n(n−1)2\frac{n(n-1)}{2}2n(n1)个。
如果一段序列没有逆序对,那么可以不理之。
维护一个线段树,对势能分析整体感知,看似暴力的方法,实际上是能过的。
线段树维护b[i]
如果每次找到最左边的逆序对所在的位置x,经过一些修改,使得[l,x]这段区间变得有序,那么不是做完了吗?
反正最多只会被交换O(n2)O(n^2)O(n2)次。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N 1510
#define Min(x,y) ((x)<(y)?(x):(y))
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
bool tr[N<<2];
bool la[N<<2];
int i,j,k,l,r,n,m,ans;
int L,R,opl,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值