bzoj 2120&&2453 线段树套权值线段树
来源:互联网 发布:软件行业增值税税率 编辑:程序博客网 时间:2024/06/07 06:37
这题只有我写了树套树吗?
记录一个点的颜色下一个出现的位置nex。
那么查询一段区间颜色个数相当于查询这段区间中nex大于右端点的数的个数。这个东西用普通线段树套权值线段树维护一下。
对于修改由于不超过1000次,因此只需要扫一遍要改的颜色然后找到位置修改一下nex就行了。
#include <bits/stdc++.h>using namespace std;#define N 11000#define C 1100000#define M 11000000int n,m,cnt,l1,r1,l2,r2;int a[N],pre[C],nex[C],head[C];int ch[M][2],val[M],root[N<<2];char s[11];struct val_tree{ void insert(int l,int r,int &x,int y,int v) { if(!x)x=++cnt; val[x]+=v; if(l==r)return; int mid=(l+r)>>1; if(mid>=y)insert(l,mid,ch[x][0],y,v); else insert(mid+1,r,ch[x][1],y,v); } int query(int l,int r,int x) { if(l2<=l&&r<=r2) return val[x]; int mid=(l+r)>>1,ret=0; if(mid>=l2)ret+=query(l,mid,ch[x][0]); if(mid<r2) ret+=query(mid+1,r,ch[x][1]); return ret; }}tr2;struct pos_tree{ void insert(int l,int r,int now,int x,int y,int v) { tr2.insert(1,n+1,root[now],y,v); if(l==r)return; int mid=(l+r)>>1; if(mid>=x)insert(l,mid,now<<1,x,y,v); else insert(mid+1,r,now<<1|1,x,y,v); } int query(int l,int r,int now) { if(l1<=l&&r<=r1) return tr2.query(1,n+1,root[now]); int mid=(l+r)>>1,ret=0; if(mid>=l1)ret+=query(l,mid,now<<1); if(mid<r1) ret+=query(mid+1,r,now<<1|1); return ret; }}tr1;int main(){ //freopen("tt.in","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<C;i++)head[i]=n+1; for(int i=n;i>=1;i--) { nex[i]=head[a[i]]; tr1.insert(1,n,1,i,nex[i],1); pre[nex[i]]=i; head[a[i]]=i; } for(int x,y;m--;) { scanf("%s%d%d",s,&x,&y); if(s[0]=='Q') { l1=x;r1=y;l2=y+1;r2=n+1; printf("%d\n",tr1.query(1,n,1)); } else { if(y==a[x])continue; if(pre[x]) { tr1.insert(1,n,1,pre[x],x,-1); tr1.insert(1,n,1,pre[x],nex[x],1); } else head[a[x]]=nex[x]; nex[pre[x]]=nex[x]; pre[nex[x]]=pre[x]; tr1.insert(1,n,1,x,nex[x],-1); if(head[y]>x) { nex[x]=head[y];pre[head[y]]=x; pre[x]=0;head[y]=x; tr1.insert(1,n,1,x,nex[x],1); } else for(int i=head[y];;i=nex[i]) if(nex[i]>x) { tr1.insert(1,n,1,i,nex[i],-1); nex[x]=nex[i];pre[nex[i]]=x; pre[x]=i;nex[i]=x; tr1.insert(1,n,1,i,nex[i],1); tr1.insert(1,n,1,x,nex[x],1); break; } a[x]=y; } } return 0;}
0 0
- bzoj 2120&&2453 线段树套权值线段树
- bzoj 2141 线段树套权值线段树
- bzoj 线段树专刊
- bzoj 1798 线段树
- BZOJ 1012 线段树
- bzoj 4388 线段树
- BZOJ 1798 线段树
- BZOJ 1112 线段树
- BZOJ 3339 线段树
- bzoj 2957 线段树
- bzoj 1012 线段树
- bzoj 2752 线段树
- bzoj 3519 线段树
- bzoj 1798 线段树
- BZOJ 3038 线段树
- bzoj 3038 线段树
- BZOJ 3110 线段树套线段树
- BZOJ 3123 线段树合并
- Android 处理音频焦点 AudioFocus,停止音频播放
- JMS的基本构件
- Hotspot虚拟机- 垃圾收集算法和垃圾收集器
- SPRING MVC 中的 MULTIACTIONCONTROLLER 用法详解 (转载)
- 动态修改UINavigationBar的背景色
- bzoj 2120&&2453 线段树套权值线段树
- 一、Java线程状态转换
- jQuery的eq()方法
- iOS navigationbar全透明的方法
- Android 开发环境配置
- Cookie的使用,自动填充用户名和密码
- c语言中编译链接的整个过程
- Android应用开发性能优化完全分析
- Java进阶之Annotation(注解)——Annotation(注解)概念