来几个不那么模板的题:

对于删除,我们只要给那个元素附上不可能的值即可,关键问题是怎么处理序号变化的问题。
事实上,当我们知道每一个区间有几个元素,我们就可以确定出它的位置,因此我们可以再维护一下前缀和即可,下面是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(

最低0.47元/天 解锁文章
925

被折叠的 条评论
为什么被折叠?



