BZOJ4975: [Lydsy1708月賽]區間翻轉( 博弈&逆序對)
阿新 • • 發佈:2018-11-17
4975: [Lydsy1708月賽]區間翻轉
Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 265 Solved: 140
[Submit][Status][Discuss]
Description
小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_{l+1},...,a_{r-1},a_r翻轉,例如1 3 2 5 4翻轉會得到4 5 2 3 1。為了防止遊戲無 限進行下去,他們規定每次操作之後得到的新序列的字典序必須比操作前的序列大。最先不能採取任何行動的玩家 將會輸掉這局遊戲。假設小Q和tangjz都會採取最優策略行動,請寫一個程式判斷誰會獲得這局遊戲的勝利。Input
Output
輸出一行一個字元,若小Q勝利,輸出"Q";若tangjz勝利,輸出"T"(不含引號)。Sample Input
44 2 1 3
Sample Output
T
思路:給出4x+2,4x+3,是因為這兩個長度裡的逆序對+順序對=(L-1)*L/2=奇數。由於最後這個序列會變為有大到小,即順序對為0,而且每次翻轉滿足這個區間的順序對奇偶性改變,所以如果最開始順序對為奇數,先手勝。
#include<bits/stdc++.h> using namespace std; int a[100],cnt,N; int main() { scanf("%d",&N); for(int i=1;i<=N;i++) scanf("%d",&a[i]); for(int i=1;i<=N;i++) for(int j=i+1;j<=N;j++) if(a[j]>a[i]) cnt++; if(cnt&1) puts("Q"); else puts("T"); return 0; }