P3939数颜色

数颜色

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define N 300005
#define mid ((l+r)>>1)
int n,m,a[N];
int root[N],tot;//根节点,开点个数
int ls[N*25],rs[N*25],sum[N*25];
void change(int &u,int l,int r,int p,int k)
{
	if(!u) u=++tot;
	sum[u]+=k;
	if(l==r) return;
	if(p<=mid) change(ls[u],l,mid,p,k);
	else change(rs[u],mid+1,r,p,k);
}
int query(int u,int l,int r,int x,int y)
{
	if(x<=l&&y>=r) return sum[u];
	int s=0;
	if(x<=mid) s+=query(ls[u],l,mid,x,y);
	if(y>mid) s+=query(rs[u],mid+1,r,x,y);
	return s;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		change(root[a[i]],1,n,i,1);
	}
	for(int i=1;i<=m;i++)
	{
		int o,l,r,c,x;
		scanf("%d",&o);
		if(o==2)
		{
			scanf("%d",&x);
			change(root[a[x]],1,n,x,-1);
			change(root[a[x+1]],1,n,x+1,-1);
			change(root[a[x]],1,n,x+1,1);
			change(root[a[x+1]],1,n,x,1);
			swap(a[x],a[x+1]);
		}
		else
		{
			scanf("%d%d%d",&l,&r,&c);
			printf("%d\n",query(root[c],1,n,l,r));
		}
	}
	return 0;
}

重点:要明确是以每一种颜色建二叉树,root[x]里面的x指的就是颜色,所以这道题形式上还是类似于可持久化线段树,但本质上应该不算。
董晓老师

posted @ 2025-09-03 11:39  Lucian2007  阅读(12)  评论(0)    收藏  举报