$P3253 [JLOI2013]删除物品$

\(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 ;
}

猜你喜欢

转载自www.cnblogs.com/qf-breeze/p/10698059.html