题目: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. [Windows Server 2012] 手工破解MySQL密码

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:破解MySQL ...

  2. 【译】x86程序员手册08 -2.6中断和异常

    2.6 Interrupts and Exceptions 中断和异常 The 80386 has two mechanisms for interrupting program execution: ...

  3. 常见Android安装启动失败问题

    1.INSTALL_FAILED_VERSION_DOWNGRADE版本过低2.Failed to install Funm_AND.apk on device 'QWOJLVR8KNHYA6NR': ...

  4. HDU_1023_Train Problem II_卡特兰数

    Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. Sandbox 沙盒

    In computer security, a sandbox is a security mechanism for separating running programs, usually in ...

  6. day04-交互、格式化输出及基本运算符

    目录 与用户交互 python2和python3交互的区别 格式化输出 1 字符串拼接 2 占位符 3 format格式 4 f-string格式 基本运算符 算术运算符 比较运算符 赋值运算符 逻辑 ...

  7. pymysql连接数据库

    一.pymysql的相关参数及方法 1.pymysql.connect()参数说明:(连接数据库时需要添加的参数) 参数 类型 描述 host str MySQL服务器地址,IP地址或域名 port ...

  8. 数字化婚姻配对尝试问题(C++实现)

    问题描述:一.标题: 数字化婚姻配对尝试 二.题目: 建立一个模型,来模拟推导社会男女择偶过程. 为了模型简化,一个人的特性指标有三个,这里假设为财富.样貌.品格,每个指标均可取值1-100之间任意数 ...

  9. CF1148D-Dirty Deeds Done Dirt Cheap

    这轮CF怎么充满了替身啊233(这是场只有替身使者才能看见的比赛) 题解可以看官方的 这里就是记录下自己当初是怎么没做上的233 忽视掉了分类后pair本身就会带有的性质(a<b or a> ...

  10. Sessions共享技术设计

    概述 分布式session是实现分布式部署的前提, 当前项目由于历史原因未实现分布式session, 但是由于在kubernets中部署多个pod时, 负载均衡的调用链太长, 导致会话不能保持, 所以 ...