fzu 2184 逆序数还原

传送门

Description

有一段时间Eric对逆序数充满了兴趣,于是他开始求解许多数列的逆序数(对于由1...n构成的一种排列数组a,逆序数即为满足i<j,ai>aj的数字对数),但是某天他发现自己遗失了原来的数列,只留下之前计算过程中留下的各个数字对应的逆序数,现在请你帮他还原出原序列。

Input

数据有多组,请处理到文件结尾。

每组数据第一行为一个整数N(1<=N<=1000),表示该序列的数字个数。

第二行为N个整数,第i个数字表示排在ai之后比ai小的数字个数。

Output

输出为一行N个整数,表示原数列。

Sample Input

5 2 0 1 0 0

Sample Output

3 1 4 2 5

思路

其实是有规律的,每次从头开始遍历,计数,当搜索到前x个小的后,下一个就是当前的逆序数值,标记删除,下次遍历跳过该数。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
	int N;
	while (~scanf("%d",&N))
	{
		int x,i,j,cnt;
		bool vis[1005];
		memset(vis,false,sizeof(vis));
		for (i = 0;i < N;i++)
		{
			scanf("%d",&x);
			for (j = 0,cnt = 0;cnt <= x;j++)
			{
				if (!vis[j+1])
				{
					cnt++;
				}
			}
			if (i)
			{
				printf(" ");
			}
			printf("%d",j);
			vis[j] = true;
		}
		printf("\n");
	}
	return 0;
}

  

时间: 2024-08-05 07:26:18

fzu 2184 逆序数还原的相关文章

csu 1555(线段树经典插队模型-根据逆序数还原序列)

1555: Inversion Sequence Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: 469  Solved: 167[Submit][Status][Web Board] Description For sequence i1, i2, i3, … , iN, we set aj to be the number of members in the sequence which are prior to j and greater to

ZYB&#39;s Premutation(有逆序数输出原序列,线段树)

ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 758    Accepted Submission(s): 359 Problem Description ZYB has a premutation P,but he only remeber the reverse log of each pr

树状数组求逆序数 。,。 蓝桥杯 小朋友排队

先介绍一下树状数组.什么是树状数组呢?树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构.主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值:经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值(如果加入多个辅助数组则可以实现区间修改与区间查询).(度娘万岁) 假设A[]数组为存储原来的值得数组,C[]为树状数组. 我们定义:C[i] = A[i - 2^k

行列式(二):全排列与逆序数

由n阶行列式的定义可知,求行列式需要首先求解一个序列的全排列和逆序数 1.全排列 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列. 算法原理 1.假设有一个序列{1,2,3,4,5},首先排列第一个元素,共有5种情况 {1,*,*,*,*} {2,*,*,*,*} {3,*,*,*,*} {4,*,*,*,*} {5,*,*,*,*} 2.单独分析1.中的第一种情况,排列第二个元素,共有四种情况 {1,

逆序数-拼图游戏必备知识

近两天准备出个拼图游戏的教程,准备时候遇到一些问题,收集保存分享下来,一来自己用,二来涨点知识,三来有需要的小伙伴刚好也看看. 事情起因很简单,比如下面这个拼图(矩阵): 1 2 3 空 这样一个2*2矩阵,是标准原始矩阵,但是变一下: 3 1 2 空 这样是可还原的(空和附近的可以换位置,空2,空3,空1,空2即可). 但下面这个呢? 1 3 2 空 你还能还原吗? 这个不是怪你,是真的没法还原. 当时脑子里面过了一下,就发现不行,然后查了查资料,真的有前辈搞过相关的问题,并且有了靠谱的答案.

ACM ICPC 2011–2012, NEERC, Northern Subregional Contest J. John’s Inversions(合并排序求逆序数对数)

题目链接:http://codeforces.com/gym/100609/attachments 题目大意:有n张牌,每张牌有红色和蓝色两面,两面分别写了一些数字,同种颜色的任意两个数字若排在前面的数字比排在后面的数字大就叫做一对逆序数.求怎样排序得到的逆序数对最少. 解题思路:其中一种颜色的数字是顺序且这种颜色数字相同时对应的另一种颜色的数字是顺序时得到的逆序数对数最少.难点在于求逆序数对数.因为数量很大O(n^2)复杂度不能满足,这里根据合并排序的原理求解每个数字前面有多少个比它大的数字,

CSU 1555 Inversion Sequence 给出逆序数求排列 splay

题目链接:点击打开链接 题意: 给出逆序数的值,求原序列(一个1-N的排列) 1, 2, 0, 1, 0 表示1的逆序数是1,2的逆序数是2,3的逆序数是0··· 思路: 从最后一个数开始插,每次插到当前序列的第a[i]个数.. splay模拟 == 这个方法比较直(wu)观(nao),别的方法并没有想出来.. #include <cstdio> #include <iostream> #include <cstring> #include <queue>

1019 逆序数

1019 逆序数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4.给出一个整数序列,求该序列的逆序数. Input 第1行:N,N为序列的长度(n <= 50000) 第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9) Ou

归并排序_逆序数

归并排序求逆序数 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数.一个排列中所有逆序总数叫做这个排列的逆序数.也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序.一个排列中所有逆序总数叫做这个排列的逆序数. 1 #include<cstdio> 2 #in