题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2120

带修改的莫队;

用结构体存下修改和询问,排好序保证时间后就全局移动修改即可;

参考了TJ:https://blog.csdn.net/SmallSXJ/article/details/69676746

vis 标记得好精妙啊!这样修改都不用分别改加入和删除了!

还要注意区间的扩展和收缩在循环上有微妙不同,一定不要写错;

所以带修莫队也很简洁嘛!

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int const maxn=1e4+;
int n,m,a[maxn],b[maxn],pos[maxn],res,ans[maxn],base,cnt,tot,num[maxn*];
bool vis[maxn];
struct N{int bh,x,y;}ch[maxn];
struct T{int pre,l,r,id;}q[maxn];
bool cmp(T x,T y){return (pos[x.l]==pos[y.l])?x.r<y.r:pos[x.l]<pos[y.l];}
void change(int p)
{
if(vis[p])
{
num[a[p]]--;
if(num[a[p]]==)res--;
}
else
{
num[a[p]]++;
if(num[a[p]]==)res++;
}
vis[p]^=;
}
void update(int p,int x)//a[p]=x
{
if(vis[p])
{
change(p);
a[p]=x;
change(p);
}
else a[p]=x;
}
void work()
{
int nw=,l=,r=;//
for(int i=;i<=m;i++)
{
// while(nw<=q[i].pre)update(ch[nw].bh,ch[nw].y),nw++;
// while(nw>q[i].pre)update(ch[nw].bh,ch[nw].x),nw--;
// while(l<q[i].l)change(l),l++;
// while(l>q[i].l)change(l),l--;
// while(r<q[i].r)change(r),r++;
// while(r>q[i].r)change(r),r--;
// ans[q[i].id]=res;
for(int j=nw+;j<=q[i].pre;j++)
update(ch[j].bh,ch[j].y);
for(int j=nw;j>q[i].pre;j--)
update(ch[j].bh,ch[j].x);
for(int j=r+;j<=q[i].r;j++) change(j);//注意扩展和收缩的不同!
for(int j=r;j>q[i].r;j--) change(j);
for(int j=l-;j>=q[i].l;j--) change(j);
for(int j=l;j<q[i].l;j++) change(j);
ans[q[i].id]=res;
l=q[i].l,r=q[i].r,nw=q[i].pre;
}
}
int main()
{
scanf("%d%d",&n,&m); base=sqrt(n);
for(int i=;i<=n;i++)
{
pos[i]=(i-)/base+;
scanf("%d",&a[i]); b[i]=a[i];
}
char cc[];
for(int i=,x,y;i<=m;i++)
{
cin>>cc;
scanf("%d%d",&x,&y);
if(cc[]=='R')
{
ch[++tot].bh=x; ch[tot].x=b[x]; ch[tot].y=y;
b[x]=y;
}
else q[++cnt].pre=tot,q[cnt].l=x,q[cnt].r=y,q[cnt].id=cnt;
}
sort(q+,q+m+,cmp);
work();
for(int i=;i<=cnt;i++)printf("%d\n",ans[i]);
return ;
}

bzoj2120 数颜色——带修莫队的更多相关文章

  1. bzoj2120: 数颜色 带修莫队

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

  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数颜色(带修改莫队)

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

  5. 【bzoj2120】数颜色 带修莫队

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

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

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

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

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

  8. NOI模拟 颜色 - 带修莫队/树套树

    题意: 一个颜色序列,\(a_1, a_2, ...a_i\)表示第i个的颜色,给出每种颜色的美丽度\(w_i\),定义一段颜色的美丽值为该段颜色的美丽值之和(重复的只计算一次),每次都会修改某个位置 ...

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

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

随机推荐

  1. Centos6.7 安装Naigos教程

    Centos6.7 安装Naigos教程参考文档:https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/4/en/quickst ...

  2. 错误处理:vmware下克隆centos7配置静态ip地址网卡问题

    vmware下克隆centos7,在配置静态ip地址,重启网卡存在问题,还是mac地址问题 ip addr show 查看下mac地址,配置文件修改下,重启网卡正常了

  3. Power Designer逆向操作(从mysql5.0生成数据库的物理模型)

    Power Designer逆向操作(从mysql5.0生成数据库的物理模型) 环境:powderdesigner12.5:mysql5.0 步骤: 1.  为指定的数据库配置MySQL的ODBC数据 ...

  4. centos 7 配置nginx

    安装nginx: curl -o  nginx.rpm http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0. ...

  5. Node.js之错误处理

    Node.js之错误处理 1. 使用 domain 模块处理错误 try..catch 多用于捕捉同步方法中的抛出错误,但不能用try..catch捕捉异步方法中抛出de错误 如: 1 var htt ...

  6. 【解题报告】洛谷 P1231 教辅的组成

    [解题报告]洛谷 P1231 教辅的组成 题目链接 CSDN链接 这道题就只是一道普通的最大流问题,但是关键所在就是如何构图.要不是我看了题解,真的想不到这个构图方法呢 题目大意我就不写了,自己看好了 ...

  7. java堆排序实现

    代码如下: public class HeapSort { public static void heapSort(DataWrap[] data) { System.out.println(&quo ...

  8. bug的分类和等级

    一.bug的定义 软件的bug,狭义指软件程序的漏洞或缺陷,广义指测试工程师或用户提出的软件可改进的细节.或与需求文档存在差异的功能实现等 对应三个测试目的:(3个为了) 1.为了发现程序的代码或业务 ...

  9. B - Oulipo

    The French author Georges Perec (1936�C1982) once wrote a book, La disparition, without the letter ' ...

  10. java.net.MalformedURLException: unknown protocol: c 这个错一般有两种原因导致: 1、URL协议、格式或者路径错误,

    java.net.MalformedURLException: unknown protocol: c这个错一般有两种原因导致:1.URL协议.格式或者路径错误, 好好检查下你程序中的代码如果是路径问 ...