题目: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. 【PostgreSQL-9.6.3】事件触发器

    当预定的事件发生时,事件触发器就会被触发.由于事件触发器设计的权限比较大,所以只有超级用户才能创建和修改触发器. 1. 事件触发器支持的事件分三类:ddl_command_start, ddl_com ...

  2. JS高级——apply与call

    上下文调用模式 可以修改this的值,也就是可以修改函数的调用方式,apply.call可以修改函数调用上下文,也就是this的值 <script> var name = "莱昂 ...

  3. CSS——滑动门

    在背景图片中可以对图片进行圆角设置,但是这样是写死的.如下图: 情况分析:如果我们li标签中的文字变少了或者变多了,我们就需要重新定义背景图片.所以我们使用滑动门技术.它将图片特殊地方进行分割.宽度利 ...

  4. java web项目和java项目的区别(看清IDE本质)

    想必大家在使用MyEclipse时对这两个概念不去深究.只知道是Java EE类的基本都是Web项目,而Java应用程序就是Java项目.而且很多人都愿意使用MyEclipse作为开发工具,且不说大家 ...

  5. MyBatis入门3_mapper.xml优化(parameterType简写_NameSpace简写_sql片段_特殊字符处理)_动态SQL

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 优化 1.起别名(一般不用,写全方便查看类出处) 以前 ...

  6. =new、=null、.clear()、system.gc()的区别

    开发经验告诉我 = new是指向另一个地址空间 =null对象被回收 .clear()对象被清空,但是仍然指向原来的地址空间 这三种方式都并没有真正的清理内存 只有system.gc()是直接清理,但 ...

  7. Python 之pygame飞机游戏

    import pygame from pygame.locals import * import time import random # 我机 class HeroPlane(object): de ...

  8. golang bytes 包

    类型 []byte 的切片十分常见,Go 语言有一个 bytes 包专门用来解决这种类型的操作方法. bytes 包和字符串包十分类似.而且它还包含一个十分有用的类型 Buffer: import & ...

  9. IO文件读取

    /** *按字节读取文件 */@Testpublic void readerByte() { File file = new File("D:\\BindCheckControllerTes ...

  10. 图表实现基于SVG或Canvas

    Highcharts 基于SVG,方便自己定制,但图表类型有限. Echarts 基于Canvas,适用于数据量比较大的情况. D3.v3 基于SVG,方便自己定制:D3.v4支持Canvas+SVG ...