\(1<=N1+N2<=100000\)
显然\(N^2\)的模拟过不去。
所以去想\(O(N\ log\ N)\)的算法。(不清楚\(O(N)\)的瞎搞能不能AC)
至于 \(O(N \ log \ N)\) 的数据结构 我们不难想到 ST表 线段树 以及是树状数组
那么因为线段树太难打了。(大雾
选择树状数组。
#include <bits/stdc++.h>
#define rep(i,j,n) for(register int i=j;i<=n;i++)
#define Rep(i,j,n) for(register int i=j;i>=n;i--)
#define low(x) x&(-x)
using namespace std ;
typedef long long LL ;
const int inf = INT_MAX >> 1 ;
inline LL In() { LL res(0) , f(1) ; register char c ;
#define gc c = getchar()
while(isspace(gc)) ; c == '-' ? f = - 1 , gc : 0 ;
while(res = (res << 1) + (res << 3) + (c & 15) , isdigit(gc)) ;
return res * f ;
#undef gc
}
const int N = 100000 + 5 ;
int n , m ;
int a[N] ;
int tree[N] ;
struct node {
int x ; int id ;
};
bool cmp(node x , node y) {
return x.x > y.x ;
}
node Node[N] ;
inline void update(int x,int y) {
for(;x<=n+m;x+=low(x)) tree[x] += y ;
}
inline LL query (int x) {
LL sum (0) ;
for(;x>=1;x-=low(x)) sum += tree[x] ;
return sum ;
}
inline void Ot() {
n = In() , m = In() ;
for(register int i=n;i>=1;i--) {
a[i] = In() ;
}
for(register int i=n+1;i<=n+m;i++) {
a[i] = In() ;
}
for(register int i=1;i<=n+m;i++) {
Node[i] = node({a[i],i}) ;
update(i,1) ;
}
sort(Node+1,Node+n+m+1,cmp) ;
int p = n ;
LL ans(0) ;
for(register int i=1;i<=n+m;i++) {
int x = Node[i].id ;
if(p<x) {
ans += query(x-1) - query(p) ;
p = x - 1 ;
update(x , -1) ;
}
else {
ans += query(p) - query(x) ;
p = x ;
update(x , -1) ;
}
}
printf("%lld",ans) ;
}
signed main() {
// freopen("test.in","r",stdin) ;
// freopen("testdata.txt","w",stdout) ;
return Ot() , 0 ;
}