- 大概就是用树状数组
- 关于卡常:
register
和inline
全加了
- O2开了
- 快读开了
- 然鹅仍然有几个点TLE,有时候rp高会变成WA(
- 代码如下:
#include<bits/stdc++.h>
#define RE register
using namespace std;
int a[500005],b[500005],c[500005],n,anss=0;
inline void modify(RE int x){
for(RE int i=x;i<=n;i+=i&(-i)){
c[i]++;
}
}
inline int find(RE int x){
RE int ans=0;
for(RE int i=x;i;i-=i&(-i)){
ans+=c[i];
}
return ans;
}
bool cmp(int p,int q){
return a[p]<a[q];
}
inline int read(){
char ch=getchar();
int x=0,f=1;
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar();
return x*f;
}
int main(){
n=read();
for(RE int i=1;i<=n;i++){
a[i]=read();
b[i]=i;//离散化
}
sort(b+1,b+n+1,cmp);
for(RE int i=1;i<=n;i++){
modify(b[i]);
anss+=i-find(b[i]-1);
}
printf("%d",anss);
return 0;
}