bzoj 2453: 维护队列
2016-03-31 22:28
267 查看
基本上同3343;只是要维护每个点左边的与它同色的点;
#include<bits/stdc++.h> #define rep(i,k,n) for(int i=k;i<=(n);i++) using namespace std; const int maxn=10005; const int maxc=1000005; typedef long long ll; int a[maxn],b[maxn],pre[maxn],c[maxn],pos[maxn],block,n,q,m,last[maxc],vis[200]; void reset(int x){ int l=(x-1)*block+1,r=min(x*block,n); rep(i,l,r)pre[i]=b[i]; sort(pre+l,pre+r+1); } char s[20]; void change(int x,int y){ rep(i,1,n)last[c[i]]=0; rep(i,1,m)vis[i]=0; c[x]=y; rep(i,1,n){int t=b[i]; b[i]=last[c[i]]; if(t!=b[i])vis[pos[i]]=1; last[c[i]]=i; }rep(i,1,m)if(vis[i])reset(i); } int find(int x,int v){ int l=(x-1)*block+1,r=min(x*block,n); int ll=l; while(l<=r){int mid=(l+r)>>1; if(pre[mid]<v)l=mid+1; else r=mid-1; }return l-ll; } int ask(int l,int r){ int ans=0; rep(i,l,pos[l]*block)if(b[i]<l)ans++; rep(i,(pos[r]-1)*block+1,r)if(b[i]<l)ans++; rep(i,pos[l]+1,pos[r]-1)ans+=find(i,l); return ans; } int main(){//freopen("in.in","r",stdin); scanf("%d%d",&n,&q); block=sqrt(n); m=n/block+(n%block ? 1 : 0); rep(i,1,n){scanf("%d",&c[i]);pos[i]=(i-1)/block+1;} rep(i,1,n){b[i]=last[c[i]];last[c[i]]=i;} rep(i,1,m)reset(i); int l,r; rep(i,1,q){ scanf("%s%d%d%d",s,&l,&r); if(s[0]=='R')change(l,r); else printf("%d\n",ask(l,r)); } }
相关文章推荐
- 关于java,tomcat直连mySql,Sqlserver数据库
- Linux_ pipe 匿名管道 浅解
- Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
- 开放搜索服务OpenSearch
- Linux_信号操作 demo
- linux下的hugepage
- 文章标题
- Linux_信号操作
- Linux Socket 原始套接字编程
- 硬链接和软连接
- ./spark-submit --class Test --master spark://localhost:7077 /usr/local/aa.jar
- 登录式shell的执行顺序及简单应用
- Linux学习笔记7
- hadoop入门教程-程序小实例
- shell 之 bash 与sh 区别
- Linux平台RTL8188CUS驱动移植及测试
- 新建maven库时,提示Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart:RELEA
- linux下mysql5.6 rpm包安装
- hadoop入门教程-核心组件MR
- tomcat 配置环境变量