题目链接

题目描述

给定一个长度为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,处理至排列a时查询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. Docker学习笔记之向服务器部署应用程序

    部署的应用仅仅是简单应用程序,使用的是node管理的web应用,具体我也不是很会,当然也可以配置tomcat服务器.这里主要是学习docker.需要客户机和服务机,其中服务机必须要为Linux操作系统 ...

  2. upload-labs 1-21关通关记录

    0x01: 检查源代码,发现JS前端验证,关闭JS即可连接,或者手动添加.php,或者上传1.jpg,再抓包修改为php 0X02: if (($_FILES['upload_file']['type ...

  3. CICD基础概念

    windows下搭建jenkins:安装方法一:1.安装JDK,配置好环境变量2.下载安装最新版本Jenkins:登陆 http://mirrors.jenkins-ci.org/ 下载windows ...

  4. kali中安装漏洞靶场Vulhub

    一.什么是vulhub? Vulhub是一个基于docker和docker-compose的漏洞环境集合,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者更加 ...

  5. Assuming that agent dropped connection because of access permission

    Assuming that agent dropped connection because of access permission

  6. service代理模式及负载均衡

    [root@k8s-master ~]# vim service.yaml apiVersion: v1 kind: Service metadata: name: my-service spec: ...

  7. Spring-AOP为类增加新的功能

    适配器的简单应用实现: 比如:有一个类Car,在类中有两个属性一个为汽车名name,另一个为速度speed.其行为为run(). 现在有一辆车BMWCar 增加了GPS功能.如下实现: 基本类: pu ...

  8. Mybatis【15】-- Mybatis一对一多表关联查询

    注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-11-one2one,需要自取,需要配置maven ...

  9. 转 Fiddler2 下断点修改HTTP报文

    文章转自:https://www.cnblogs.com/zhengna/p/10861893.html 一 Fiddler中设置断点修改HTTP请求 方法1:全局断点.Rules-->Auto ...

  10. ADB 基本命令

    ADB很强大,记住一些ADB命令有助于提高工作效率. 获取序列号: adb get-serialno 查看连接计算机的设备: adb devices 重启机器: adb reboot 重启到bootl ...