社区讨论

动态开点权值线段树求条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 条回复,欢迎继续交流。

正在加载回复...