`
Simone_chou
  • 浏览: 192714 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

Permutation(线段树 + 单点更新)

    博客分类:
  • UVA
 
阅读更多

Problem F
Permutation
Input: Standard Input

Output: Standard Output

 

Given N and K find the N’th permutation of the integers from 1 to K when those permutations are lexicographically ordered.  N starts from 0. Since N is very large N will be represented by a sequence of K non-negative integers S1, S2 ,…, Sk. From this sequence of integers N can be calculated with the following expression.

 

 

Input

First line of the input contains T(≤10) the number of test cases. Each of these test cases consists of 2 lines. First line contains a integer K(1≤K≤50000). Next line contains K integers S1, S2 ,…, Sk.(0≤Si≤K-i).

 

Output

For each test case output contains N’th permutation of the integers from 1 to K. These K integers should be separated by a single space.

 

Sample Input                            Output for Sample Input

4
3
2 1 0
3
1 0 0
4
2 1 1 0
4
1 2 1 0

 

3 2 1
2 1 3
3 2 4 1
2 4 3 1

 


Problemsetter: Abdullah al Mahmud

Special Thanks: Manzurur Rahman Khan

 

       题意:

       给出 T(1 ~ 10),代表有 T 个 case,每个 case 给出一个 N (1 ~ 50000),给出 N 个数,后给出式子 M = ,输出第 M 个 1 ~ K 的序列是什么。

 

       思路:

       线段树 + 单点更新。观察式子,反过来看,比如求K = 4 中的排列 3 2 4 1 是属于第几个排列,那么就是等于

       2 X 3!+ 1 X 2! + 1 X 1! + 0 X 1!,得出来的式子刚好与给出的式子 M 吻合,说明 Si 是寻找序列的第 Si 个数。得出来之后用线段树维护即可。

 

       AC:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAX = 50005;

int sum[MAX * 3];
int num[MAX];

void push_up (int node) {
        sum[node] = sum[node << 1] + sum[node << 1 | 1];
}

void build (int node, int l, int r) {
        if (l == r) {
                sum[node] = 1;
        } else {
                int mid = (r + l) >> 1;
                build(node << 1, l, mid);
                build(node << 1 | 1, mid + 1, r);
                push_up(node);
        }
}

void updata (int node, int l, int r, int i) {
        if (l == r) {
                if (l == i) sum[node] = 0;
                return;
        }

        int mid = (r + l) >> 1;
        if (i <= mid) updata(node << 1, l, mid, i);
        else updata(node << 1 | 1, mid + 1, r, i);
        push_up(node);
}

int query (int node, int l, int r, int k) {
        if (l == r) return l;

        int mid = (r + l) >> 1;
        if (k < sum[node << 1]) return query(node << 1, l, mid, k);
        return query(node << 1 | 1, mid + 1, r, k - sum[node << 1]);
}

int main() {
        int t;
        scanf("%d", &t);

        while (t--) {
                int n;
                scanf("%d", &n);
                build(1, 1, n);

                for (int i = 0; i < n; ++i) {
                        scanf("%d", &num[i]);
                }

                for (int i = 0; i < n; ++i) {
                        int in = query(1, 1, n, num[i]);
                        printf("%d", in);
                        updata(1, 1, n, in);
                        i == n - 1 ? printf("\n") : printf(" ");
                }
        }

        return 0;
}

 

 

 

分享到:
评论

相关推荐

    haokan的线段树资料

    在题目"111071:Permutation Representation"中,线段树被用来解决一个与置换群有关的问题,需要将一个给定的置换表示成特定形式。问题要求在不超过200000的范围内,将置换群的每个元素移动到其应有的位置,并记录...

    permutation_test_PLV_permutationtest_

    由于Permutation test检验计算量大而限制了其应用和推广,以致不为人熟知。现在由于计算机技术飞速发展,Permutation test又重新进入我们的视野。Permutation test有独特的优势,其对原始数据分布没有要求,特别适用...

    Column permutation cipher密码学经典密码之一

    在Column permutation cipher中,加密过程通常涉及以下步骤: 1. **排列**: 首先,将明文按照一定的模式(例如,固定列数)排列成矩阵形式。比如,若选择4列,那么每4个字符组成一列。 2. **置换**: 接着,对这些...

    permutation

    C语言程序关于排列1~9abc,def和ghi,每个使用一个,abc:def:ghi=1:2:3.

    STL、线段树代码库.docx

    在给定的文档中,提到了几个关键的STL知识点: 1. **next_permutation**:这是一个用于生成全排列的算法,它接受两个迭代器作为参数,分别表示序列的起始和结束位置。该函数要求输入序列必须是升序排列的,它会生成...

    Permutation with Repetition

    #### 知识点概述 在计算机科学中,排列问题是一个经典问题,尤其是在组合数学和算法设计中占有重要的地位。排列指的是从一组对象中选取一部分或全部对象,并按照一定的顺序进行排列的方式。当这些对象中有重复出现...

    slmap_ccdf.rar_ccdf_matlab permutation_permutation

    combination & permutation

    Permutation test and Bootstrap methods

    本篇文章将详细介绍置换检验(Permutation Test)和Bootstrap方法的原理及其应用,并与传统的t检验进行对比。这两种方法在非参数统计领域具有重要的地位,尤其适用于数据不符合正态分布的情况,或者当研究者感兴趣的...

    PyPI 官网下载 | permutation_test-0.1.tar.gz

    通常,这样的库会包含各种函数,如单样本、双样本或多重样本的置换检验,以及可能的自定义设置,如迭代次数(也称为置换次数)和显著性水平。 使用这个库的步骤可能包括: 1. **安装**:首先,用户可以通过Python的...

    hutc-Permutation with Repetition参考代码

    ### hutc-Permutation with Repetition参考代码 #### 知识点概述 本文将详细介绍一个C++程序,该程序用于生成给定字符数组的所有排列(允许重复元素),并统计这些排列的数量。此代码适用于理解如何通过递归方法...

    permutation.docx

    给定标题“permutation.docx”和描述,我们将探讨如何使用R语言编程实现自动生成n个不同元素中取r个元素的所有排列。 `Permutation`函数是一个递归函数,它接受两个参数:n(元素总数)和r(要选择的元素数量)。...

    permutation entropy.rar_permutation_permutation entropy_permutat

    排列熵(Permutation Entropy)是一种衡量时间序列复杂性的统计方法,由Claude Marcus和Stefan Klus在2002年提出。它通过分析序列中子序列的相对顺序来评估序列的混沌程度和复杂性,对于非线性系统的分析具有较高的...

    输出一个集合a1,a2,a3,••••••an的所有排列

    在Permutation类中,构造方法`Permutation(int[] a)`用于初始化数组a,并将其赋值给类变量a。 判断是否重复 `isOk(int b, int e)`方法用于判断数组a中是否存在重复元素,从b到e之间的元素。如果存在重复元素,返回...

    Python库 | PermutationImportance-1.2.0.1.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:PermutationImportance-1.2.0.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    信息安全密码学中关键词加解密、Permutation cipher加解密、RSA加解密等

    在Permutation Cipher中,字母表被重新排列,每个字母被替换为字母表中固定位置后的另一个字母。这种方法相对简单,但安全性较低,容易被破解。 RSA算法是现代密码学的基石,由Rivest、Shamir和Adleman三位科学家于...

    Python库 | PermutationImportance-1.2.1.5.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:PermutationImportance-1.2.1.5.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    个人训练实用知识库分享知识分享

    在2020“远光杯”网络资格赛L捕鱼达人中,我们学习了树状数组/区间最大值/单点更新的应用。树状数组是一种数据结构,用于解决树形相关的问题。通过在树状数组中进行更新和查询,我们可以解决树形问题。 六、并查集 ...

    31.Next Permutation 下一个排列【LeetCode单题讲解系列】

    31.Next_Permutation_下一个排列【LeetCode单题讲解系列】

    Permutation with Repetition参考代码

    ### Permutation with Repetition 参考代码解析 #### 一、问题背景 在组合数学中,排列(Permutation)是指从给定的不同元素中取出若干个元素,按照一定的顺序排成一列的方式。当元素可以重复时,这种排列称为有...

Global site tag (gtag.js) - Google Analytics