1. 程式人生 > 其它 >CF1545A.AquaMoon and Strange Sort

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\n"); 37 else printf("NO\n"); 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 }
作者:玖夢 出處:http://www.cnblogs.com/ninedream/ 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連結,否則保留追究法律責任的權利。