题目

题目链接

题意

给你一个数列代表不同的颜色(可以修改)。
询问一段区间内有多少种颜色。

题解

很容易想到的就是线段树来维护bitset。

这里为了练习,使用分块维护bitset。

* 事实上线段树可以看成是无限分块。*

修改的时候直接暴力将被修改位置所在的块重新计算,形成新的bitset。

查询的时候,直接按块合并bitset即可。

注意细节:由于bitset不能开太大,因此有必要将给出的颜色进行离散化。

我采用的方法是使用unordered_map进行离散化,简单易行。

代码

#include <unordered_map>
#include <bits/stdc++.h>
using namespace std;
int n,m,L,R;
int a[10007];
bitset<12007> block[107];
bitset<12007> now;
int Base = 100;
unordered_map<int,int> mpid;
inline int getid(int x){if(mpid.count(x)) return mpid[x];return mpid[x] = mpid.size()+1;
}
int main(){scanf("%d%d",&n,&m);for(int i = 1;i <= n;++i){if(i % Base == 0 && i != 0) {block[i/Base-1] = now;now.reset();}scanf("%d",&a[i]);now.set(getid(a[i]));}block[n/Base] = now;char op;while(m--){scanf(" %c%d%d",&op,&L,&R);if(op == 'Q'){now.reset();for(;L % Base != 0 && L <= R;++L){now.set(getid(a[L]));}for(;(R+1) % Base != 0 && R >= L;--R){now.set(getid(a[R]));}if(L >= R) {printf("%d\n",now.count());continue;}int bl = L / Base,br = R / Base;for(;bl <= br;++bl)now |= block[bl];printf("%d\n",now.count());}else {a[L] = R;int bl = L / Base;block[bl].reset();for(int i = bl*Base;i < (bl+1)*Base;++i)block[bl].set(getid(a[i]));}}
}

洛谷-P1903 数颜色 分块 bitset相关推荐

  1. 洛谷P3939 数颜色 vector乱搞

    洛谷P3939 数颜色 标签 vector乱搞 简明题意 给一个序列(n <= 3e5),现需要你支持两种操作. 询问区间[L,R]中有多少个值为x的数 交换第k和k+1个数 思路 首先,这题需 ...

  2. Bzoj 2453: 维护队列 Bzoj 2120: 数颜色 分块,bitset

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 578  Solved: 247 [Submit][Status][Discus ...

  3. 【洛谷P1255 数楼梯】

    P1255 数楼梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 看上去是个斐波那契数列,其实是高精度计算啦 虽说是个水题,但可以练习一下高精度计算,之前我都是顺序输入,通过指针偏 ...

  4. 洛谷 P1028 数的计算

    递推计算即可 f[1]=1 f[2]=2=f[1]+1 f[3]=2=f[1]+1 f[4]=4=f[1]+f[2]+1 f[5]=4=f[1]+f[2]+1 我的代码(算法借鉴洛谷题解) #incl ...

  5. 洛谷P3247 [HNOI2016]最小公倍数 [分块,并查集]

    洛谷 思路 显然,为了达到这个最小公倍数,只能走\(a,b\)不是很大的边. 即,当前询问的是\(A,B\),那么我们只能走\(a\leq A,b\leq B\)的边. 然而,为了达到这最小公倍数,又 ...

  6. 数颜色(洛谷-P1903)

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  7. 【洛谷P1903】数颜色

    题目大意:给定一个长度为 N 的序列,每个点有一个颜色.现给出 M 个操作,支持单点修改颜色和询问区间颜色数两个操作. 题解:学会了序列带修改的莫队. 莫队本身是不支持修改的.带修该莫队的本质也是对询 ...

  8. 洛谷 P1903 [国家集训队]数颜色 / 维护队列

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  9. 洛谷 - P1025 数的划分(计数dp)

    题目链接:点击查看 题目大意:将整数 n 分成 k 份有多少种分法 题目分析:设 dp[ i ][ j ] 为将整数 i 分成 j 份的方案数,拆分整数可以等价为放小球,相当于将 n 个小球放进 k ...

最新文章

  1. AOI检测基本原理与设备构成
  2. Python使用SMTP发送邮件
  3. 深度学习核心技术精讲100篇(一)-数据分析中有哪些分析指标?
  4. 后台接收数组_「面试必备」最新整理出的腾讯C++后台开发面试笔记
  5. Apache Flink Meetup · 上海站,超强数据湖干货等你!
  6. POJ1785(笛卡尔树的构造)
  7. vb for循环 combobox的使用 Print的使用
  8. [Abp vNext 源码分析] - 18. 单元测试
  9. mycat定时向mysql存储数据_【实战演练】Linux操作系统20-MyCat实现Mysql数据库读写分离与自动切换...
  10. (SDL2)SDL在ubuntu下的测试代码(雷霄骅)
  11. 使用CrossApp实现版本更新管理(iOS端给AppStore链接,android端下载apk并替换)
  12. 刷手机坐公交 背后蕴含了什么技术?
  13. 抗击疫情,程序员在家免费学这些!
  14. FamilyParty生态起航,链游版皇室战争Infinite Force打响头炮
  15. The view Myapp.views.welcome didn‘t return an HttpResponse object. It returned None instead.
  16. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java喵星人网站h9p8i
  17. (总结)什么是HTML语义化
  18. 美容美发美甲店做活动效果提升30%的营销方案18个套路
  19. Pass by reference和pass by value区别举例
  20. 编译链接脚本lds文件

热门文章

  1. 混凝土墙开洞_满城混凝土柱子切割资质齐全
  2. python中log1p用法_python中logging模块的基本用法
  3. 7-1 修理牧场 (25 分)(最详解)(最容易理解的解题过程)
  4. A Simple Problem with Integers POJ - 3468(线段树+区间查询+区间修改+建树+懒惰标记模板)+(树状数组)
  5. linux查找应用主机,Linux 主机和服务器基本性能检查命令和工具
  6. java 开源控件_一些好用的开源控件
  7. 支付价格计算中精度问题之double,float
  8. springboot 历史版本文档_乘风破浪,SpringBoot入门
  9. python序列数据类型_Python 数据类型 之 序列类型
  10. 520 钻石争霸赛 7-6 矩阵列平移(循环)