小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
)[l,r](1\le l\le r\le n)
[l,r](
1≤l≤
r≤n)
,其中x
xx是該玩家自行選擇的非負整數,然後將al,
al+1
,...
,ar−
1,ar
a_l,a_,...,a_,a_r
al,al
+1,
...,
ar−1
,ar
翻轉,例如1,3
,2,5
,4
1,3 ,2, 5, 4
1,3,2,
5,4 翻轉會得到4,5
,2,3
,1
4 ,5, 2, 3, 1
4,5,2,
3,1。
為了防止遊戲無限進行下去,他們規定每次操作之後得到的新序列的字典序必須比操作前的序列大。最先不能採取任何行動的玩家將會輸掉這局遊戲。假設小q和tangjz都會採取最優策略行動,請寫乙個程式判斷誰會獲得這局遊戲的勝利。
這道題的解法真的很神奇。
首先我們要積累乙個區間翻轉問題的套路,即優先考慮數對關係:
再考慮這道題目的特殊性,即4x+
24x+2
4x+2
和4 x+
34x+3
4x+3
的意義,我們發現兩者的數對總數分別是(2x
+1)(
4x+1
)(2x+1)(4x+1)
(2x+1)
(4x+
1)和( 2x
+1)(
4x+3
)(2x+1)(4x+3)
(2x+1)
(4x+
3)。那麼我們就會發現:
考慮終止狀態,我們發現是乙個依次遞減的數列,此時這個數列的順序對數=0=0
=0.這意味著,只要順序對的數量都是偶數,你的博弈就可以繼續進行。
那麼我們考慮模擬這個博弈過程:
#include
using
namespace std;
const
int n =
10000
;int n, res;
int a[n]
;int
read
(void
)int
main
(void
)
bzoj 4975 區間翻轉(博弈)
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先手。每次行...
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...
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...