【SDOI2015第1轮第1试】排序

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;

const int N = 1 << 13;
int n , a[N];
LL ans , fac[13];

inline bool check(int len)
{
    for(register int i = 1; i <= 1 << n - len; i++)
        if (a[(i - 1) * (1 << len) + 1] + (1 << len - 1) != a[(i - 1) * (1 << len) + 1 + (1 << len-1)])
            return false;
    return true;
}

inline void sswap(int s , int t , int len)
{
    for(register int i = 0; i < len; i++)
        swap(a[s + i] , a[t + i]);
}

inline void dfs(int len , int step)
{
    if (len && !check(len)) return;
    if (len == n)
    {
        ans += fac[step];
        return;
    }
    dfs(len + 1 , step);
    int tot = 0 , c[5];
    for(register int i = 1; i <= 1 << n - len; i += 2)
    if (a[(i - 1) * (1 << len) + 1] + (1 << len) != a[i * (1 << len) + 1])
    {
        if (tot >= 4) return;
        c[++tot] = i , c[++tot] = i + 1;
    }
    if (!tot) return;
    for(register int i = 1; i <= tot; i++)
        for(register int j = i + 1; j <= tot; j++)
        {
            sswap((c[i] - 1) * (1 << len) + 1 , (c[j] - 1) * (1 << len) + 1 , 1 << len);
            dfs(len + 1 , step + 1);
            sswap((c[i] - 1) * (1 << len) + 1 , (c[j] - 1) * (1 << len) + 1 , 1 << len);
        }
}

int main()
{
    scanf("%d" , &n);
    for(register int i = 1; i <= (1 << n); i++) scanf("%d" , &a[i]);
    fac[0] = 1;
    for(register int i = 1; i <= n; i++) fac[i] = fac[i - 1] * 1LL * i;
    dfs(0 , 0);
    printf("%lld" , ans);
}

原文地址:https://www.cnblogs.com/leiyuanze/p/12337079.html

时间: 2024-10-06 00:58:43

【SDOI2015第1轮第1试】排序的相关文章

【SDOI2015第1轮第1试】寻宝游戏

#include<cstdio> #include<set> using namespace std; typedef long long LL; const int N = 1e5; int top[N + 5] , dfn[N + 5] , rev[N + 5] , fa[N + 5] , size[N + 5] , son[N + 5] , dep[N + 5]; LL dis[N + 5] , ans , now; int vis[N + 5] , h[N + 5] , n

【SDOI2015第1轮第2试】星际战争

#include<cstdio> #include<queue> using namespace std; const int M = 10000; const double inf = 1e18; int n , m , h[505] , cur[505] , dep[505] , s , t , tot = 1; double a[55] , b[55] , ans , Max; struct edge{ int to , nxt; double w; }e[M + 5] ,

时间轮算法

问题引入:游戏里面每个Player身上有很多buffs,在每一个tick(最小时间段)都要去检查buff里面的每一个buff是不是过期,产生的效果如何,造成在每个tick里面都去遍历一个长list,明显很不好. 怎么优化? 1.原始模型:    buff的状态在每一个tick里面都要更新!可以想象指针每移动一下,都会非常沉重地拖着所有的BuffList,好可怕-- 2. 优化模型1:   我们要避免的是:原始模型在每一个tick里面都要遍历List,那么我们试下以Times为key,在加入buf

Java中常见的排序算法

这是我摘取的一段英文资料,我觉得学习算法之前,对各种排序得有个大致的了解: Sorting algorithms are an important part of managing data. At Cprogramming.com, we offer tutorials for understanding the most important and common sorting techniques. Each algorithm has particular strengths and w

选择排序、插入排序、冒泡排序python实现

选择排序的时间复杂度为O(n^2),是不稳定的排序 冒泡排序的时间复杂度最好情况下为O(n),最坏情况下为O(n^2),平均情况下为O(n^2),是稳定的排序 插入排序的时间复杂度最好情况下为O(n),最坏情况下为O(n^2),,平均情况下为O(n^2),是稳定的排序 1.选择排序 def selection(lista): leng=len(lista); for i in range(0,leng): index=i; min=lista[i]; for j in range(i,leng)

python 下的数据结构与算法---6:6大排序算法

一:冒泡排序(Bubble Sort) 原理:假设有n个数,第一轮时:从第一个元素开始,与相邻的元素比较,如果前面的元素小就交换,直到第n-1个元素时,这样的结果是将最大的元素放到了最后,同理,第二轮还是从第一个元素开始比较,直到第n-2个元素,这样能够把剩下的n-1个数中的最大的数放到第n-1的位置,一直这样进行n-1轮就能够完成排序. 1 def Bublesort(seq): 2 i = 0 3 j = 0 4 while i < len(seq): 5 while j < len(se

达观数据搜索引擎排序实践

前言 随着互联网的深入发展,人类已然进入大数据时代.如何在浩瀚的数据海洋里高速有效的获取有价值的信息,正是促使大数据技术具备走向众多企业的潜力.搜索引擎作为获取信息的有效入口,已然经历了20多年的发展,并一直试图理解用户搜索意图以及提升搜索的精准性. Google是全球性的搜索引擎,看似简单的搜索框背后隐藏的是极其复杂的系统架构和搜索算法,其中排序(以下统称Ranking)的架构和算法更是关键部分.Google正是通过PageRank算法深刻改变搜索排序而一举击败众多竞争对手. Ranking是

排序算法--基数排序

#define _CRT_SECURE_NO_WARNINGS #include<math.h> #include <stdio.h> #include <stdlib.h> int findMaxNum(int *p, int n); void sort2(int *p, int n, int loop); void bucketSort3(int *p, int n); int getLoopTimes(int num); /* 基数排序原理: 求出数组中最大值 求

数据结构 排序(冒泡排序升级版)

//排序--冒泡排序法升级版 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> /* 冒泡排序: 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的数列,一次比较相邻的两个元素,如果他们的顺序错误就把他们交换过来. 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. */ //冒泡法排序 v