LOJ#6284. 数列分块入门 8
分块的时候开一个数组标记这个区间是不是都是一样颜色的部分,如果是的话,我后面的查询,更新部分就可以直接整块操作,对于不是不全部都一样颜色的块在具体进到快里面去暴力。
在更新的时候对边上的两个不完整的块,先暴力把这个地方的标记下推下去,然后我在给它重新标记
#include<map> #include<set> #include<ctime> #include<cmath> #include<stack> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define first fi #define second se #define lowbit(x) (x & (-x))typedef unsigned long long int ull; typedef long long int ll; const double pi = 4.0*atan(1.0); const int inf = 0x3f3f3f3f; const int maxn = 100005; const int maxm = 100000; const int mod = 10007; using namespace std;int n, m, tol, T; int block; int a[maxn]; int add[maxn]; bool vis[maxn]; int belong[maxn];void init() {memset(a, 0, sizeof a);memset(add, 0, sizeof add);memset(vis, false, sizeof vis);memset(belong, 0, sizeof belong); }int L(int x) {return (x-1)*block + 1; }int R(int x) {return min(n, x*block); }void update(int l, int r, int c) {if(vis[belong[l]]) {for(int i=L(belong[l]); i<=R(belong[l]); i++) a[i] = add[belong[i]];vis[belong[l]] = false;}for(int i=l; i<=min(r, R(belong[l])); i++) a[i] = c;if(belong[l] == belong[r]) return ;if(belong[l] != belong[r]) {if(vis[belong[r]]) {for(int i=L(belong[r]); i<=R(belong[r]); i++) a[i] = add[belong[i]];vis[belong[r]] = false;}for(int i=L(belong[r]); i<=r; i++) a[i] = c;}for(int i=belong[l]+1; i<belong[r]; i++) {add[i] = c;vis[i] = true;} }int query(int l, int r, int c) {int ans = 0;if(vis[belong[l]]) {if(add[belong[l]] == c) ans += min(R(belong[l]), r) - l + 1;} else {for(int i=l; i<=min(R(belong[l]), r); i++) ans += (a[i]==c);}if(belong[l] == belong[r]) return ans;if(belong[l] != belong[r]) {if(vis[belong[r]]) {if(add[belong[r]] == c) ans += r - L(belong[r]) + 1;} else {for(int i=L(belong[r]); i<=r; i++) ans += (a[i] == c);}}for(int i=belong[l]+1; i<belong[r]; i++) {if(vis[i]) {if(add[i] == c) ans += R(i) - L(i) + 1;} else {for(int j=L(i); j<=R(i); j++) {ans += (a[j] == c);}}}return ans; }int main() {while(~scanf("%d", &n)) {init();block = sqrt(n);for(int i=1; i<=n; i++) {scanf("%d", &a[i]);belong[i] = (i-1) / block + 1;}m = n;while(m--) {int l, r, c;scanf("%d%d%d", &l, &r, &c);int ans = query(l, r, c);update(l, r, c);printf("%d\n", ans);}}return 0; }
View Code
转载于:https://www.cnblogs.com/Jiaaaaaaaqi/p/9377911.html
LOJ#6284. 数列分块入门 8相关推荐
- LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)
#6280. 数列分块入门 4 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 题目描述 给出一个长为 ...
- LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))...
#6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3 题目描述 给出一 ...
- LOJ——#6277. 数列分块入门 1
~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法--分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...
- LOJ#6281. 数列分块入门 5
内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 1 测试数据 题目描述 给出一个长为 nnn 的数列,以及 n ...
- loj #6278. 数列分块入门 2
题目 题解 区间修改,询问区间小于c的个数.分块排序,用vector.至于那个块的大小,好像要用到均值不等式 我不太会...就开始一个个试,发现siz=sqrt(n)/4时最快!!!明天去学一下算分块 ...
- LOJ#6282. 数列分块入门 6
一个动态的插入过程,还需要带有查询操作. 我可以把区间先分块,然后每个块块用vector来维护它的插入和查询操作,但是如果我现在这个块里的vector太大了,我可能的操作会变的太大,所以这时候我需要把 ...
- LOJ#6283. 数列分块入门 7
内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论测试数据 题目描述 给出一个长为 nnn 的数列,以及 nnn ...
- LOJ 6281 数列分块入门 5
Loj_6281 自己写分块时总是对于一个块内的修改写错 wa了好几次 自我感觉对于块内修改的操作,再封装一个函数是很方便的 #include <iostream> #include &l ...
- 【分块】#6284. 数列分块入门 8(区间赋值为相同的值,查询区间某值个数)
整理的算法模板合集: ACM模板 题目传送门 碎块必须每次都遍历一遍,整块打标记 这里开始我们O(n)遍历一遍打标记,当一个整块被打满标记以后(会变成相同的数字),就是O(1)查询,均摊时间复杂度为O ...
最新文章
- 不要网上乱拷贝代码了!一段网上找的代码突然炸了!
- 是时候取消Sprint评审会议了吗?
- 60条令你大吃一惊的小常识,很有用
- 分享Kali Linux 2016.2第36周镜像虚拟机
- 每天一个linux命令(20):find命令之exec
- GRE核心词汇助记与精练-List10感觉,感情
- Boost.python 编译和使用
- MOCTF-Web-暴跳老板*
- 查看win10版本方法,及win10升级方法
- 面试题3:二维数组查找
- 一个c++程序员一年前的生活笔记
- 比较字符串是否相同,比较大小
- spring cloud构建互联网分布式微服务云平台-Spring Cloud Commons 普通抽象
- [转载]HTTP的幂等性
- 【2019银川网络赛D:】Take Your Seat(概率--递推+思维)
- iOS 视频播放器小屏和全屏切换
- 苹果手机有护眼模式吗_玩手机还能护眼?用这 2 款 App,可能比开深色模式更有效...
- ie input兼容 vue_vue+iview 兼容IE11浏览器的实现方法
- 清除90天苹果充值记录_苹果内购退款2020千万要知道的技巧,不得不看!
- MySQL 基础 -- MySQL 数据类型说明(数值类型、字符串类型、日期时间类型)、SQL通用语法和SQL分类
热门文章
- three.js 求两个vector3 的夹角_初中数学:动点问题-阿氏圆最值模型(2),求PD-1/2PC的最大值...
- python访问共享文件夹_python – 通过linux机器打开Windows共享文件夹
- java merge_java – OptimisticLockException当使用JPA merge()
- python operator 多属性排序_Python爬取高颜值美女(爬虫+人脸检测+颜值检测)你能打几分?...
- linux内核实现ipsec,基于IPv6的IPSec原理分析和在Linux内核中的实现
- mysql要将语句反复执行15次_MySQL多表查询疑问
- phpstorm 全项目替换_会信息交互还带5G基站的路灯来了!白云新城智慧灯杆项目动工...
- html 转盘游戏开发,【scratch】简单的大转盘小游戏
- STM8单片机ADC连续采样模式
- 第一个JavaWeb项目——教室预约系统