洛谷P3322 SDOI2015 排序

2022-05-16 07:01:12 字數 1250 閱讀 3367

小a有乙個1-2n的排列a[1..2n],他希望將a陣列從小到大排序,小a可以執行的操作有n種,每種操作最多可以執行一次,對於所有的

i(1<=i<=n),第i中操作為將序列從左到右劃分為2段,每段恰好包括2個數,然後整體交換其中兩段.小a想知道可以將陣列a從小到

大排序的不同的操作序列有多少個,小a認為兩個操作序列不同,當且僅當操作個數不同,或者至少乙個操作不同(種類不同或者操作位置不同).

下面是乙個操作事例:

n=3,a[1..8]=[3,6,1,2,7,8,5,4].

第一次操作,執行第3種操作,交換a[1..4]和a[5..8],交換後的a[1..8]為[7,8,5,4,3,6,1,2].

第二次操作,執行第1種操作,交換a[3]和a[5],交換後的a[1..8]為[7,8,3,4,5,6,1,2].

第三次操作,執行第2中操作,交換a[1..2]和a[7..8],交換後的a[1..8]為[1,2,3,4,5,6,7,8].

第一行,乙個整數n第二行,2n個整數,a[1..2n]。

乙個整數表示答案

37 8 5 6 1 2 4 3

100%的資料, 1<=n<=12.

首先可以想到的是每次排序交換的兩個塊中一定是有序的,那麼我們從小到大討論每一種操作,如果對於第\(i\)種操作,序列每個長度為\(2^\)的塊都是有序的,那麼就看長度為\(2^i\)的塊有哪些不是單調遞增的。如果不滿足要求的塊的數量大於2,就無解。否則若數量為1,就交換那一塊的兩半;數量為2就分4部分兩兩交換。至於有序的判斷,可以用排列的性質,如果塊最右邊的值減去最左邊的值等於塊長,說明有序。

另外,對於乙個操作序列,任意交換兩個元素是沒有影響的,所以每找到乙個長為\(n\)的操作序列,都要增加\(n!\)中方案。

#include #include #define n 5000

using namespace std;

int n=1,m,i,a[n];

long long ans,f[n];

int read()

return w;

}void dfs(int x,int sum)

if(x==m+1)

dfs(x+1,sum);

int op[5],cnt=0;

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

} if(cnt>4) return;

for(int i=1;i<=cnt;i++) }}

int main()

P3322 SDOI2015 排序 暴搜

戳這裡 通過手玩樣例 我們可以發現以下幾條性質 乙個合法的操作序列,各個操作其實是互不影響的,也就是說,只要我們發現了一組合法的操作序列,那麼它的全排列是都可以的 對於一種排列,有且僅有一種合法的操作集合,因為任意一類操作是無法通過別的其他操作等價替換的 那麼我們將問題轉化成了列舉操作集合,判斷是否...

洛谷P3324 SDOI2015 星際戰爭

類似 飛彈防禦塔 因為題目保證有解,花費時間小於最終答案時一定無法消滅所有敵人,只要花費時間大於等於最終答案都可以消滅所有敵人,答案滿足單調性,考慮二分答案。二分答案後,轉化為判定性問題。當總時間固定,每件 的總傷害量就確定了。於是可以按網路流建模 把 和敵人分成兩部分,從源點s向 連邊,容量為該 ...

洛谷P3324 SDOI2015 星際戰爭 題解

因為本題的時間點較多,不能列舉,但發現有單調性,於是二分答案,二分使用的時間ttt 每個攻擊裝置造成的傷害總量已知,為t b it b i t bi 現在有了傷害總量 生命總量,如何判斷在t tt時間內,機械人是否被全部打死?源點s向所有攻擊裝置連邊,流量為t b it b i t bi 攻擊裝置向...