链接

[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. a标签下载

    <a href="存在问题.docx" download style="color:red;font-size:20px;cursor:pointer;float: ...

  2. python第一百一十七天-----ModelForm组件

    Model + Form => 验证 + 数据库操作 - class LoginModelForm(xxxxx): 利用model.A中的字段 1. 生成HTML标签:class Meta: . ...

  3. c/c++ 重载new,delete运算符 placement new

    重载new,delete运算符 new,delete在c++中也被归为运算符,所以可以重载它们. new的行为: 先开辟内存空间 再调用类的构造函数 开辟内存空间的部分,可以被重载. delete的行 ...

  4. Unity 琐碎(4) 可视化辅助调试Giamos

    Gizmos 类 可以在代码中绘制一些输出结果或者中间输出内容,比如计算后的包围盒等等 类变量 方法 作用 color 控制输出颜色 matrix Set the gizmo matrix used ...

  5. 【Linux基础】VI命令模式下删除拷贝与粘贴

    在VI命令模式下:y 表示拷贝, d 表示删除,p标识粘贴 1.删除 dw 表示删除从当前光标到光标所在单词结尾的内容. d0 表示删除从当前光标到光标所在行首的内容. d$ 表示删除从当前光标到光标 ...

  6. (转)Spring Boot(十六):使用 Jenkins 部署 Spring Boot

    http://www.ityouknow.com/springboot/2017/11/11/spring-boot-jenkins.html enkins 是 Devops 神器,本篇文章介绍如何安 ...

  7. 【NOI2008】志愿者招募

    [NOI2008]志愿者招募 和[2017山东day7]养猫做法类似. 都是神仙题. 首先我设\(c_{i,j}=[l[j]\leq i\leq r[j]]\) ,于是就可以列出下面的不等式: \[ ...

  8. C#基础の迭代器详解

    一.什么是迭代器 迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容. 迭代器模式是 ...

  9. 在Linux上搭建VisualSVN Server(svn服务端)

    一.检查是否安装了低版本的SVN #  rpm -qa | grep subversion 如果已安装SVN,则会返回版本信息.这时需要卸载旧版本的SVN. 卸载旧版本SVN # yum remove ...

  10. centos7+nginx负载均衡Tomcat服务

    接着上一篇:www.cnblogs.com/lkun/p/8252815.html 我们在上一篇在一台centos7服务器上部署了两个nginx,接下来我们使用一个nginx实现tomcat的负载均衡 ...