洛谷-P1903 数颜色 分块 bitset
题目
题目链接
题意
给你一个数列代表不同的颜色(可以修改)。
询问一段区间内有多少种颜色。
题解
很容易想到的就是线段树来维护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相关推荐
- 洛谷P3939 数颜色 vector乱搞
洛谷P3939 数颜色 标签 vector乱搞 简明题意 给一个序列(n <= 3e5),现需要你支持两种操作. 询问区间[L,R]中有多少个值为x的数 交换第k和k+1个数 思路 首先,这题需 ...
- Bzoj 2453: 维护队列 Bzoj 2120: 数颜色 分块,bitset
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 578 Solved: 247 [Submit][Status][Discus ...
- 【洛谷P1255 数楼梯】
P1255 数楼梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 看上去是个斐波那契数列,其实是高精度计算啦 虽说是个水题,但可以练习一下高精度计算,之前我都是顺序输入,通过指针偏 ...
- 洛谷 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 ...
- 洛谷P3247 [HNOI2016]最小公倍数 [分块,并查集]
洛谷 思路 显然,为了达到这个最小公倍数,只能走\(a,b\)不是很大的边. 即,当前询问的是\(A,B\),那么我们只能走\(a\leq A,b\leq B\)的边. 然而,为了达到这最小公倍数,又 ...
- 数颜色(洛谷-P1903)
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- 【洛谷P1903】数颜色
题目大意:给定一个长度为 N 的序列,每个点有一个颜色.现给出 M 个操作,支持单点修改颜色和询问区间颜色数两个操作. 题解:学会了序列带修改的莫队. 莫队本身是不支持修改的.带修该莫队的本质也是对询 ...
- 洛谷 P1903 [国家集训队]数颜色 / 维护队列
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- 洛谷 - P1025 数的划分(计数dp)
题目链接:点击查看 题目大意:将整数 n 分成 k 份有多少种分法 题目分析:设 dp[ i ][ j ] 为将整数 i 分成 j 份的方案数,拆分整数可以等价为放小球,相当于将 n 个小球放进 k ...
最新文章
- AOI检测基本原理与设备构成
- Python使用SMTP发送邮件
- 深度学习核心技术精讲100篇(一)-数据分析中有哪些分析指标?
- 后台接收数组_「面试必备」最新整理出的腾讯C++后台开发面试笔记
- Apache Flink Meetup · 上海站,超强数据湖干货等你!
- POJ1785(笛卡尔树的构造)
- vb for循环 combobox的使用 Print的使用
- [Abp vNext 源码分析] - 18. 单元测试
- mycat定时向mysql存储数据_【实战演练】Linux操作系统20-MyCat实现Mysql数据库读写分离与自动切换...
- (SDL2)SDL在ubuntu下的测试代码(雷霄骅)
- 使用CrossApp实现版本更新管理(iOS端给AppStore链接,android端下载apk并替换)
- 刷手机坐公交 背后蕴含了什么技术?
- 抗击疫情,程序员在家免费学这些!
- FamilyParty生态起航,链游版皇室战争Infinite Force打响头炮
- The view Myapp.views.welcome didn‘t return an HttpResponse object. It returned None instead.
- 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java喵星人网站h9p8i
- (总结)什么是HTML语义化
- 美容美发美甲店做活动效果提升30%的营销方案18个套路
- Pass by reference和pass by value区别举例
- 编译链接脚本lds文件
热门文章
- 混凝土墙开洞_满城混凝土柱子切割资质齐全
- python中log1p用法_python中logging模块的基本用法
- 7-1 修理牧场 (25 分)(最详解)(最容易理解的解题过程)
- A Simple Problem with Integers POJ - 3468(线段树+区间查询+区间修改+建树+懒惰标记模板)+(树状数组)
- linux查找应用主机,Linux 主机和服务器基本性能检查命令和工具
- java 开源控件_一些好用的开源控件
- 支付价格计算中精度问题之double,float
- springboot 历史版本文档_乘风破浪,SpringBoot入门
- python序列数据类型_Python 数据类型 之 序列类型
- 520 钻石争霸赛 7-6 矩阵列平移(循环)