• CF1545A.AquaMoon and Strange Sort


    题意简述

      每组数据给定一个无序数列,数列中每个数都有一个实时的状态,初始为1。你可以对该数列进行任意次操作,每次操作可以选择数列中任意两个相邻的数进行交换。对于任意一个数,每被交换一次其状态便会被取反。询问对数列进行操作后能否使其变为单调不下降序列,并且最终每个数的状态均为1。

    算法概述

      容易发现,若答案为能,则对于任意一个数,交换前后其下标位置的奇偶性不变。

      故对于每一个数值,统计其交换前处于奇数位置的数量与处于偶数位置的数量,然后排序,并统计排序后的数量。将排序前与排序后进行比对即可。

    参考代码

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 const int N=1e5+10;
     7 
     8 int a[N];
     9 int odd[N][2],eve[N][2];
    10 int n,T;
    11 
    12 bool judge()
    13 {
    14     for(int i=1;i<=n;i++)if(odd[a[i]][0]!=odd[a[i]][1]||eve[a[i]][0]!=eve[a[i]][1])return false;
    15     return true;
    16 }
    17 
    18 int main()
    19 {
    20     scanf("%d",&T);
    21     while(T--)
    22     {
    23         scanf("%d",&n);
    24         for(int i=1;i<=n;i++)
    25         {
    26             scanf("%d",&a[i]);
    27             if(i&1)odd[a[i]][0]++;
    28             else eve[a[i]][0]++;
    29         }
    30         sort(a+1,a+n+1);
    31         for(int i=1;i<=n;i++)
    32         {
    33             if(i&1)odd[a[i]][1]++;
    34             else eve[a[i]][1]++;
    35         }
    36         if(judge())printf("YES
    ");
    37         else printf("NO
    ");
    38         for(int i=1;i<=n;i++)odd[a[i]][0]=odd[a[i]][1]=eve[a[i]][0]=eve[a[i]][1]=0;
    39     }
    40     return 0;
    41 }
    作者:玖梦
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    Outdated Kotlin Runtime
    安装 intelliJ idea 。 快速学会kotlin
    配置lambda
    kotlin 安装 使用
    android stuidio 导入项目问题。
    下载 ....aar jitpack.io 打不开。
    android studio 汉化包 美化包
    安卓架构 视频
    剑指offer-把二叉树打印成多行
    剑指offer-整数中1出现的次数(从1到n整数中1出现的次数)
  • 原文地址:https://www.cnblogs.com/ninedream/p/15001968.html
Copyright © 2020-2023  润新知