分块的时候开一个数组标记这个区间是不是都是一样颜色的部分,如果是的话,我后面的查询,更新部分就可以直接整块操作,对于不是不全部都一样颜色的块在具体进到快里面去暴力。

在更新的时候对边上的两个不完整的块,先暴力把这个地方的标记下推下去,然后我在给它重新标记

#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相关推荐

  1. LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)

    #6280. 数列分块入门 4 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 题目描述 给出一个长为 ...

  2. LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))...

    #6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3 题目描述 给出一 ...

  3. LOJ——#6277. 数列分块入门 1

    ~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法--分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...

  4. LOJ#6281. 数列分块入门 5

    内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 1 测试数据 题目描述 给出一个长为 nnn 的数列,以及 n ...

  5. loj #6278. 数列分块入门 2

    题目 题解 区间修改,询问区间小于c的个数.分块排序,用vector.至于那个块的大小,好像要用到均值不等式 我不太会...就开始一个个试,发现siz=sqrt(n)/4时最快!!!明天去学一下算分块 ...

  6. LOJ#6282. 数列分块入门 6

    一个动态的插入过程,还需要带有查询操作. 我可以把区间先分块,然后每个块块用vector来维护它的插入和查询操作,但是如果我现在这个块里的vector太大了,我可能的操作会变的太大,所以这时候我需要把 ...

  7. LOJ#6283. 数列分块入门 7

    内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论测试数据 题目描述 给出一个长为 nnn 的数列,以及 nnn  ...

  8. LOJ 6281 数列分块入门 5

    Loj_6281 自己写分块时总是对于一个块内的修改写错 wa了好几次 自我感觉对于块内修改的操作,再封装一个函数是很方便的 #include <iostream> #include &l ...

  9. 【分块】#6284. 数列分块入门 8(区间赋值为相同的值,查询区间某值个数)

    整理的算法模板合集: ACM模板 题目传送门 碎块必须每次都遍历一遍,整块打标记 这里开始我们O(n)遍历一遍打标记,当一个整块被打满标记以后(会变成相同的数字),就是O(1)查询,均摊时间复杂度为O ...

最新文章

  1. 不要网上乱拷贝代码了!一段网上找的代码突然炸了!
  2. 是时候取消Sprint评审会议了吗?
  3. 60条令你大吃一惊的小常识,很有用
  4. 分享Kali Linux 2016.2第36周镜像虚拟机
  5. 每天一个linux命令(20):find命令之exec
  6. GRE核心词汇助记与精练-List10感觉,感情
  7. Boost.python 编译和使用
  8. MOCTF-Web-暴跳老板*
  9. 查看win10版本方法,及win10升级方法
  10. 面试题3:二维数组查找
  11. 一个c++程序员一年前的生活笔记
  12. 比较字符串是否相同,比较大小
  13. spring cloud构建互联网分布式微服务云平台-Spring Cloud Commons 普通抽象
  14. [转载]HTTP的幂等性
  15. 【2019银川网络赛D:】Take Your Seat(概率--递推+思维)
  16. iOS 视频播放器小屏和全屏切换
  17. 苹果手机有护眼模式吗_玩手机还能护眼?用这 2 款 App,可能比开深色模式更有效...
  18. ie input兼容 vue_vue+iview 兼容IE11浏览器的实现方法
  19. 清除90天苹果充值记录_苹果内购退款2020千万要知道的技巧,不得不看!
  20. MySQL 基础 -- MySQL 数据类型说明(数值类型、字符串类型、日期时间类型)、SQL通用语法和SQL分类

热门文章

  1. three.js 求两个vector3 的夹角_初中数学:动点问题-阿氏圆最值模型(2),求PD-1/2PC的最大值...
  2. python访问共享文件夹_python – 通过linux机器打开Windows共享文件夹
  3. java merge_java – OptimisticLockException当使用JPA merge()
  4. python operator 多属性排序_Python爬取高颜值美女(爬虫+人脸检测+颜值检测)你能打几分?...
  5. linux内核实现ipsec,基于IPv6的IPSec原理分析和在Linux内核中的实现
  6. mysql要将语句反复执行15次_MySQL多表查询疑问
  7. phpstorm 全项目替换_会信息交互还带5G基站的路灯来了!白云新城智慧灯杆项目动工...
  8. html 转盘游戏开发,【scratch】简单的大转盘小游戏
  9. STM8单片机ADC连续采样模式
  10. 第一个JavaWeb项目——教室预约系统