My Solution
双向链表+反向做+优先队列
反向做,按着反的顺序把元素一个一个的添加进去,用priority_queue 维护当前最值,
用双向链表维护当前区间的状态,L[i]表示以i为端点的区间的区间左端点,R[i]表示以i为区间端点的右端点
对于每个点 j, 当只R[i + 1] != 0 时, 右边有区间,可以把两个链表合并成一个, R[i] = R[i + 1], L[i] = i;
当只L[i - 1] != 0 时, 左边有区间,可以把两个链表合并成一个, R[L[i - 1]] = i, R[i] = i, L[i] = L[i - 1]
当两边都有区间时,先合并一边,再合并另一边最后得到的区间是 [ L[i - 1], R[i + 1] ];
然后根据合并来的区间得到新的区间和,push到priority_queue里,这个和必定比原来分开的子区间大,所以原来的子区间和就留在pq里不用管了。最多维护n个元素
区间和用 map<pair<int, int>, LL> mp,来维护, mp[ii(i, i)] = a[per[i]];, 然后 mp[ii(l, r)]就用来维护新的区间的和,然后push到pq里。
复杂度 O(nlogn)
#include
#include
#include
#include
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
https://www.prolightsfxjh.com/
Thank you!
------from ProLightsfx
共有 0 条评论