Swaps Again【CF 1365 F】【思維+貪心】

題目鏈接


  題意:有長度爲N的2個數組a、b,我們可以對a數組進行無數次操作,問a數組最後可不可以等於b數組?對a數組的操作是,我們可以選擇前K個和後K個交換位置,要求是k \leq \left \lfloor \frac{N}{2} \right \rfloor

  思路:因爲是前K個和後K個的交換位置,我們想先從對稱軸開始向兩邊做“是否滿足a數組等於b數組”的這樣的一個操作,也就是貪心的先滿足中間的,然後用剩下的去滿足邊上的,但是這樣的條件是否成立?我們首先假設i + 1 \rightarrow N - (i + 1) + 1的這個區間是已經排好了的。那麼,我們現在要確定的是第i和第N - i + 1這兩個的滿足情況。

  前K的挪動,會使得第i個是繼承後K的最後一個的,所以我們需要找到滿足條件的第x位,讓他移動到第N位的位置。但是這時候其實對應的會改變第N - i  + 1的值,所以我們會發現,移動一個x位的數的時候,將它放到第i位,那麼能確定第N - i + 1位的一定是N + 1 - x位的數。所以我們可以利用這則貪心展開,並且滿足最貪心的時候從內向外的走,來判斷合法。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define Big_INF 0x3f3f3f3f3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 505;
int N, a[maxN], b[maxN];
int main()
{
    int T; scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &N);
        for(int i=1; i<=N; i++) scanf("%d", &a[i]);
        for(int i=1; i<=N; i++) scanf("%d", &b[i]);
        if(N & 1)
        {
            if(a[(N + 1) / 2] ^ b[(N + 1) / 2]) { printf("No\n"); continue; }
        }
        bool ok = true;
        for(int i=N >> 1; i>=1; i--)
        {
            if(a[i] == b[i] && a[N - i + 1] == b[N - i + 1]) continue;
            bool flag = false;
            for(int j=i; j>=1; j--)
            {
                if((a[j] == b[i] && a[N + 1 - j] == b[N - i + 1]) || (a[j] == b[N - i + 1] && a[N + 1 - j] == b[i]))
                {
                    flag = true;
                    swap(a[i], a[j]);
                    swap(a[N + 1 - i], a[N + 1 - j]);
                    break;
                }
            }
            if(!flag) { ok = false; break; }
        }
        printf(ok ? "Yes\n" : "No\n");
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章