【bzoj 4975】區間翻轉(博弈論)

傳送門biu~
考慮序列中順序對的個數。
① 對於終止態,順序對一定爲0(偶數),此時先手必敗。
② 對於翻轉的區間[l,r],可以視作將[l,r]內的順序對數和逆序對數調換。
③ 因爲區間長度爲4x+2或4x+3,帶入可知區間內的數對數(即順序對數+逆序對數)爲奇數。
綜上可知,令當前序列順序對數的奇偶性作爲當前狀態,那麼對於一個奇狀態,必定會轉移到一個偶狀態;反之,對於一個偶狀態,必定會轉移到一個奇狀態。
所以奇狀態爲必勝態,偶狀態爲必敗態。問題即轉化爲求序列順序對數。

#include<bits/stdc++.h>
using namespace std;
int n,a[55],ans;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
        for(int j=1;j<i;++j)
            if(a[j]<a[i])    ans^=1;
    }   
    puts(ans?"Q":"T");
    return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章