bzoj 4975 區間翻轉(博弈)

2021-08-08 11:06:34 字數 1013 閱讀 4958

time limit: 1 sec  

memory limit: 256 mb

submit: 176  

solved: 81 [

submit][

status][

discuss]

小q和tangjz正在乙個長度為n的序列a_1,a_2,...,a_n上玩乙個有趣的關於區間翻轉的遊戲。小q和tangjz輪流行動,小q先手。每次行動方玩家需要選擇乙個長度為4x+2或4x+3的區間[l,r](1<=l<=r<=n),其中x是該玩家自行選擇的非負整數,然後將a_l,a_,...,a_,a_r翻轉,例如1 3 2 5 4翻轉會得到4 5 2 3 1。為了防止遊戲無

限進行下去,他們規定每次操作之後得到的新序列的字典序必須比操作前的序列大。最先不能採取任何行動的玩家將會輸掉這局遊戲。假設小q和tangjz都會採取最優策略行動,請寫乙個程式判斷誰會獲得這局遊戲的勝利。

第一行包含乙個正整數n(1<=n<=50),表示序列的長度。

第二行包含n個互不相同的正整數a_1,a_2,...,a_n(1<=a_i<=n),分別表示序列中的每個元素。

輸出一行乙個字元,若小q勝利,輸出"q";若tangjz勝利,輸出"t"(不含引號)。 4

4 2 1 3t

①每次翻轉區間,區間中的逆序對數和順序對數會互換

②因為翻轉區間長度只能是4x+3, 4x+2,所以區間中的順序對數+逆序對數一定為奇數

③最終必輸態是當前序列順序對數為0

由上可得:如果一開始順序對數為偶數,那麼先手必敗,否則先手必勝

#includeint a[55];

int main(void)

{ int n, i, j, ans;

scanf("%d", &n);

for(i=1;i<=n;i++)

scanf("%d", &a[i]);

ans = 0;

for(i=1;i<=n-1;i++)

{ for(j=i+1;j<=n;j++)

{ if(a[i]

bzoj 4975 區間翻轉

小q和tangjz正在乙個長度為n的序列a 1,a 2,a n上玩乙個有趣的關於區間翻轉的遊戲。小q和tangjz輪流行動,小q先手。每次行動方玩家需要選擇乙個長度為4x 2或4x 3的區間l,r,其中x是該玩家自行選擇的非負整數,然後將a l,a a a r翻轉,例如1 3 2 5 4翻轉會得到4...

博弈 逆序對 BZOJ4975 區間翻轉

小q和tangjz正在乙個長度為n的序列 a1,a2,a na 1,a 2,a n a1 a2 an 上玩乙個有趣的關於區間翻轉的遊戲。小q和tangjz輪流行動,小q先手。每次行動方玩家需要選擇乙個長度為 4x 24x 2 4x 2 或 4x 3 4x 3 4x 3 的區間 l,r 1 l r n...

4975 區間翻轉

小q和tangjz正在乙個長度為n的序列a 1,a 2,a n上玩乙個有趣的關於區間翻轉的遊戲。小q和tangjz輪流行動 小q先手。每次行動方玩家需要選擇乙個長度為4x 2或4x 3的區間 l,r 1 l r n 其中x是該玩家自行選擇 的非負整數,然後將a l,a a a r翻轉,例如1 3 2...