【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2120

【题目大意】

  给出一颜色序列,每次可以修改一个位置的颜色或者询问一个区间不同颜色的数目。

【题解】

  我们按照最近一次修改对查询操作进行时间标号,在莫队排序的时候引入时间作为第三维,
  对于每个修改操作,我们记录修改之前的颜色和修改之后的颜色,
  对于两个相邻两个查询,我们将其之间时间差距的修改操作进行记录或者撤销之后查询即可。

【代码】

#include <cstdio>
#include <algorithm>
#include <cmath>
const int N=1000010;
using namespace std;
int Ans,ans[N],pos[N],c[N],pre[N],sz,cnt,n,m,limit;
struct Q{
int l,r,id,t;
friend bool operator < (const Q &a,const Q &b){
if(pos[a.l]!=pos[b.l])return pos[a.l]<pos[b.l];
if(a.r!=b.r)return a.r<b.r;
return a.t<b.t;
}
}ask[N];
struct update{int pos,c,pre;}w[N];
int in[N],num[N];
void cal(int x){
if(in[x]){if(!--num[c[x]])Ans--;}
else{if(++num[c[x]]==1)Ans++;}
in[x]^=1;
}
void update(int x,int y){
if(in[x]){cal(x);c[x]=y;cal(x);}
else c[x]=y;
}
int main(){
while(~scanf("%d%d",&n,&m)){
int limit=sqrt(n);
for(int i=1;i<=n;i++)scanf("%d",&c[i]),pre[i]=c[i],pos[i]=(i-1)/limit+1,in[i]=0;
cnt=sz=Ans=0;
for(int i=1;i<=m;i++){
char op[10]; scanf("%s",op);
int x,y; scanf("%d%d",&x,&y);
if(op[0]=='R'){w[++cnt].pos=x;w[cnt].c=y;w[cnt].pre=pre[x];pre[x]=y;}
else{ask[++sz].l=x;ask[sz].r=y;ask[sz].id=sz;ask[sz].t=cnt;}
}sort(ask+1,ask+sz+1);
int l,r; cal(l=r=1);
for(int i=1;i<=sz;i++){
for(int j=ask[i-1].t+1;j<=ask[i].t;j++)update(w[j].pos,w[j].c);
for(int j=ask[i-1].t;j>ask[i].t;j--)update(w[j].pos,w[j].pre);
while(l<ask[i].l)cal(l++);
while(l>ask[i].l)cal(--l);
while(r<ask[i].r)cal(++r);
while(r>ask[i].r)cal(r--);
ans[ask[i].id]=Ans;
}for(int i=1;i<=sz;i++)printf("%d\n",ans[i]);
}return 0;
}

BZOJ 2120 数颜色(带修改莫队)的更多相关文章

  1. bzoj 2120 数颜色 带修改莫队

    带修改莫队,每次查询前调整修改 #include<cstdio> #include<iostream> #include<cstring> #include< ...

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

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

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

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

  4. BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]

    BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...

  5. BZOJ2120数颜色(带修改莫队)

    莫队算法是一种数据结构的根号复杂度替代品,主要应用在询问[l,r]到询问[l+1,r]和[l,r+1]这两个插入和删除操作复杂度都较低的情况下.具体思想是:如果把一个询问[l,r]看做平面上的点(l, ...

  6. BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...

  7. Luogu P1903 BZOJ 2120 数颜色 带修改的莫队

    https://www.luogu.org/problemnew/show/P1903 之前切过这道题,复习莫队再切一遍,不过我之前写的是主席树和树状数组,也不知道我当时怎么想的…… 这个题卡常我没写 ...

  8. P1903 [国家集训队]数颜色 (带修改莫队)

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  9. P1903 [国家集训队]数颜色 带修改莫队板子

    大概就是要多加一维time 然后按照(l的块,r的块,time)为关键字排序 转移区间修改还是按照莫队的方式(每个修改要记修改前后的状态) 然后玄学dalao告诉窝块大小设为\(O(n^{\frac{ ...

  10. [国家集训队][bzoj2120] 数颜色 [带修改莫队]

    题面: 传送门 思路: 这道题和SDOI2009的HH的项链很像,只是多了一个修改 模板套上去呀 莫队学习请戳这里:莫队 Code: #include<iostream> #include ...

随机推荐

  1. R、Python、Scala和Java,到底该使用哪一种大数据编程语言?

    有一个大数据项目,你知道问题领域(problem domain),也知道使用什么基础设施,甚至可能已决定使用哪种框架来处理所有这些数据,但是有一个决定迟迟未能做出:我该选择哪种语言?(或者可能更有针对 ...

  2. ASP.NET 简单鼠标右键效果contextmenutrip

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...

  3. 空间数据库系列二:空间索引S2与Z3分析对比

    S2与Z3对比分析 1. S2 2. Geohash 3. Geomesa Z3 4. S2对比geohash 4.1. geohash存在的问题 4.2. S2优势 4.3. 实际对比例子 5. 测 ...

  4. uboot makefile构建分析

    前言 几年前分析过uboot的构建及启动过程,做了笔记,但最终没有转为文章.这次又有机会开发嵌入式产品了(之前一年多都是在搞x86 linux),看了下uboot的构建过程,觉得有必要写下整个分析过程 ...

  5. 使用 Visual Studio 部署 .NET Core 应用 ——.Net Core 部署到Ubuntu 16.04

    .Net Core 部署到Ubuntu 16.04 中的步骤 1.安装工具 1.apache 2..Net Core(dotnet-sdk-2.0) 3.Supervisor(进程管理工具,目的是服务 ...

  6. .NET Core 2.0.5安装具体步骤

    .NET Core 2.0.5 comprises: .NET Core Runtime 2.0.5 .NET Core SDK 2.1.4   SDK Installer SDK Binaries ...

  7. java 执行 class

    run.sh: #!/bin/bash CLASSPATH=. for jar in *.jar; do CLASSPATH=$CLASSPATH:$jardone CACHE_FILE=`pwd`/ ...

  8. C++编译常见错误

    error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To di ...

  9. python mock的简单使用

    参考文章: http://blog.csdn.net/wenph2008/article/details/46862771 内容待填充...

  10. AC日记——天天爱跑步 洛谷 P1600

    天天爱跑步 思路: 树上差分+分层动态线段树: (伏地膜,跪烂xxy) 代码: #include <bits/stdc++.h> using namespace std; #define ...