国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

BZOJ 3990 [SDOI2015] 排序

2019-11-08 03:07:02
字體:
來源:轉載
供稿:網友

Description

 小A有一個1-2^N的排列A[1..2^N],他希望將A數組從小到大排序,小A可以執行的操作有N種,每種操作最多可以執行一次,對于所有的i(1<=i<=N),第i中操作為將序列從左到右劃分為2^{N-i+1}段,每段恰好包括2^{i-1}個數,然后整體交換其中兩段.小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].

Input

第一行,一個整數N

第二行,2^N個整數,A[1..2^N]

Output

一個整數表示答案

Sample Input

37 8 5 6 1 2 4 3

Sample Output

6

HINT

100%的數據, 1<=N<=12.

Source

Round 1 感謝ZKY制作非官方數據

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

dfs+神奇的思路~

orzPoPoQQQ,orz黃學長……

思路詳見黃學長的博客:http://hzwer.com/6839.html~

#include<cstdio>#include<iostream>using namespace std;int n,a[5005],fac[13],bin[20];long long ans;bool che(int u,int v){	for(int i=1;i<v;i++) if(a[i+u]!=a[i+u-1]+1) return 0;	return 1;}void swapp(int u,int v,int k){	for(int i=0;i<bin[k];i++) swap(a[u+i],a[v+i]);}void dfs(int u,int v){	if(u==n+1)	{		ans+=fac[v];return;	}	int k1=0,k2=0;	for(int i=1;i<=bin[n];i+=bin[u])	  if(!che(i,bin[u]))	  {	  	if(!k1) k1=i;	  	else if(!k2) k2=i;	  	else return;	  }	if(!k1 && !k2) dfs(u+1,v);	else if(!k2)	{		swapp(k1,k1+bin[u-1],u-1);dfs(u+1,v+1);swapp(k1,k1+bin[u-1],u-1);	}	else	{		for(int x=0;x<=1;x++)		  for(int y=0;y<=1;y++)		  {		  	swapp(k1+x*bin[u-1],k2+y*bin[u-1],u-1);		  	if(che(k1,bin[u]) && che(k2,bin[u]))		  	{		  		dfs(u+1,v+1);		  		swapp(k1+x*bin[u-1],k2+y*bin[u-1],u-1);		  		break;			}			swapp(k1+x*bin[u-1],k2+y*bin[u-1],u-1);		  }	}}int main(){	fac[0]=bin[0]=1;	for(int i=1;i<20;i++) bin[i]=bin[i-1]<<1;	for(int i=1;i<=12;i++) fac[i]=fac[i-1]*i;	scanf("%d",&n);	for(int i=1;i<=bin[n];i++) scanf("%d",&a[i]);	dfs(1,0);	PRintf("%lld/n",ans);	return 0;}


上一篇:數據結構-堆

下一篇:輸出模擬

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桓仁| 西贡区| 固原市| 宝鸡市| 高要市| 乐清市| 呼玛县| 夏津县| 阿合奇县| 石棉县| 镇雄县| 富裕县| 蒙自县| 灵石县| 招远市| 景谷| 同江市| 龙山县| 望谟县| 玉田县| 青海省| 宁武县| 九江县| 武安市| 吉首市| 女性| 嘉黎县| 遂昌县| 温泉县| 兰考县| 车险| 昌图县| 梁平县| 城口县| 东莞市| 忻城县| 正安县| 调兵山市| 漳平市| 巴里| 库伦旗|