链接

[https://ac.nowcoder.com/acm/contest/358/D]

题意

链接:https://ac.nowcoder.com/acm/contest/358/D

来源:牛客网

题目描述

出题人的妹子送了出题人一个手环,这个手环上有 n 个珠子,每个珠子上有一个数。

有一天,出题人和妹子分手了,想把这个手环从两个珠子间切开,并按顺时针顺序展开成一条链。

可以发现,这条链一共有 n 种可能性。求这 n 种可能性的逆序对数之积模 1000000007。

输入描述:

第一行一个数 n,表示珠子个数。

接下来一行 n 个数,以顺时针顺序给出每个珠子上的整数

输出描述:

一个数,表示答案。

示例1

输入

复制

4

1 3 2 3

输出

复制

24

说明

一共有 4 种方式:

1 3 2 3;3 1 3 2;2 3 1 3;3 2 3 1;

逆序对数分别为 1,3,2,4,积为 24。

备注:

n<=200000,-109<=珠子上的整数<=109。

分析

首先我们知道用树状数组求,逆序数

那么这题由于数据范围是-109<=珠子上的整数<=109。

开一个数组必然是不够的,所以首先离散化一下,就可以求出第一次的逆序数

那么每次变化一个顺序,可以把第一个元素弄到最后,那么逆序数会变为多少呢?

首先对于某个数,求出小于它的数的个数

 int pos1 = lower_bound(d,d+n,a[i+1].va) - d;
x[i] = pos1; //比b[i]小的总个数

以及大于它的数的个数。

int pos2 = upper_bound(d,d+n,a[i+1].va) - d;
y[i] = n - pos2; //比b[i]大的总个数

这里用了lower_bound和upper_bound,

for(int i = 0; i < n; ++i)
{
int pos1 = lower_bound(d,d+n,a[i+1].va) - d;
int pos2 = upper_bound(d,d+n,a[i+1].va) - d;
x[i] = pos1; //比b[i]小的总个数
y[i] = n - pos2; //比b[i]大的总个数
//cout<<x[i]<<' '<<y[i]<<endl;
}

后面遍历剩下乘积取模即可

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e9+7;
const int N=2e5+10;
int n;
int b[N];
int c[N];
int d[N];
int x[N];
int y[N];
struct node{
int va,pos;
}a[N];
bool cmp(node x,node y){
return x.va<y.va;
}
void update(int i,int va){
for(int j=i;j<=n;j+=j&-j)
c[j]+=va;
}
int getsum(int x){
int ans=0;
for(int i=x;i;i-=i&-i)
ans+=c[i];
return ans;
}
int main(){
//freopen("in.txt","r",stdin);
while(cin>>n){
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++){
cin>>a[i].va;
d[i-1]=a[i].va;
a[i].pos=i;
}
sort(d,d+n);
for(int i = 0; i < n; ++i)
{
int pos1 = lower_bound(d,d+n,a[i+1].va) - d;
int pos2 = upper_bound(d,d+n,a[i+1].va) - d;
x[i] = pos1; //比b[i]小的总个数
y[i] = n - pos2; //比b[i]大的总个数
//cout<<x[i]<<' '<<y[i]<<endl;
}
sort(a+1,a+n+1,cmp);
int cnt=1;
for(int i=1;i<=n;i++){
if(i!=1&&a[i].va!=a[i-1].va)
cnt++;
b[a[i].pos]=cnt;
}
ll sum=0;
for(int i=1;i<=n;i++){
update(b[i],1);
sum+=i-getsum(b[i]);
sum%=mod;
}
//cout<<sum<<endl;
ll ans=sum;
for(int i=0;i<n-1;i++){
sum=((sum-x[i]+y[i])%mod+mod)%mod;
ans=ans*sum%mod;
}
cout<<ans<<endl;
}
return 0;
}

