题目链接

\(Description\)

给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c。

\(Solution\)

模拟一些数据可以发现,询问后一整段都会被修改,几次询问后数列可能只剩下几段不同的区间了。

那么还是暴力,每个块维护的是整个块是否仅被一种权值覆盖。查询时对于相同权值的块就可以O(1)统计;否则暴力统计并修改答案;不完整的块暴力。

这样看似最差情况下每次需要O(n)的时间,但实际远远到不了

假设初始序列都是同一个值,那么查询需要O(sqrt(n)),如果这时进行区间修改,那么最多会破坏首尾两个块的标记

所以只能使后面的询问至多多2个块的暴力时间,所以均摊每次操作复杂度为O(sqrt(n))

换句话说,要想让一个操作耗费O(n)的时间,要先花费sqrt(n)个操作修改数列

----by hzwer

#include <cmath>
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int N=1e5+5,MAXIN=1e6; int n,size,sizen,A[N],tag[2000],bel[N],L[2000],R[2000];
bool cover[2000];
char IN[MAXIN],*SS=IN,*TT=IN; inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
int Count(int l,int r,int v)
{
int res=0;
for(int i=l; i<=r; ++i)
if(A[i]==v) ++res; else A[i]=v;
return res;
}
void Reset(int p,int l,int r,int vbef,int v)
{//Reset [L(p),l)&&(r,R(p)] to vbef,[l,r] to v
for(int i=L[p]; i<l; ++i) A[i]=vbef;
for(int i=l; i<=r; ++i) A[i]=v;
int t=std::min(n,R[p]);
for(int i=r+1; i<=t; ++i) A[i]=vbef;
cover[p]=0;
}
int Get_scatter(int l,int r,int v)
{
if(cover[bel[l]])
if(tag[bel[l]]==v) return r-l+1;
else Reset(bel[l],l,r,tag[bel[l]],v);
else return Count(l,r,v);
return 0;
}
int Query(int l,int r,int v)
{
int res=Get_scatter(l,std::min(r,R[bel[l]]),v); if(bel[l]!=bel[r]) res+=Get_scatter(L[bel[r]],r,v); for(int i=bel[l]+1; i<bel[r]; ++i)
if(cover[i])
if(tag[i]==v) res+=bel[l]==bel[n]?sizen:size;
else tag[i]=v;
else
res+=Count(L[i],R[i],v), cover[i]=1, tag[i]=v;
return res;
} int main()
{
n=read(), size=sqrt(n);
for(int i=1; i<=n; ++i) bel[i]=(i-1)/size+1, A[i]=read();
for(int i=1; i<=bel[n]; ++i) L[i]=(i-1)*size+1,R[i]=i*size;
sizen=n-(bel[n]-1)*size;
for(int l,r,c,i=1; i<=n; ++i)
l=read(), r=read(), c=read(), printf("%d\n",Query(l,r,c));
return 0;
}

LOJ.6284.数列分块入门8(分块)的更多相关文章

  1. LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)

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

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

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

  3. LOJ.6281.数列分块入门5(分块 区间开方)

    题目链接 int内的数(也不非得是int)最多开方4.5次就变成1了,所以还不是1就暴力,是1就直接跳过. #include <cmath> #include <cstdio> ...

  4. LibreOJ 6277 数列分块入门 1(分块)

    题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...

  5. [Libre 6281] 数列分块入门 5 (分块)

    水一道入门分块qwq 题面:传送门 开方基本暴力.. 如果某一个区间全部都开成1或0就打上标记全部跳过就行了 因为一个数开上个四五六次就是1了所以复杂度能过233~ code: //By Menteu ...

  6. LibreOJ 6280 数列分块入门 4(分块区间加区间求和)

    题解:分块的区间求和比起线段树来说实在是太好写了(当然,复杂度也高)但这也是没办法的事情嘛.总之50000的数据跑了75ms左右还是挺优越的. 比起单点询问来说,区间询问和也没有复杂多少,多开一个su ...

  7. LibreOJ 6278 数列分块入门 2(分块)

     题解:非常高妙的分块,每个块对应一个桶,桶内元素全部sort过,加值时,对于零散块O(sqrt(n))暴力修改,然后暴力重构桶.对于大块直接整块加.查询时对于非完整块O(sqrt(n))暴力遍历.对 ...

  8. LibreOJ 6281 数列分块入门 5(分块区间开方区间求和)

    题解:区间开方emmm,这马上让我想起了当时写线段树的时候,很显然,对于一个在2^31次方以内的数,开方7-8次就差不多变成一了,所以我们对于每次开方,如果块中的所有数都为一了,那么开方也没有必要了. ...

  9. LibreOJ 6279 数列分块入门 3(分块+排序)

    题解:自然是先分一波块,把同一个块中的所有数字压到一个vector中,将每一个vector进行排序.然后对于每一次区间加,不完整的块加好后暴力重构,完整的块直接修改标记.查询时不完整的块暴力找最接近x ...

随机推荐

  1. 攻击者利用的Windows命令、横向渗透工具分析结果列表

    横向渗透工具分析结果列表 https://jpcertcc.github.io/ToolAnalysisResultSheet/ 攻击者利用的Windows命令 https://blogs.jpcer ...

  2. keras例子-matchnet

    2015CVPR:MatchNet_ Unifying Feature and Metric Learning for Patch-Based Matching 主要是基于patch的图像特征匹配,基 ...

  3. 嵌入式Linux驱动笔记(十八)------浅析V4L2框架之ioctl【转】

    转自:https://blog.csdn.net/Guet_Kite/article/details/78574781 权声明:本文为 风筝 博主原创文章,未经博主允许不得转载!!!!!!谢谢合作 h ...

  4. linux源码Makefile详解(完整)

    转自:http://www.cnblogs.com/Daniel-G/p/3286614.html 随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 ...

  5. CrossUI SPA Builder ---- feathers API框架

    CrossUI SPA Builder:   http://www.crossui.com/ 国产?   龙博(JSLINB)AJAX框架? CrossUI SPA Builderenables de ...

  6. springboot系列十三、springboot集成swaggerUI

    一.Swagger介绍 Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因: Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学习和尝试API. ...

  7. listener failed: zbx_tcp_listen() fatal error: unable to serve on any address [[-]:20050]

    故障现象: 客户端报错:service zabbix-agent 启动后,端口没有被正常监听,服务端也无法正常连接 将客户端改为二进制文件安装也不能正常启动/usr/local/zabbix/sbin ...

  8. centos 6.5内核编译步骤及配置详解

    1.准备并加压内核安装包:linux-3.13.2.tar.xz # tar xf linux-3.13.2.tar.xz -C /usr/src # cd /usr/src/ # ln -sv li ...

  9. 擅于使用JS的eval方法

    样例如下: var appsDetails = {“app1”:"", “app2”:"", “app3”:"", “app4”:" ...

  10. jquery实现星级评分

    项目中遇到到实现星级评分,就用了这个插件 http://www.jq22.com/jquery-info291