WA 60,下了数据,打了暴力。
我写了个checker(暴力
如果我假装相等的数不是逆序对,那麽答案是18288966215。
如果我假装相等的数是逆序对,那麽答案是18288966236。
而 out 文件的第二位确是 18288966223。
我感觉我的暴力应该没写挂吧/kel
#include<bits/stdc++.h>
using namespace std;
template<typename t>inline void read(t &x)
{
x=0;char c=getchar(),f=0;
for(;c<'0'||c>'9';c=getchar()) if(!(c^45)) f=1;
for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
if(f) x=-x;
}
int n,a[300005],c,b[300005],t[300005];
inline void add(int x,int w) {for(;x<=1000000000;x+=x&(-x)) t[x]+=w;}
inline int qry(int x) {int r=0;for(;x;x-=x&(-x)) r+=t[x];return r;}
inline void lisan()
{
for(int i=1;i<=n;i++) t[i]=a[i];
sort(t+1,t+n+1);
int tmp=unique(t+1,t+n+1)-t-1;
for(int i=1;i<=n;i++) a[i]=lower_bound(t+1,t+tmp+1,a[i])-t;
memset(t,0,sizeof(t));
}
inline int lowbit(int a) {return a&(-a);}
inline void add(int x)
{
for(int i=x;i<=n;i+=lowbit(i)) t[i]++;
}
inline int search(int l,int r)
{
int s1=0,s2=0;
for(int i=l-1;i>=1;i-=lowbit(i)) s1+=t[i];
for(int i=r;i>=1;i-=lowbit(i)) s2+=t[i];
return s2-s1;
}
int main()
{
read(n);int x;read(x);
for(int i=1;i<=n;i++) read(a[i]);
read(x);long long ans=0;int qwq=a[x];
for(int i=1;i<=n;i++) if(a[i]<=qwq) b[++c]=a[i],a[i]=-1;
sort(b+1,b+c+1);
for(int i=1,l=0;i<=n;i++) if(a[i]==-1) a[i]=b[++l];
lisan();//在下一行a[i]+1或者a[i]
for(int i=1;i<=n;i++) {ans+=search(a[i],n);add(a[i]);}
return printf("%lld\n",ans),0;
}