class Solution {
public:
struct tree{
int l,r,sum;
}tree[400010];
void build(int i,int l,int r){
tree[i].l=l;tree[i].r=r;
if(l==r)
return;
int mid=(l+r)>>1;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
}
int search(int i,int l,int r){
if(tree[i].l>=l && tree[i].r<=r){
return tree[i].sum;
}
if(tree[i].r<l || tree[i].l>r)
return 0;
int s=0;
if(tree[i*2].r>=l)
s+=search(2*i,l,r);
if(tree[i*2+1].l<=r)
s+=search(i*2+1,l,r);
return s;
}
void add(int i,int x){
tree[i].sum++;
if(tree[i].l==tree[i].r)
return;
if(x<=tree[i*2].r)
add(2*i,x);
else
add(2*i+1,x);
}
int createSortedArray(vector<int>& instructions) {
long long res=0,mod=1e9+7;
build(1,1,100000);
for(int i=0;i<instructions.size();i++){
res+=min(search(1,1,instructions[i]-1),search(1,instructions[i]+1,100000));
add(1,instructions[i]);
}
return res%mod;
}
};
leetcode 1649 线段树模板题
最新推荐文章于 2024-07-25 21:43:46 发布