LINK

考虑枚举以 i i i位置作为开头而 j j j位置作为结尾位置,可以得到最后排序后的数组

那么扫描所有 a k ! = b k a_k!=b_k ak​!=bk​的索引 k k k

如果此时 a k < b k a_k<b_k ak​<bk​是无解的,因为交换操作只能让数字变小

如果此时 a k = = b k a_k==b_k ak​==bk​,不需要管

如果此时 a k > b k a_k>b_k ak​>bk​,需要把 a k a_k ak​加入操作队列,且此时的操作前驱是数字 b i b_i bi​对应的索引位置

但是此时的复杂度比较劣,为 O ( n 3 l o g ( n ) ) O(n^3log(n)) O(n3log(n))

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
int a[maxn],b[maxn],n,ans,x;
int main()
{ios::sync_with_stdio( false ); cin.tie( 0 ); cout.tie( 0 );int t; cin >> t;while( t-- ){cin >> n >> x;int ans = 1e9, flag = 1;for(int i=1;i<=n;i++){cin >> a[i];if( a[i]<a[i-1] )  flag = 0;}if( flag )   ans = 0;for(int i=1;i<=n;i++){if( a[i]<=x ) continue;for(int j=1;j<=n;j++){if( a[j]<a[i] )    continue;for(int q=1;q<=n;q++)   b[q] = a[q];b[j] = x;sort( b+1,b+1+n );int res = 0;vector<int>v1,v2;for(int q=1;q<=n;q++){if( a[q]==b[q] ) continue;res++;//为了把b[q]换过来 if( a[q]<b[q] )    { res = 1e9; break; }v1.push_back( a[q] ); v2.push_back( b[q] );}if( res>=1e9 )    break;sort( v1.begin(),v1.end() ); sort( v2.begin(),v2.end() );for(int i=0;i<v1.size()-1;i++)if( v1[i]!=v2[i+1] )   res = 1e9;if( v1[v1.size()-1]!=a[j] ) res = 1e9;if( v2[0]!=x )  res = 1e9;ans = min( ans,res );}}if( ans>n )   ans = -1;cout << ans << endl;}
}

正解

正解就比较巧妙了emm

由于操作的实质,是选择一个递增的序列,整体往右移一个距离,且第一个位置变成 x x x

也就是 a x 1 , a x 2 . . . a x k = = > x , a x 1 . . . . a x k − 1 a_{x_1},a_{x_2}...a_{x_k} ==> x,a_{x_1}....a_{x_{k-1}} ax1​​,ax2​​...axk​​==>x,ax1​​....axk−1​​,整体减小

所以选定的索引满足 x < a x 1 < a x 2 . . . < a x k x<a_{x_1}<a_{x_2}...<a_{x_k} x<ax1​​<ax2​​...<axk​​,交换并不会改变相对大小,所以需要满足

x 1 < x 2 < x 3 . . . < x k x_1<x_2<x_3...<x_k x1​<x2​<x3​...<xk​

所以操作一定是从前往后的(如果这都不能有序就无解)

注意到若存在 a i > x & & a j > x & & i < j a_i>x\&\&a_j>x\&\&i<j ai​>x&&aj​>x&&i<j

如果 a i a_i ai​不与 x x x交换,那么 a j a_j aj​也不会和 x x x交换

如果 a j a_j aj​坚持和 x x x交换,此时 a j = x < a i a_j=x<a_i aj​=x<ai​不满足升序

所以只需要从前往后扫描,每次先检查数组是否已经有序,有的话就退出输出答案

否则检查当前 a i a_i ai​是否大于 x x x,如果大于就交换

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
int a[maxn],b[maxn],n,ans,x;
int main()
{ios::sync_with_stdio( false ); cin.tie( 0 ); cout.tie( 0 );int t; cin >> t;while( t-- ){cin >> n >> x;for(int i=1;i<=n;i++)   cin >> a[i];int las = n;for(int i=n-1;i>=1;i--){if( a[i]<=a[i+1] ) las = i;else   break;}int ans = 0;for(int i=1;i<=n;i++){if( a[i]<=x )  continue;if( i>=las && a[i]>=a[i-1] )   break;swap( a[i],x ); ans++;}for(int i=2;i<=n;i++)if( a[i]<a[i-1] ) ans = -1;cout << ans << endl;}
}

1455 D. Sequence and Swaps(思维)相关推荐

  1. 1455D. Sequence and Swaps(思维)

    传送门 因为不论怎么交换 x x x的值,只要进去换了,必定会有一个原数组 a a a内的元素出来 由于 n n n不大我们果断枚举那个出来的元素,然后把 x x x加入进去 那么对这个新的数组 b ...

  2. codeforces1455 D. Sequence and Swaps

    昨天晚上巨困,就没有打,今天课间的时候就看了一下D题,发现好像可以瞎搞,于是吃完饭就写了一下,调过样例一次就A了qaq. D. Sequence and Swaps 枚举+贪心 由于数据范围n≤500 ...

  3. D. Sequence and Swaps

    D. Sequence and Swaps 解题思路:因为n的范围是500,可以枚举,将a[i]与x替换,对形成的b数组排序,判断a数组能否转化成b数组. #include<bits/stdc+ ...

  4. Codeforces Round #743 (Div. 2) B. Swaps 思维

    题目地址Codeforces Round #743 (Div. 2) B. Swaps 题意很好懂,这里就不复述了. 思路:因为是要让a小于b,所以可以用双指针,在b数组中找到第一个大于a数组中第i个 ...

  5. CodeForces - 1265D Beautiful Sequence(贪心+构造+思维)

    题目链接:点击查看 题目大意:给出a个0,b个1,c个2,d个3,要求构造一种序列,使得数列两两之间绝对值之差等于1,若不能构造输出NO 题目分析:首先我们需要稍微讨论一下特殊情况,那就是对于两端的数 ...

  6. AT2005-[AGC003E]Sequential operations on Sequence【差分,思维】

    正题 题目链接:https://www.luogu.com.cn/problem/AT2005 题目大意 开始有一个1∼n1\sim n1∼n依次排列的序列,然后QQQ次,第iii次把序列长度变为ai ...

  7. Sequence and Swaps

    DVI2-D 思考: 首先题目就是说给一个序列,然后一个x,如果va[i]>x,那么他俩就可以交换.现在就问最少多少次可以成为非严格上升序列,如果不可能就-1.刚开始会想换最小的?,找环,其实上 ...

  8. Educational Codeforces Round 37 (Rated for Div. 2)

    我的代码应该不会被hack,立个flag A. Water The Garden time limit per test 1 second memory limit per test 256 mega ...

  9. matlab兔子繁殖问题,斐波那契数列在《疯狂动物城》兔子繁衍中的应用

    摘    要: 计算思维的构建有助于帮助学生将实际问题转换为透明易懂的框架算法, 并借助计算机解决.以电影<疯狂动物城>中的兔子繁殖问题为例, 引出斐波那契数列, 引导学生将数学表达式转化 ...

最新文章

  1. Django站点管理、视图和URL(管理界面本地化、创建管理员、注册模型类、发布内容到数据库、定义视图、配置URLconf)
  2. 安卓 激活应用组件 intent
  3. 反欺诈技术揭秘-设备指纹VS关系网络模型 此博文包含图片 (2017-05-12 10:23:52)转载▼ 标签: 设备指纹 关系网络 反欺诈 神经网络模型 分类: 风控 文章来源:网络(经整合梳理
  4. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的SPI驱动架构分析
  5. CVE-2019-0708 BlueKeep的扫描和打补丁
  6. Spring Bean配置默认为单实例 pring Bean生命周期
  7. Shell 脚本语法
  8. 脉冲神经网络 神经元模型-Izhikevich模型(3)
  9. python-opencv第三期:cvtColor函数详解
  10. 数据结构算法——1097. Hub Connection plan
  11. 利用python第三方库过抖音小店后台滑块
  12. Datawhale组队学习(Pandas) task8-文本数据
  13. 2022国产芯片技术创新与市场应用论坛即将召开
  14. 必须了解的网络运维知识
  15. SVN :找不到这样的主机
  16. 最简单的FFMPEG的视频编码器
  17. 探秘app.asar
  18. 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B coin
  19. ue4 小知识点 als advanced locomotion system v4 foot ik 坑
  20. 深度解析JavaScript原型链

热门文章

  1. 国际公认六大保健饮料(只有此六类):
  2. Oracle 11g数据库下载安装教程
  3. Python制作词云视频(使用B站视频及弹幕文本)
  4. background和background-image的区别
  5. ArcGIS应用(一)提取遥感影像各波段值
  6. Java串口并口程序编写(转)
  7. HTML中 :after和:before的作用及使用方法(转)
  8. 安卓 setBackgroundColor 无效
  9. 采用外中断控制的LED彩灯设计
  10. NTT Research与哈佛大学将联合研究“动物神经反应与AI”