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< ...
随机推荐
- JS——锚点的运用
锚点的两种形式: 1.<a href="#a">点击到锚点</a> 2.window.location.hash = "#a"; 最后都 ...
- 如何用java生成随机验证码
1.VerifyCode 类: 1 package com.HRuinger.enity; ImageIO.write(image, " ...
- Java_Web三大框架之Hibernate配置文件(二)
下面介绍一下编写Hibernate的配置文件,使用Hibernate操作数据库. 开始部署:下载需要的jar包 下载Hibernate Hibernat ...
- C#调用Win32 api时的内存操作
一般情况下,C#与Win 32 Api的互操作都表现的很一致:值类型传递结构体,一维.二维指针传递IntPtr.在Win32 分配内存时,可以通过IntPtr以类似移动指针的方式读取内存.通过IntP ...
- day08-字符编码
目录 计算机基础 启动应用程序 写文本的流程 Python解释器执行文件的原理 Python解释器与文本编辑器的区别 字符编码 字符编码发生在哪三个阶段 字符编码发展史与分类 总结 Python2与P ...
- SQL With As 用法Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
Sql 四大排名函数(ROW_NUMBER.RANK.DENSE_RANK.NTILE)简介 排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别.我们新建一张O ...
- C# DataTable扩展方法
在日常搬砖中,总结了一些简单的扩展方法. public static bool IsNullOrEmpty(this DataTable dt) { ; } public static bool Is ...
- Uedior上传大文件超时报错
出错原因: 1.php超时等待时间太短 2.uedior中设置了请求超时,提示信息: 上传失败,请重试 先解决第一个问题: 设置php.ini中的max_execution_time 为0 (意思是h ...
- Python学习【第3篇】:Python之运算符
一.运算符 计算机可以进行的运算有很多种,不只是加减乘除,它和我们人脑一样,也可以做很多运算. 种类:算术运算,比较运算,逻辑运算,赋值运算,成员运算,身份运算,位运算,今天我们先了解前四个. 算术运 ...
- golang实现高阶函数之map
package main import "fmt" func iMap(num []int, f func(a int) int) []int{ var r []int for _ ...