题目链接

题目描述

给定一个长度为n的排列,要求输出该排列的字典序名次(1,2,3,...,n的名次为1)。

输入输出格式

输入格式:

第一行一个数n,表示排列长度。

第二行n个数,用空格分隔,表示一个长度为n的排列。

输出格式:

一个数,表示该排列的字典序名次。由于答案可能很大,请输出答案对1e9+7取模后的结果。

输入输出样例

输入样例#1:

9
9 8 7 6 5 4 3 1 2
输出样例#1:

362879

说明

对于30%的数据,n<=10。

对于100%的数据,n<=100000。

题解:

30分做法:纯暴力。枚举名次从1至n!的排列,并与给定排列相比较。复杂度O(n!)。

100分做法:类康托展开。

下面进入精彩的猜结论推理时间:

以排列5 9 7 6 8 1 4 3 2为例,第一个数字是5,在5之前还有1,2,3,4,一共4个数字没有用过,脑中模拟暴力过程推理可知以5开头的第一个排列的序号应为1+4*8!。第二个数字是9,在9之前还有1,2,3,4,6,7,8,一共7个数字没有用过,同理可知以59开头的第一个排列的序号为1+4*8!+7*7!。如此递推下去即可得到给定排列的序号。

所以本题需要预处理出1至n的阶乘,还需要得知排列中第i个数之后有多少个数比自己小。这个可以用树状数组维护前缀和得到:初始时每个元素都是1,处理至排列ai 时查询sum(a[i]-1),然后add(a[i],-1)即可。

预处理O(n),依次处理每个元素为O(n),每次处理时sum和add操作为O(logn),总复杂度O(nlogn)。

代码:

#include<bits/stdc++.h>
#define LL long long
#define lowbit(x) x&(-x)
using namespace std;
const int maxn=1e5+10,MOD=1e9+7;
int a[maxn],c[maxn];
LL fac[maxn],ans=1;
int n;
void add(int x,int d)
{
   int i;
   for(i=x;i<=n;i+=lowbit(i)){c[i]+=d;}
}
int sum(int x)
{
   int i,ans=0;
   for(i=x;i>=1;i-=lowbit(i)){ans+=c[i];}
   return ans;
}
int main()
{
   int i,j;LL tmp;
   //freopen("data9.in","r",stdin);
   //freopen("data9.out","w",stdout);
   cin>>n;fac[0]=1;
   for(i=1;i<=n;i++){fac[i]=i*fac[i-1]%MOD;add(i,1);}
   for(i=1;i<=n;i++){scanf("%d",&a[i]);}
   //for(i=0;i<=n;i++){cout<<sum(i)<<" ";}cout<<endl;
   for(i=1;i<=n;i++)
   {
      tmp=sum(a[i]-1)*fac[n-i]%MOD;
      //printf("i=%d sum(a[i]-1)=%d fac[n-i]=%d tmp=%d ans=%d\n",i,sum(a[i]-1),fac[n-i],tmp,ans);
      ans=(ans+tmp)%MOD;
      add(a[i],-1);
   }
   cout<<ans<<endl;
   return 0;
}

