题目描述

逆序对问题对于大家来说已经是非常熟悉的问题了,就是求i<j时,a[i] > a[j]的组数。现在请你求出一串数字中的逆序对的个数,需要注意的是,这些数字均在[0,9]之内。

输入

第一行输入T,表示有T组测试数据
对于每组数据,首先输入n,代表有n个数(0<n<=10^6)
接下来输入n个数,每个数都在[0,9]之内

输出

输出逆序对的个数,且对10^9+7取模

样例输入

2
3
3 2 1
3
1 2 1

样例输出

3
1

解法一:数学贪心解法(有点小技巧哦)

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+;
int d[];
int main()
{
int T,n;
cin>>T;
while(T--){
cin>>n;
int ans=,arr[n];
memset(d,,sizeof(d));
memset(arr,,sizeof(arr));
for(int i=;i<=n;i++) cin>>arr[i];
for(int i=;i<=n;i++){
int res=;
d[arr[i]]++;
for(int j=arr[i]+;j<=;j++)
res=(res+d[j])%mod;
ans=(ans+res)%mod;
}
cout<<ans<<endl;
}
}

解法二:分治(和归并排序类似吧感觉)

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
const int mod=1e9+;
int ans;
int a[maxn],c[maxn];
void Conquer_Divide(int l,int r)
{
int m=(l+r)/;
if(r>l){
Conquer_Divide(l,m);
Conquer_Divide(m+,r);
int i=l,j=m+,t=l;
while(i<=m&&j<=r){
if(a[i]>a[j]){
c[t++]=a[j++];
ans=(ans+m-i+)%mod;
}
else c[t++]=a[i++];
}
while(i<=m) c[t++]=a[i++];
while(j<=r) c[t++]=a[j++];
for(i=l;i<=r;i++) a[i]=c[i];
}
}
int main()
{
int n,T;
cin>>T;
while(T--){
cin>>n;
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
ans=;
Conquer_Divide(,n);
printf("%d\n",ans);
}
}

XDU1024简单逆序对(贪心||分治)的更多相关文章

  1. BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组

    BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一 ...

  2. P3157 动态逆序对 CDQ分治

    动态逆序对 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3157 题意: 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对 ...

  3. [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...

  4. BZOJ 3295 动态逆序对 | CDQ分治

    BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...

  5. [CQOI2011]动态逆序对 CDQ分治

    洛谷上有2道相同的题目(基本是完全相同的,输入输出格式略有不同) ---题面--- ---题面--- CDQ分治 首先由于删除是很不好处理的,所以我们把删除改为插入,然后输出的时候倒着输出即可 首先这 ...

  6. 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治

    题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...

  7. 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治

    [BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...

  8. bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)

    3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...

  9. BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]

    RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...

随机推荐

  1. mysql select缓存使用详解

    mysql Query Cache 默认为打开.从某种程度可以提高查询的效果,但是未必是最优的解决方案,如果有的大量的修改和查询时,由于修改造成的cache失效,会给服务器造成很大的开销,可以通过qu ...

  2. 编译安装的gitlab8.x如何修改时区设置

    编译安装的gitlab 8.x版本默认的时区是UTC,在页面上显示的时间默认是零时区的区时,安装完成之后,如果页面上显示的时间比北京时间少了8个小时,则需要修改一下时区 把gitlab.yml文件中的 ...

  3. CentOS 安装Sqlite3

    wget http://www.sqlite.org/sqlite-autoconf-3070500.tar.gz tar xvzf sqlite-autoconf-3070500.tar.gz cd ...

  4. 改变presentModalView大小

    rc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; rc.modalPresentationStyle = UIModalP ...

  5. C# DataView操作DataTable

    1.DataView筛选数据 //假设有一个DataTable数据 DataTable dt = new DataTable(); //DataTable转成DefaultView DataView ...

  6. java.lang.NoClassDefFoundError: org/jdom/input/SAXBuilder

    java.lang.NoClassDefFoundError: org/jdom/input/SAXBuilder 少导入了jdom.jar包. 下载地址:http://www.jdom.org/do ...

  7. Android开发小技巧之根据position判断ListView是否在显示

    使用ListView的时候,会有判断指定项是否正在显示的需求,其实很简单,代码如下: private boolean isShowing(int position) { int showViewCou ...

  8. 近期在看的一段JS(谁能看出我想实现什么功能)

    示例代码: <script type="text/javascript"> !function(){ var e=/([http|https]:\/\/[a-zA-Z0 ...

  9. 9.12DjangoORM回顾和路由.

    2018-9-12 13:44:41 周末继续整理一下博客!不知不觉记了好多! 越努力越幸运! 永远不要高估自己! 关于反射的复习 # /usr/bin/env python # -*- coding ...

  10. 9.8Django

    2018-9-8 14:34:38