bzoj2120 数颜色——带修莫队
题目: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 数颜色——带修莫队的更多相关文章
- bzoj2120: 数颜色 带修莫队
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...
- BZOJ 2120 数颜色 (带修莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6367 Solved: 2537[Submit][Status][Discuss] ...
- bzoj 2120 数颜色 (带修莫队)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间 l - r 内颜色的种类 ,R 单点修改 思路 ...
- BZOJ2120数颜色(带修改莫队)
莫队算法是一种数据结构的根号复杂度替代品,主要应用在询问[l,r]到询问[l+1,r]和[l,r+1]这两个插入和删除操作复杂度都较低的情况下.具体思想是:如果把一个询问[l,r]看做平面上的点(l, ...
- 【bzoj2120】数颜色 带修莫队
数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画 ...
- [国家集训队][bzoj2120] 数颜色 [带修改莫队]
题面: 传送门 思路: 这道题和SDOI2009的HH的项链很像,只是多了一个修改 模板套上去呀 莫队学习请戳这里:莫队 Code: #include<iostream> #include ...
- BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]
BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...
- NOI模拟 颜色 - 带修莫队/树套树
题意: 一个颜色序列,\(a_1, a_2, ...a_i\)表示第i个的颜色,给出每种颜色的美丽度\(w_i\),定义一段颜色的美丽值为该段颜色的美丽值之和(重复的只计算一次),每次都会修改某个位置 ...
- bzoj 2120 数颜色 带修改莫队
带修改莫队,每次查询前调整修改 #include<cstdio> #include<iostream> #include<cstring> #include< ...
随机推荐
- asp.net MVC 下拉多级联动及编辑
多级联动实现,附源码.当前,部分代码是参与博客园其它网友. 新增,前台代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 ...
- 为什么有些异常throw出去需要在函数头用throws声明,一些就不用
throw new IllegalStateException(".");不用在函数头声明throws IllegalStateExceptionthrow new IOExcep ...
- centos7 安装 PostgreSql
确定你是管理员,然后运行命令: yum -y install postgresql-server postgresql-contrib 初始化数据库 postgresql-setup initdb 启 ...
- JAR包中读取资源文件
我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...
- Java-Class-Miniprogram:com.common.utils.miniprogram.Auth
ylbtech-Java-Class-miniprogram:com.common.utils.miniprogram.Auth 1.返回顶部 1.1. package com.ylbtech.com ...
- kernel-常见参数或宏
kernel-常见参数或宏 get_online_cpus get_online_cpus(); get_online_mems(); kstrdup_const 分配内存 cache_name = ...
- JS对象中,在原型链上找到属性后 最终将值拷贝给原对象 而不是引用
遇到一个面试题 要求写一个函数A,每次进行new操作时候能输出2,3,4,5... new A() // 输出2 new A() // 输出3 new A() // 输出4 function A() ...
- OprenCV学习之路一:将彩色图片转换成灰度图
//将一张彩色图片转成灰度图: //////////////////////////// #include<cv.h> #include<cvaux.h> #include&l ...
- web前端学习总结--CSS
CSS 什么是CSS? CSS 指层叠样式表(Cascading Style Sheets) 样式定义如何显示HTML元素 样式通常存储在样式表中 如何使用CSS 内联方式 样式定义在单个的HTML元 ...
- 7 numpy 傅里叶,提取图片轮廓
任务:提取照片中轮廓 本次处理图片:我的女神之一 江一燕 导入模块: #jyy.show() 会打开本地图片浏览器 使用傅里叶反转 获取实部,舍弃虚部 去除小数部分 将一维数 ...