传送门

文章目录

  • 题意:
  • 思路:

题意:

思路:

乍一看貌似没有什么东西能维护块内同一个数的个数,但是通过第六感可以发现每次操作后区间都会被推成一个数,那么我们分个块,让后块内打个标记,是否就能过了呢?
这个是可以的。
如果初始值全部相同,那么查询的复杂度是n\sqrt nn​的,每次修改最多破坏两头的两个块,所以均摊的复杂度是n\sqrt nn​,即如果想让一个操作复杂度达到O(n)O(n)O(n),那么需要操作O(n)O(\sqrt n)O(n​)次。
所以直接分块暴力即可,注意判断块内的时候需要判断一下是否有标记。

// Problem: #6284. 数列分块入门 8
// Contest: LibreOJ
// URL: https://loj.ac/p/6284
// Memory Limit: 256 MB
// Time Limit: 500 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
int a[N],tag[N];
int id[N],block;void reset(int id) {if(tag[id]==-1) return;int l=(id-1)*block,r=id*block;for(int i=l+1;i<=r;i++) a[i]=tag[id];tag[id]=-1;
}int change(int l,int r,int c) {int ans=0;if(id[l]==id[r]) {reset(id[l]);for(int i=l;i<=r;i++) {ans+=a[i]==c;a[i]=c;}} else {int sl=id[l]*block,sr=(id[r]-1)*block;reset(id[l]); reset(id[r]);for(int i=l;i<=sl;i++) {ans+=a[i]==c;a[i]=c;}for(int i=sr+1;i<=r;i++) {ans+=a[i]==c;a[i]=c;}for(int i=id[l]+1;i<=id[r]-1;i++) {if(tag[i]==-1) {int sl=(i-1)*block,sr=i*block;for(int i=sl+1;i<=sr;i++) ans+=a[i]==c;} else ans+=tag[i]==c? block:0;tag[i]=c;}}return ans;
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);scanf("%d",&n); block=sqrt(n);for(int i=1;i<=n;i++) {scanf("%d",&a[i]);id[i]=(i-1)/block+1;tag[id[i]]=-1;}for(int i=1;i<=n;i++) {int c,l,r; scanf("%d%d%d",&l,&r,&c);printf("%d\n",change(l,r,c));}return 0;
}
/**/

#6284. 数列分块 8 分块相关推荐

  1. LOJ#6284. 数列分块入门 8

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

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

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

  3. #6278. 数列分块 2 分块 + 块内二分

    传送门 文章目录 题意: 思路: 题意: 思路: 真 调一晚上血压上来了. 考虑第一个操作,块内打个标记,其他的暴力查询即可. 考虑第二个操作,讲块内元素排序之后,直接二分查询. 注意修改元素值的时候 ...

  4. 线性结构 —— 分块算法 —— 分块九讲

    模型1:区间加法,单点询问 问题:给出一个长为 n 的数列,以及 n 个操作,操作涉及区间加法,单点查值. 对每个块设置一个加法标记,记录这个块中元素一共加了多少,每次操作对整块直接 O(1) 标记, ...

  5. bzoj3920: Yuuna的礼物(莫队+分块套分块)

    思路挺简单的,但是总感觉好难写...码力还是差劲,最后写出来也挺丑的 这题显然是个莫队题,考虑怎么转移和询问... 根据莫队修改多查询少的特点,一般用修改快查询慢的分块来维护.查第$k_1$小的出现次 ...

  6. [CQOI2017] 小Q的表格(分块 + 整除分块 + 数学 + 前缀和)

    problem luogu-P3700 solution f(a,b)=f(b,a)f(a,b)=f(b,a)f(a,b)=f(b,a) 意味着我们只用考虑半个棋盘的信息. b∗f(a,a+b)=(a ...

  7. python怎么分块,python分块读文件

    一.思路 分块读取文件的所有内容,按块为单位存入到队列中(块的大小=文件的总行数/线程数) 每个线程从队列中读数据(当然单位是原来的块) 如何实现分块读??? 定义一个列表A,该列表存储每一个块的起始 ...

  8. java 代码分块_Java分块传输的思路

    Java分块传输的思路 假设块大小为BLOCK_SIZE. 1.读取大小为BLOCK_SIZE的源文件 2.将数据传输过去 3.再读大小为BLOCK_SIZE的源文件 int MAX_USBFS_BU ...

  9. CF1485C(整除分块+根号分块)

    思路: 推柿子: 那么,最终的答案其实就是. 我们可以先暴力枚举, 对于b >= √x的部分,min(x, b * b + b - 1)一定为x,此时求. 对于,我们套路的处理方法就是,求出块长 ...

最新文章

  1. python二级多少分过_python考级有几个级别
  2. 百分点集团被APAC CIO Outlook杂志评选为亚太区大数据企业25强
  3. hdu1796容斥原理
  4. Angular jasmine单元测试框架spied method的调用记录数据结构
  5. 条款46:需要类型转换的时候请为模板定义非成员函数
  6. 云计算之路-阿里云上:拔云见日的那一刻,热泪盈眶
  7. 最近自学 Asp.net MVC 小总结
  8. 【文末有奖】华为云“网红”语言Python课程来啦!
  9. console_init初始化的研究
  10. 《Head First设计模式》 读书笔记05 工厂模式(二)
  11. 教你如何不登陆复制CSDN代码
  12. C语言经典69题(又易到难)每日更新5道题
  13. css设置单行文本超出部分点点点、多行文本超出部分点点点(两种方法)/解决多行 数字不换行问题。
  14. office 向程序发送命令时出现问题
  15. [ZZ]什么是Google Urchin:了解Urchin与Google Analytics差异
  16. mysql主从配置duxi_DUX主题
  17. mysql 批量查找 in_在数据库查询时解决大量in 关键字的方法
  18. 微信小程序——获取openid
  19. 计算机/微机组成及相关概念
  20. 使用kanzi开发仪表HMI插件

热门文章

  1. 日本第一赘婿!他入赘近20年拿下诺贝尔奖,成名后不忘教光棍讨老婆......
  2. 数理思维这样培养才有效,从小就赢在方法上,每本不足3元!!
  3. 我们该如何学习机器学习中的数学
  4. 放大器非线性失真研究装置_高效布里渊光纤放大器
  5. python功能选择模块_python – 组合功能和功能模块
  6. jwt如何防止token被窃取_在吗?认识一下JWT(JSON Web Token)?
  7. 纳尼???我JVM优化过头了,直接把异常信息优化没了?怎么办
  8. 归纳推理测试没做完_朋友买了1斤紫菜,2年还没吃完,我教他这样做,2个月就吃完了...
  9. 单片机矩阵消抖延时c语言,单片机矩阵按键定时器消抖程序源码
  10. java中formfile,基于Struts FormFile上传文件