Luogu T10025 排列名次的更多相关文章

  1. iframe的优缺点

    HTML框架简述   一个浏览器窗体可以通过几个页面的组合来显示.我们可以使用框架来完成(frames)这项工作.(框架可以把HTML文档分为多个页面)   框架页使用了表格的方式组合,可以分为数行与 ...

  2. Frameset框架优缺点--来自新浪微博

    原文地址:http://blog.sina.com.cn/s/blog_4a4b1b010100p6ro.html HTML框架简述   一个浏览器窗体可以通过几个页面的组合来显示.我们可以使用框架来 ...

  3. How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新)

    How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新) 重要通知: 最近开题报告已差不多告一段落, ...

  4. 大话SEO网站优化|SEO优化入门技术详解

    网络营销 网络营销是借助一切被目标用户认可的网络应用服务平台开展的引导用户关注的行为或活动,目的是促进产品在线销售及扩大品牌影响力. web1.0时代有搜索引擎营销.BBS营销.邮件营销.病毒式营销. ...

  5. luogu P4448 [AHOI2018初中组]球球的排列

    这道题我一上来只会80 还是要感谢题解区大佬题解的帮助 先考虑若\(xy,xz\)为完全平方数,则\(yz\)也为完全平方数,因为\(xy*xz=x^2yz\)为完全平方数,除掉\(x^2\)就行了 ...

  6. luogu P4437 [HNOI/AHOI2018]排列

    luogu 问题本质是把\(a_i\)作为\(i\)的父亲,然后如果有环就不合法,否则每次要取数,要满足取之前他的父亲都被取过(父亲为0可以直接取),求最大价值 贪心想法显然是要把权值大的尽量放在后面 ...

  7. LUOGU P4163 [SCOI2007]排列

    传送门 解题思路 首先我们发现这道题s的长度很小,所以考虑点暴力的做法,状压dp或搜索.本蒟蒻搜索永远调不对,所以就写了个状压dp.因为所有s里的数都要出现一次,并且最后的答案是要求整除,那么我们设d ...

  8. Luogu P4071 [SDOI2016]排列计数

    晚上XZTdalao给我推荐了这道数论题.太棒了又可以A一道省选题了 其实这道题也就考一个错排公式+组合数+乘法逆元 我们来一步一步分析 错排公式 通俗的说就是把n个1~n的数排成一个序列A,并使得所 ...

  9. HDU 1285 确定比赛名次

    传送门 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

随机推荐

  1. C++ 简单输出当前日期时间

    根据https://www.runoob.com/cplusplus/cpp-date-time.html编写. 首先介绍2个数据类型. 一个是time_t,与时间函数相关的变量,定义的变量记录着自 ...

  2. 【MyBatis】MyBatis 入门

    MyBatis 入门 文章源码 软件框架 软件框架伴随着软件工程的发展而出现,所谓的软件框架,是提取了特定领域的软件的共性部分所形成的软件体系,它并不是一个成熟的软件,更像是一个半成品.开发者在框架之 ...

  3. MySQL45讲笔记-事务隔离级别,为什么你改了数据我看不见

    简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败.在MySQL中,事务至此是在引擎层实现的,但并不是所有的MySQL引擎都支持事务,这也是MyISAM被InnoDB取代的原因之一. ...

  4. 关于spring-data与elasticsearch的使用,自定义repository

    之前没有使用过spring-data,关于spring-data有很多很棒的设计,例如仅仅只需要声明一个接口就行,你甚至都不需要去实现,spring-data有内置默认的实现类,基本就上完成绝大多数对 ...

  5. 【Oracle】regexp_substr()函数详解

    环境:Oracle10.2.0.5 在SQL中尝试使用正则 可以试下regexp_substr()来进行分割 首先创建一个实验视图: SQL> create or replace view te ...

  6. MongoDB分片集群部署方案

    前言 副本集部署是对数据的冗余和增加读请求的处理能力,却不能提高写请求的处理能力:关键问题是随着数据增加,单机硬件配置会成为性能的瓶颈.而分片集群可以很好的解决这一问题,通过水平扩展来提升性能.分片部 ...

  7. LVS负载均衡IP隧道模式原理介绍以及配置实战

    LVS 基本工作原理 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP,将数 ...

  8. 多路复用器Select、Poll、Epoll区别梳理

    注意:本文是本人的学习总结,可能存在理解上的错误,请带着怀疑眼光看待,如果有不准确的地方欢迎指出,疑义相与析.为了叙述完整性,前面有一些前置知识,可以根据目录直接看后面的详解部分. 前置知识 用户态与 ...

  9. (hive)hive优化(转载)

    1. 概述 1.1 hive的特征: 可以通过SQL轻松访问数据的工具,从而实现数据仓库任务,如提取/转换/加载(ETL),报告和数据分析: 它可以使已经存储的数据结构化: 可以直接访问存储在Apac ...

  10. 在VMware15安装Ubuntu 16.04

    安装环境: VMware15 VMware15官网地址:https://my.vmware.com/cn/web/vmware/info/slug/desktop_end_user_computing ...