牛客练习赛38 D 出题人的手环的更多相关文章

  1. 牛客练习赛38 E 出题人的数组 2018ccpc桂林A题 贪心

    https://ac.nowcoder.com/acm/contest/358/E 题意: 出题人有两个数组,A,B,请你把两个数组归并起来使得cost=∑i∗ci 最小,归并要求原数组的数的顺序在新 ...

  2. 牛客练习赛42 C 出题的诀窍 (贡献,卡常)

    牛客练习赛42 C 出题的诀窍 链接:https://ac.nowcoder.com/acm/contest/393/C来源:牛客网 题目描述 给定m个长为n的序列a1,a2,-,ama_1 , a_ ...

  3. 牛客练习赛38 D 题 出题人的手环 (离散化+树状数组求逆序对+前缀和)

    链接:https://ac.nowcoder.com/acm/contest/358/D来源:牛客网 出题人的手环 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他 ...

  4. 出题人的女装(牛客练习赛38题B) (概率+分式运算)

    链接:https://ac.nowcoder.com/acm/contest/358/B来源:牛客网 出题人的女装 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他 ...

  5. 牛客练习赛42 C 出题的诀窍

    题目链接:https://ac.nowcoder.com/acm/contest/393/C 这个题就是对于每个数算贡献,如果有相同的数,只计算先出现的数的贡献 对于数x,若它在前i行的数目分别为a1 ...

  6. 出题人的手环(牛客练习赛38D 离散化+树状数组)

    题目链接(https://ac.nowcoder.com/acm/contest/358/D) 题目描述 出题人的妹子送了出题人一个手环,这个手环上有 n 个珠子,每个珠子上有一个数. 有一天,出题人 ...

  7. 最小生成树--牛客练习赛43-C

    牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 ​ 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...

  8. 牛客练习赛48 C 小w的糖果 (数学,多项式,差分)

    牛客练习赛48 C 小w的糖果 (数学,多项式) 链接:https://ac.nowcoder.com/acm/contest/923/C来源:牛客网 题目描述 小w和他的两位队友teito.toki ...

  9. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

随机推荐

  1. uv-pv-vv的区别

    UV(unique visitor) 是指自然人登录自己账号访问量 KPI是指UV PV (Page View) 是指网页的浏览量 vv(Visitor view) 是指每次登录网站的访问次数 uv- ...

  2. C#方法重载(overload)方法重写(override)隐藏(new)

    一.重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同.这样才能通过传递不同的参数来决定到底调用哪一个. 值得注意的是,方法重载只有通过参数不同来判断调用哪个方法, ...

  3. CharacterController平滑移动到某点

    通常使用CharacterController控制玩家移动时,我们都会写以下代码: void Update() { var move = (moveTarget - transform.Positio ...

  4. 【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入

    在阅读C++语言的设计与演化一书时,作者多次提到希望能设计出一个自动废料收集,然而出于种种考虑,始终未将自动废料收集纳入标准讨论中,而是由Coder自己考虑是否在程序中实现废料收集. 当然了,许多Ja ...

  5. JavaScript—Date对象详情

    Date对象概述 javaScript 提供了 Date 类型来处理时间和日期.Date 对象内置一系列获取和设置日期时间信息的方法.(不是内置对象,需要自己new) javaScript 中的 Da ...

  6. MySQL高级知识(五)——索引分析

    前言:前面已经学习了explain(执行计划)的相关知识,这里利用explain对索引进行优化分析. 0.准备 首先创建三张表:tb_emp(职工表).tb_dept(部门表)和tb_desc(描述表 ...

  7. flask的migrate

    https://blog.csdn.net/kevin_qq/article/details/51777190 这个方法可以: https://www.cnblogs.com/caicairui/p/ ...

  8. 通过JS如何获取IP地址

    通过JS获取你真实的外网IP和内网IP,就算开代理也没有用,想想真是太可怕了,还能不能愉快的装逼了! 代码: //get the IP addresses associated with an acc ...

  9. Linux:Day8(上) 文件系统挂载和管理工具

    文件系统管理: 将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为称之为挂载: 解除此关联关系的过程称之为卸载: 把设备关联挂载点:Mount Point ...

  10. Python:Day53 Template基础

    一.模板由 html代码+逻辑控制代码 组成 二.逻辑控制代码的组成 1.变量(使用双大括号来引用变量) 语法格式:{{ var_name }} -----------------------Temp ...