社区讨论
动态开点权值线段树求条34pts WA
P6136【模板】普通平衡树(数据加强版)参与者 18已保存回复 44
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 44 条
- 当前快照
- 1 份
- 快照标识符
- @mkmfmklp
- 此快照首次捕获于
- 2026/01/20 18:09 4 周前
- 此快照最后确认于
- 2026/02/11 02:44 上周
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct DVST
{
int v;
DVST* l=nullptr;
DVST* r=nullptr;
};
unordered_map<int,int> had;
//tree[i]->i节点有多少个数
/*
以下全用操作名称+操作编号(多个连一起)
/的形式定义外部直接调用的函数
*/
int cnt=0;
DVST* root=new DVST;
void up(DVST* p)
{
p->v=(p->l?p->l->v:0)+(p->r?p->r->v:0);
}
void update12(DVST* &p,int l,int r,int x,int k)
{
if(!p) p=new DVST;
if(l==r)
{
p->v+=k;
return;
}
int mid=l+((r-l)>>1);
if(x<=mid) update12(p->l,l,mid,x,k);
else update12(p->r,mid+1,r,x,k);
up(p);
}
int query3(DVST* p,int l,int r,int x) { // 返回<x的数的个数
if(!p) return 0;
if(r < x) return p->v; // 整区间<x,返回总数
if(l >= x) return 0; // 整区间≥x,返回0
int mid=l+((r-l)>>1);
return query3(p->l,l,mid,x) + query3(p->r,mid+1,r,x); // 递归求和左右子树
}
int query4(DVST* p,int l,int r,int x)
{
if(!p) return 0;
if(l==r) return l;
int mid=l+((r-l)>>1);
if(p->l!=nullptr && p->l->v>=x) return query4(p->l,l,mid,x);
else return query4(p->r,mid+1,r,x-((p->l)?p->l->v:0));
}
int query5(int n,int x)
{
return query4(root,0,n,query3(root,0,n,x));
}
int query6(int n,int x) {
return query4(root,0,n,query3(root,0,n,x)+1+(had[x]));
}
signed main()
{
cin.tie(0);cout.tie(0);
int n,m,ans=0,last=0;
cin>>n>>m;
int arr[100005]={0};
for(int i=1;i<=n;i++)
{
cin>>arr[i];
had[arr[i]]++;
update12(root,0,INT_MAX,arr[i],1);
}
for(int i=1;i<=m;i++)
{
int opt,x;
cin>>opt>>x;
if(opt==1)
{
x^=last;
update12(root,0,INT_MAX,x,1);
had[x]++;
}
else if(opt==2)
{
x^=last;
update12(root,0,INT_MAX,x,-1);
had[x]--;
}
else if(opt==3)
{
int now=query3(root,0,INT_MAX,x^last)+1;
last=now;
ans^=now;
}
else if(opt==4)
{
int now=query4(root,0,INT_MAX,x^last);
last=now;
ans^=now;
}
else if(opt==5)
{
int now=query5(INT_MAX,x^last);
last=now;
ans^=now;
}
else
{
int now=query6(INT_MAX,x^last);
last=now;
ans^=now;
}
}
cout<<ans;
return 0;
}
回复
共 44 条回复,欢迎继续交流。
正在加载回复...