首页 > 其他分享 >[Codeforces] CF1545A AquaMoon and Strange Sort

[Codeforces] CF1545A AquaMoon and Strange Sort

时间:2023-12-30 20:27:31浏览次数:28  
标签:Sort 朝右 int Strange Maxn CF1545A AquaMoon

CF1545A AquaMoon and Strange Sort

题目传送门

题意

有 \(n\) 个人从左到右站成一排,从左数第 \(i\) 个人的衣服上印着 \(a_i\)。每个人的朝向可以是朝左、朝右。一开始所有人的方向都是朝右。

您可以对这些人做一些“操作”,每次操作允许您找两个相邻的人让他们交换顺序,但是在操作之后,两人都会掉头,也就是朝向都从朝右变成朝左或者相反。

现求是否存在一种操作方法使得操作完成后这 \(n\) 个人衣服上的数字 \(a_1, a_2, \ldots , a_n\) 从左往右读单调不减,并且最后所有人的方向都朝右。

思路

联想一下,会发现这题很像一个冒泡排序,每个数都有一个目标位置,需要通过交换相邻的数来到达

那么特征也就出来了,为了使他的方向不变,所以他的位置之差一定是偶数,换句话说,就是在新序列和旧序列中,同一个数的位置奇偶性一致

这道题的一个难点在于如何判断相同的数,这里参考一下题解思路,用\(f_i\)表示旧序列中数字\(i\)位于偶数位置的个数,\(g_i\)表示位于奇数位置的个数。

而在新的序列里,也存在这样一组\(f\)和\(g\),现在且叫他们\(f'\)和\(g'\)

那么,条件就变为了\(f_i=f'_i\)且\(g_i=g'_i\)

据此写出代码即可

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int Maxn=1e5+10;
int a[Maxn];
int f[Maxn],g[Maxn];
int flag,n;
void run()
{
    cin>>n;flag=1;
    memset(f,0,sizeof(f));
    memset(g,0,sizeof(g));
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        f[a[i]]+=(i%2==0);
        g[a[i]]+=(i%2==1);
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++) f[a[i]]-=(i%2==0),g[a[i]]-=(i%2==1);
    for(int i=1;i<=n && flag;i++) if(f[a[i]] || g[a[i]]) flag=0;
    cout<<(flag?"Yes":"No")<<endl;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int t;
    cin>>t;
    while(t--) run();
    system("echo. & pause");
    return 0;
}

标签:Sort,朝右,int,Strange,Maxn,CF1545A,AquaMoon
From: https://www.cnblogs.com/lyk2010/p/17936731

相关文章

  • 拓扑排序(TopologicalSort)
    什么是拓扑排序?对一个有向无环图(DirectedAcyclicGraph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(TopologicalOrder)的序列,简称拓扑序列。简单的说,由某......
  • Floyd判联通(传递闭包) & poj1049 sorting it all out
    Floyd判联通(传递闭包)Floyd传递闭包顾名思义就是把判最短路的代码替换成了判是否连通的代码,它可以用来判断图中两点是否连通。板子大概是这个样的:for(intk=1;k<=n;k++){ for(inti=1;i<=n;i++){ for(intj=1;j<=n;j++){ //把数值计算替换成逻辑运算——就一行,非......
  • 详解十大经典排序算法(六):快速排序(QuickSort)
    算法原理分区(Partition):选择一个基准元素,将数组分为两个子数组,小于基准的放在左边,大于基2准的放在右边。递归排序:对左右两个子数组分别进行快速排序。合并:不需要实际的合并操作,因为在分解和递归排序阶段已经完成了排序。算法描述快速排序是一种基于分治思想的高效排序算法,由英国......
  • 详解十大经典排序算法(五):归并排序(Merge Sort)
    算法原理归并排序的核心思想是将一个大的数组分割成多个小的子数组,然后分别对这些子数组进行排序,最后将排序后的子数组合并起来,得到一个有序的大数组。算法描述归并排序(MergeSort)是一种经典的排序算法,其原理基于分治(DivideandConquer)策略。它的核心思想是将一个大问题分割成多个......
  • 详解十大经典排序算法(四):希尔排序(Shell Sort)
    算法原理希尔排序是一种基于插入排序的排序算法,也被称为缩小增量排序。它通过将待排序的序列分割成若干个子序列,对每个子序列进行插入排序,然后逐步缩小增量,最终使整个序列有序。算法描述希尔排序(ShellSort)是一种基于插入排序的算法,由DonaldShell于1959年提出。它是插入排序的一种......
  • [AGC054C] Roughly Sorted 题解
    题意定义一种操作为交换\(a_{i}\)和\(a_{i-1}\)。对于一个长度为\(n\)的排列,你需要操作若干次,使这个序列变合法,一个序列合法指:满足对于每一个\(1\lei\len\),都满足包含\(a_i\)的逆序对的个数不超过\(k\),并且要求最小化操作次数。现在给定一个操作后的序列,询问原序列可......
  • 无涯教程-Java - SortedSet 集合接口函数
    SortedSet接口扩展了Set并声明了按升序排序的集合的行为。除了Set定义的那些方法外,SortedSet接口还声明了下表中概述的方法-如果尝试使用null对象并且集合中不允许使用null,则抛出NullPointerException。Sr.No.Method&Remark1Comparatorcomparator()返回调用排序集的比......
  • Using filesort
    MySQL支持两种方式的排序filesort和index,Usingindex是指MySQL扫描索引本身完成排序如果orderby的条件不在索引列上,就会产生UsingfilesortUsingfilesort表示在索引之外,需要额外进行外部的排序动作。当MySQL无法使用索引完成排序时,它会将结果集保存到临时文件中,然后再进行......
  • Matlab 用sort函数排序 二维数组
    在Matlab中排序某个向量(一维)时,可以使用sort(A),其中A为待排序的向量,如果仅是用来排序A,那么直接使用sort(A)即可,如果排序后还需要保留原来的索引可以用返回值,即[B,ind]=sort(A),计算后,B是A排序后的向量,A保持不变,ind是B中每一项对应于A中项的索引。排序是按升序进行的。 由于在sort函......
  • Sortable 拖拽排序组件实现原理
    如果想要实现拖拽排序功能,有很多现成的库可以供使用,比如Sortable.js(vuedraggable)、dnd-kit(react-dnd)等可以轻松帮助实现这一功能。本文的目标不是介绍如何使用这些库,而是手动实现一个简单版的Sortable组件。通过本文的阅读,您将深入了解拖拽排序的核心原理。使用模板使用Sor......