[NOIP模拟]新排序

样例输入:

4
5
1 2 3 4 5
5
5 4 3 2 1
5
1 2 3 2 1
5
2 4 1 3 5

样例输出:

5
1 2 3 4 5
0

2
1 2
3
2 3 5

数据范围:
对于40%的数据,N≤1000;
对于70%的数据,N≤50000;
对于100%的数据,T≤5;N≤100000;
题目分析:
考试总结:考试的时候,想用队列加各种情况打标记来处理,还激动的以为是正解。但是对拍又各种过不了,苦苦思考修改,结果快考完的时候,幡然醒悟单纯的队列是无法实现的。
分析:我们可以先扫一遍将不合法的点的左右两边(各一个)的数加入一个队列(可加入的条件,预备加入的数没有被加入且不是不合法的点,实际上加入的是一段不合法序列的左右两边的数),因为当你删掉这一段后,影响的就是这两个数。于是队列里又有了一些数,再对这些数判断是否有不合法的序列,重复上面的操作(此时加入左右两边的数是指不合法的数在原序列的左右两边),直到队列里面没有不合法的数。也许你会问,这和暴力模拟有什么区别。暴力模拟,每次要检查的是除掉当前不合法数后的整个序列。而上面的方法只加入不合法序列两端的两个数,因为每个数只会入队列一次(因为要判断是否已加入且它是不是不合法的数(不合法是只要这个数不合法过,就会一直标记))所以O(n)。
附代码:

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<ctime>
#include<cmath>
#include<cstring>
#include<string>
#include<cctype>
#include<iomanip>
#include<algorithm>
using namespace std;

const 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值