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指的就是颜色,所以这道题形式上还是类似于可持久化线段树,但本质上应该不算。
董晓老师

浙公网安备 33010602011771号