【BZOJ3990】【SDOI2015】排序
来源:互联网 发布:mac怎么关闭桌面 编辑:程序博客网 时间:2024/05/21 17:48
Description
小A有一个
下面是一个操作事例:
第一次操作,执行第
第二次操作,执行第
第三次操作,执行第
Input
第一行,一个整数
第二行,
Output
一个整数表示答案。
Sample Input
37 8 5 6 1 2 4 3
Sample Output
6
HINT
题解
这道题的想法真的很妙。
首先你需要发现一个神奇的性质,就是对于每一种可能的方案,每一种操作的顺序并不影响操作结果,影响操作结果的仅为选择操作种类的集合。所以对于每一种可行的操作集合
搜索的时候按照操作种类从小到大的顺序,因为只有这样才能在搜索比较大的区间时,小的区间已经有序。
假设当前搜索的操作种类为
My Code
#include <iostream>#include <cstring>#include <cmath>#include <algorithm>#include <cstdio>using namespace std;typedef long long ll;ll fac[15], ans;int n, N;int a[10005];int check(int pos, int k){ for(int i = 0; i < (1 << k); i ++){ if(a[pos + i] != a[pos] + i) return 0; } return 1;}void swp(int posx, int posy, int k){ for(int i = 0; i < (1 << k); i ++){ swap(a[posx + i], a[posy + i]); }}void dfs(int t, int cur){ if(t == n){ ans += fac[cur]; return; } int m = 1 << t; int m2 = m + m; int t1 = -1, t2 = -1; for(int i = 0; i < N; i += m2){ if(!check(i, t + 1)){ if(t1 == -1) t1 = i; else if(t2 == -1) t2 = i; else return; } } if(t1 == -1 && t2 == -1) dfs(t + 1, cur); else if(t2 == -1){ swp(t1, t1 + m, t); dfs(t + 1, cur + 1); swp(t1, t1 + m, t); }else{ for(int i = 0; i <= 1; i ++){ for(int j = 0; j <= 1; j ++){ swp(t1 + i * m, t2 + j * m, t); if(check(t1, t + 1) && check(t2, t + 1)){ dfs(t + 1, cur + 1); swp(t1 + i * m, t2 + j * m, t); break; } swp(t1 + i * m, t2 + j * m, t); } } }}int main(){ scanf("%d", &n); N = 1 << n; for(int i = 0; i < N; i ++){ scanf("%d", &a[i]); } fac[0] = 1; for(int i = 1; i <= n; i ++){ fac[i] = fac[i - 1] * ll(i); } dfs(0, 0); printf("%lld\n", ans); return 0;} /*33 6 1 2 7 8 5 46*/
- 【SDOI2015】【BZOJ3990】排序
- 【bzoj3990】[SDOI2015]排序 DFS
- 【bzoj3990】【SDOI2015】【排序】【dfs】
- bzoj3990【SDOI2015】排序
- 【SDOI2015】bzoj3990 排序
- bzoj3990 [SDOI2015]排序 dfs
- bzoj3990: [SDOI2015]排序
- 【BZOJ3990】【SDOI2015】排序
- [bzoj3990][SDOI2015]排序 搜索
- 【BZOJ3990】【SDOI2015】排序
- 【bzoj3990】 SDOI2015排序 dfs搜索+剪枝
- 【BZOJ3990】排序(SDOI2015)-DFS+贪心
- 【BZOJ 3990】 [SDOI2015]排序
- BZOJ 3990: [SDOI2015]排序
- 【BZOJ 3990】 [SDOI2015]排序
- 3990: [SDOI2015]排序
- BZOJ 3990 [SDOI2015] 排序
- BZOJ 3990 Sdoi2015 排序 DFS
- 一分钟掌握数据库垂直拆分
- 获取位置
- 测试策略
- Ubuntu开机自动禁用无线网络的方法
- BZOJ 2286 [Sdoi2011]消耗战 虚树
- 【BZOJ3990】【SDOI2015】排序
- 安装
- SQL like 模糊查询
- 监听器的配置,绑定HttpSessionListener监听器的使用
- bash中的历史命令
- css权重
- CentOS MySQL配置
- 在单链表中删除倒数第K个节点 Python 版
- CF-QAQ