zoukankan      html  css  js  c++  java
  • 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 }
    作者:玖梦
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    [置顶] 寻找数组中的值
    详解 Java 的八大基本类型,写得非常好!
    从入门到放弃的 Java 架构师面试题!
    通往大牛之路,百度Java面试题前200页!
    HTML与CSS简单页面效果实例
    JS面向对象
    JS瀑布流效果
    CSS常用操作-图片
    CSS常用操作-导航栏
    CSS常用操作-对齐
  • 原文地址:https://www.cnblogs.com/ninedream/p/15001968.html
Copyright © 2011-2022 走看看