备战蓝桥杯---线段树应用2

来几个不那么模板的题:

对于删除,我们只要给那个元素附上不可能的值即可,关键问题是怎么处理序号变化的问题。

事实上,当我们知道每一个区间有几个元素,我们就可以确定出它的位置,因此我们可以再维护一下前缀和即可,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[1000100];
struct node{
    int maxn,minn,num;
}tree[4001000];
void build(int p,int l,int r){
    if(l==r){
        tree[p].maxn=a[l];
        tree[p].minn=a[l];
        tree[p].num=1;
        return;
    }
    int mid=(l+r)/2;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    tree[p].maxn=max(tree[p*2].maxn,tree[p*2+1].maxn);
    tree[p].minn=min(tree[p*2].minn,tree[p*2+1].minn);
    tree[p].num=tree[p*2].num+tree[p*2+1].num;
}
void del(int p,int l,int r,int x){
    if(l==r){
        tree[p].maxn=-1e9-10;
        tree[p].minn=1e9+10;
        tree[p].num=0;
        return;
    }
    int mid=(l+r)/2;
    if(tree[p*2].num>=x) del(p*2,l,mid,x);
    else del(p*2+1,mid+1,r,x-tree[p*2].num);
    //更新
    tree[p].maxn=max(tree[p*2].maxn,tree[p*2+1].maxn);
    tree[p].minn=min(tree[p*2].minn,tree[p*2+1].minn);
    tree[p].num=tree[p*2].num+tree[p*2+1].num;
}
node query(int p,int l,int r,int x,int y){
    if(x==1&&y==tree[p].num)
    {
        return tree[p];
    }
    int mid=(l+r)/2;
    if(tree[p*2].num>=y) return query(
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值