ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1592B Hemose Shopping 题解

2021-11-13 13:00:49  阅读:157  来源: 互联网

标签:ch int 题解 texttt 交换 while CF1592B le Hemose


luogu传送门

题意简述:

\(t\) 组数据。

每组数据给定一个数 \(x\) 以及一个长度为 \(n\) 的数列 \(a_1,a_2,…,a_n\)

当 \(|j-i|>=x(1\le i,j\le n)\) 时,你可以交换 \(a_i,a_j\)。

问你能否将这个序列变为从小到大的。

\(\texttt{SOLUTION}\)

当 \(2\times x\le n\) 时,答案一定是 YES

因为我们可以通过 \(a_1,a_n\) 当中转或直接交换排列中的任意两个数字。

我来举个例子:

如果 \(n=6,x=3\)

\(a={1\ 6\ 3\ 5\ 2\ 4}\)

  • 目标:交换 \(3\ 2\)
  • 操作:
    • 交换 \(3\ 4\)
    • 交换 \(2\ 1\)
    • 交换 \(2\ 3\)
    • 交换 \(2\ 4\)
    • 交换 \(3\ 1\)
  • 目标:交换 \(6\ 4\)
  • 操作:
    • 交换 \(6\ 4\)

当 \(2\times x\geq n\) 时,我们只能通过上述相同方法任意交换 \(a_1,a_2,…,a_{n-x}\) 和 \(a_{x+1},a_{n-x+2},…,a_n\)。

而 \(a_{n-x+1},a_{n-x+1},…,a_{x}\) 无法移动。

设将 \(a\) 从小到大排序后为 \(s\)。

所以如果答案为 YES, \(a_{n-x+1},a_{n-x+1},…,a_{x}\) 一定与 \(s_{n-x+1},s_{n-x+1},…,s_{x}\)相同。

否则答案就为 NO

\(\texttt{AC CODE}\)

#include<bits/stdc++.h>
using namespace std;
const int MAX=100010;
int read()
{
	int x=0; char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x;
}
int n,x,a[MAX],s[MAX];
bool check(int l,int r)
{
	for(int i=1;i<=n;i++) s[i]=a[i];
	sort(s+1,s+n+1);
	for(int i=l;i<=r;i++) if(a[i]!=s[i]) return 0;
	return 1;
}
int main()
{
	int t=read();
	while(t--)
	{
		n=read(),x=read();
		for(int i=1;i<=n;i++) a[i]=read();
		if(2*x<=n) puts("YES");
		else puts(check(n-x+1,x)?"YES":"NO");
	}
	return 0;
}

标签:ch,int,题解,texttt,交换,while,CF1592B,le,Hemose
来源: https://www.cnblogs.com/wrl-Marssrayd-2007/p/15547859.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有