题意

给出n个数字和m个操作。操作有两种。1:查询区间[l,r]内不同种类得数字个数。2: 将下标为p得数字修改为v

分析

如果不是修改操作的话,用莫队贼简单就可以水过,但是因为带了修改就有一些麻烦了。

分块

 开一个数组pre[i]记录上一个和第i个元素相同元素得位置。那么对于区间[l,r],当pre[i]<l的时候,ans++。完整块内就可以直接二分查找,不完整块直接暴力。修改是直接暴力修改因为它保证修改操作不会超过1000次。

下面是代码

  

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
const int maxn=+;
int a[maxn],belong[maxn],L[maxn],R[maxn],pre[maxn];
int last[+],b[maxn]; int n,m,cnt,block;
void update(int p,int v){
for(int i=;i<=n;i++)
last[a[i]]=;
a[p]=v;
for(int i=;i<=n;i++){
b[i]=last[a[i]];
last[a[i]]=i;
}
for(int i=;i<=cnt;i++){
for(int j=L[i];j<=R[i];j++)
pre[j]=b[j];
sort(pre+L[i],pre+R[i]+);
}
}
int Find(int p,int v){
int res=;
int l=L[p],r=R[p];
while(l<=r){
int m=l+(r-l)/;
if(pre[m]<v){
res=m;
l=m+;
}else{
r=m-;
}
}
return res-L[p]+;
} int query(int l,int r){
int res=;
if(belong[l]==belong[r]){
for(int i=l;i<=r;i++){
if(b[i]<l)
res++;
}
return res;
}
for(int i=l;i<=R[belong[l]];i++)
if(b[i]<l)
res++; for(int i=L[belong[r]];i<=r;i++)
if(b[i]<l)
res++; for(int i=belong[l]+;i<belong[r];i++){
res+=Find(i,l);
}
return res;
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
b[i]=last[a[i]];
last[a[i]]=i;
}
block=sqrt(n);cnt=n/block;
if(n%block)cnt++;
for(int i=;i<=n;i++)
belong[i]=(i-)/block+;
for(int i=;i<=cnt;i++)
L[i]=(i-)*block+,R[i]=i*block;
R[cnt]=n; for(int i=;i<=cnt;i++){
for(int j=L[i];j<=R[i];j++)
pre[j]=b[j];
sort(pre+L[i],pre+R[i]+);
}
char c;
int l,r;
for(int i=;i<=m;i++){
scanf(" %c",&c);
if(c=='Q'){
scanf("%d%d",&l,&r);
printf("%d\n",query(l,r));
}else{
scanf("%d%d",&l,&r);
update(l,r);
}
}
return ;
}

莫队

  对于莫队来说,难点就在于它带有修改操作。我们怎么来处理修改呢?我们在除了l,r指针以外再增加一个指针now,用类似l和r得方式进行维护。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath> using namespace std;
const int maxn=+;
int belong[maxn],val[maxn];
struct Node{
int L,R,id,tim;
bool operator<(const Node& rhs)const{
return belong[L]==belong[rhs.L]?(belong[R]==belong[rhs.R]?tim<rhs.tim:R<rhs.R):L<rhs.L;
}
int ans;
}ask[maxn];
struct Up{
int p,v,z;
}up[maxn];
int num1,num2;
int cmp(Node a,Node b){
return a.id<b.id;
}
int n,q;
int f[+],ans,block,l,r,now;
void update(int p,int addv){
if(addv>){
f[val[p]]++;
if(f[val[p]]==)
ans++;
}else{
f[val[p]]--;
if(f[val[p]]==)
ans--;
}
}
void in_time(int x){
if(up[x].p>=l&&up[x].p<=r){
update(up[x].p,-);
}
up[x].z=val[up[x].p];
val[up[x].p]=up[x].v;
if(up[x].p>=l&&up[x].p<=r){
update(up[x].p,);
}
}
void out_time(int x){
if(up[x].p>=l&&up[x].p<=r)
update(up[x].p,-);
val[up[x].p]=up[x].z;
if(up[x].p>=l&&up[x].p<=r)
update(up[x].p,);
} void solve(){
l=,r=,now=;
for(int i=;i<=num1;i++){
if(r<ask[i].R){
for(r=r+;r<ask[i].R;r++)
update(r,);
update(r,);
}
if(l>ask[i].L){
for(l=l-;l>ask[i].L;l--)
update(l,);
update(l,);
}
if(r>ask[i].R){
for(;r>ask[i].R;r--)
update(r,-);
}
if(l<ask[i].L){
for(;l<ask[i].L;l++)
update(l,-);
}
if(now<ask[i].tim){
for(now=now+;now<ask[i].tim;now++)
in_time(now);
in_time(now);
}
if(now>ask[i].tim){
for(;now>ask[i].tim;now--)
out_time(now);
}
ask[i].ans=ans;
}
} int main(){
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++){
scanf("%d",&val[i]);
}
block=sqrt(n);
for(int i=;i<=n;i++)
belong[i]=(i-)/block+;
char c;
int l,r;
for(int i=;i<=q;i++){
scanf(" %c",&c);
if(c=='Q'){
num1++;
scanf("%d%d",&ask[num1].L,&ask[num1].R);
ask[num1].id=num1;ask[num1].tim=num2;
}else{
num2++;
scanf("%d%d",&up[num2].p,&up[num2].v);
up[num2].z=;
}
}
sort(ask+,ask++num1);
solve();
sort(ask+,ask++num1,cmp);
for(int i=;i<=num1;i++)
printf("%d\n",ask[i].ans); return ;
}

