241. 楼兰图腾

Powered by:NEFU AB-IN

Link

241. 楼兰图腾

  • 题意

    简略版:求数组中某个数,左边比它大的、小的有多少个,右边比它大的、小的有多少个

  • 思路

    n有 2 e 5 2e5 2e5,所以不能暴力判断,采用两遍树状数组,一次正序、一次逆序
    由于这里原数组是n的排列,所以不用离散化

  • 代码

    '''
    Author: NEFU AB-IN
    Date: 2023-03-26 10:56:30
    FilePath: \Acwing\241\241.py
    LastEditTime: 2023-03-26 11:19:07
    '''
    # import
    import sys, math
    from collections import Counter, deque
    from heapq import heappop, heappush
    from bisect import bisect_left, bisect_right
    
    # Final
    N = int(2e5 + 10)
    INF = int(2e9)
    
    # Define
    sys.setrecursionlimit(INF)
    read = lambda: map(int, input().split())
    
    # —————————————————————Division line ————————————————————————————————————————
    
    tr = [0] * N
    
    
    def lowbit(x):
        return x & -x
    
    
    def add(x, v):
        while x < N:
            tr[x] += v
            x += lowbit(x)
    
    
    def query(x):
        res = 0
        while x:
            res += tr[x]
            x -= lowbit(x)
        return res
    
    
    class Point:
        def __init__(self, ls, ll, rs, rl):
            self.ls = ls
            self.ll = ll
            self.rs = rs
            self.rl = rl
    
    
    ans = [Point(0, 0, 0, 0) for _ in range(N)]
    
    n, = read()
    y = list(read())
    y1 = y[::-1]
    
    for i in range(n):
        # 左边比它小的
        ls = query(y[i] - 1)
        # 左边比它大的
        ll = i - query(y[i])
        add(y[i], 1)
        ans[i].ls = ls
        ans[i].ll = ll
    
    tr = [0] * N
    for i in range(n):
        # 右边比它小的
        rs = query(y1[i] - 1)
        # 右边比它大的
        rl = i - query(y1[i])
        add(y1[i], 1)
        ans[n - i - 1].rs = rs
        ans[n - i - 1].rl = rl
    
    res1, res2 = 0, 0
    
    for i in range(n):
        res1 += ans[i].ll * ans[i].rl
        res2 += ans[i].ls * ans[i].rs
    print(res1, res2)
    

猜你喜欢

转载自blog.csdn.net/qq_45859188/article/details/129777247
今日推荐