1.练习项目 :
问题描述
给定长度为 n 的序列 a,输出 a 中逆序对的数量。
逆序对:对于 1≤i<j≤n,若 ai>aj ,则 <ai,aj> 为一对逆序对。
输入格式
第一行输入一个正整数 n。(1≤n≤105)
第二行输入 n 个正整数表示序列 a。(1≤ai≤109,1≤i≤n)
输出格式
输出一个整数,表示 a 中逆序对的数量。
2.选择课程
在蓝桥云课中选择题库,选择题号19875并开始练习。
3.开始练习
(1)源码 :
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=32*1e5+10,M=1e5+10;
int a[M],e[N];
int son[N][2],tot=1;
void insert(int x)
{
int o=1;
e[o]++;
for(int i=30;i>=0;i--){
int y=x>>i&1;
if(!son[o][y])son[o][y]=++tot;
o=son[o][y];
e[o]++;
}
}
int query(int x)
{
int o=1,res=0;
for(int i=30;i>=0;i--){
int y=x>>i&1;
//若y==1则走0,若y==0则走1
if(y==0)res+=e[son[o][1]];
if(!son[o][y])break;
o=son[o][y];
}
return res;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
ll ans=0;
for(int i=1;i<=n;i++){
ans+=1ll*query(a[i]);
insert(a[i]);
}
cout<<ans<<'\n';
return 0;
}
(2)检验结果
对此代码进行检验,检验后无报错,提交此代码,判题结果为正确100分。
(3)练习心得:注意每段代码末尾的分号是否存在,如不存在则需即使补充;输入法 是否切换 为英语模式;语法是否错误。