【BZOJ 2120】数颜色【分块/莫队】的更多相关文章

  1. BZOJ 2120: 数颜色 分块

    2120: 数颜色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...

  2. Bzoj 2453: 维护队列 && Bzoj 2120: 数颜色 分块,bitset

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 578  Solved: 247[Submit][Status][Discuss] ...

  3. BZOJ 2120 数颜色(带修改的莫队)

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MB Submit: 3478  Solved: 1342 [Submit][Status][Discus ...

  4. Bzoj 2120: 数颜色 && 2453: 维护队列 莫队,分块,bitset

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 2645  Solved: 1039[Submit][Status][Discuss] ...

  5. BZOJ 2120 数颜色 (带修莫队)

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 6367  Solved: 2537[Submit][Status][Discuss] ...

  6. BZOJ 2120 数颜色 【带修改莫队】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 2120: 数颜色 Time Limit: 6 Sec  Memory Limit: ...

  7. BZOJ 2120: 数颜色

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 3623  Solved: 1396[Submit][Status][Discuss] ...

  8. bzoj 2120 数颜色 题解

    转载请注明:http://blog.csdn.net/jiangshibiao/article/details/23990489 [原题] 2120: 数颜色 Time Limit: 6 Sec  M ...

  9. bzoj 2120 数颜色 (带修莫队)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间  l - r  内颜色的种类 ,R 单点修改 思路 ...

  10. BZOJ 2120 数颜色(带修改莫队)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2120 [题目大意] 给出一颜色序列,每次可以修改一个位置的颜色或者询问一个区间不同颜色 ...

随机推荐

  1. Cascalog了解

    Cascalog一种能使在Hadoop上使用Clojure处理数据变得简单直观的工具. Cascalog综合了两大顶尖技术:Clojure和Hadoop,同时让Datalog焕发青春. Cascalo ...

  2. Discuz! X2.5RC 全新安装图文教程

    http://www.discuz.net/thread-2660015-1-1.html 一步步教你利用Discuz X2.5建设论坛视频教程(174集) http://down.51cto.com ...

  3. centos6.6升级安装MySQL5.5(2015/3/4)

    使用系统CentOS 6.6本来已经系统自带安装了mysql 5.1,但是奈何5.1不支持utf8mb4字符集(详见:http://blog.csdn.net/shootyou/article/det ...

  4. C# datatable竖行转换的问题

    这次在做项目中,遇到了这样一个问题:datable中列头的名字是不确定的,从数据库中动态查出来的,假设为typeDATA,行的数据中又包含了列头的信息,并按固定的字段分组,当查处行的数据之后用来填充每 ...

  5. Asp.net Mvc 过滤器执行顺序

    Asp.net Mvc 过滤器执行顺序: IAuthorizationFilter(OnAuthorization)----->IActionFilter(OnActionExecuting)- ...

  6. cocos2d-x的popScene的动画效果

    找到CCDirector.h,找到void popScene(); 在下面加上一段类模板 template <class T> void popSceneWithTransition(fl ...

  7. CXF+Spring搭建webservice服务

    Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS .这些 Services 可以支持多 ...

  8. apktool重新打包错误

    E:\apktool-install-windows-r05-ibot\apktool-install-windows-r05-ibot\.\test_apk_name\res\layout-larg ...

  9. css loading 效果

    .loading{ width:160px; height:56px; position: absolute; top:50%; left:50%; line-height:56px; color:# ...

  10. url携带的参数获取并处理demo

    url demo: http://servername/webname/pagename.csp?paramName=paramValue&paramName2=paramName2& ...