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< ...
随机推荐
- Object未定义
js加载时会在jquery中报Object未定义的错误? 原因: 页面和iframe页面中都引入了jquery 或者 是页面中包含iframe,并且在iframe没有完成加载前操作了iframe中的j ...
- 【转载】HTTP 响应头与状态码
原文地址:https://segmentfault.com/a/1190000006689786 HTTP Response Header 响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描 ...
- THREE.DecalGeometry(转载)
function getDecalGeometry(position, direction){ var decalGeometry = new THREE.DecalGeometry( earthMe ...
- python基础--字符串操作、列表、元组、文件操作
一.变量及条件判断 1.字符串.布尔类型.float.int类型,None都是不可变变量 2.字符串是不可变变量,不可变变量就是指定义之后不能修改它的值 3.count +=1和count=count ...
- day09-文件的操作
目录 文件的基本操作 文件 什么是文件 如何使用文件 打开&关闭文件 打开&关闭文件 del f和f.close()的区别 文件路径 打开模式(不写默认是r) 编码格式 补充(open ...
- Vue项目优化首屏加载速度
Vue项目部署上线后经常会发现首屏加载的速度特别慢:那么有那写能做的简单优化呢 一.路由的懒加载 路由懒加载也就是 把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件. 结合 ...
- spine骨骼动画组件使用详解
1. spine骨骼动画工具 骨骼动画: 把动画打散, 通过工具,调骨骼的运动等来形成动画spine是一个非常流行的2D骨骼动画制作工具spine 动画美术人员导出3个文件: (1) .png文 ...
- nodejs 文件操作模块 fs
const fs=require("fs"); //文件操作 //创建目录 ./ 代表当前目录 ../ 代表上级目录fs.mkdir('./test',function(err){ ...
- js 简单小知识
1. javascript的typeof返回哪些数据类型: string, boolean, number, undefined, function, object 2. split() join() ...
- Quartz.NET 定时任务使用
class Program { static void Main(string[] args) { StartJob(); Console.ReadKey(); } static void Start ...