内存限制:256 MiB时间限制:500 ms标准输入输出
题目类型:传统评测方式:文本比较
上传者: hzwer

题目描述

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

输入格式

第一行输入一个数字 nn。

第二行输入 nn 个数字,第 i 个数字为 a_iai​,以空格隔开。

接下来输入 nn 行询问,每行输入三个数字 ll、rr、cc,以空格隔开。

表示先查询位于 [l,r][l,r] 的数字有多少个是 cc,再把位于 [l,r][l,r] 的数字都改为 cc。

输出格式

对于每次询问,输出一行一个数字表示答案。

样例

样例输入

4
1 2 2 4
1 3 1
1 4 4
1 2 2
1 4 2

样例输出

1
1
0
2

数据范围与提示

对于 100\%100% 的数据,1 \leq n \leq 100000, -2^{31} \leq \mathrm{others}1≤n≤100000,−231≤others、\mathrm{ans} \leq 2^{31}-1ans≤231−1。

代码:

 //#6284. 数列分块入门 8-区间查询等于一个数c的元素,并将这个区间的所有元素改为c
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+; int n,m;
int a[maxn],pos[maxn],tag[maxn]; int Find(int l,int r,int c)
{
int num=;
if(pos[l]==pos[r]){
if(tag[pos[l]]==c) num+=r-l+;
else{
if(tag[pos[l]]!=-){
for(int i=(pos[l]-)*m+;i<=pos[l]*m;i++)
a[i]=tag[pos[l]];
}
for(int i=l;i<=r;i++){
if(a[i]==c) num++;
else a[i]=c;
}
int flag=;
for(int i=(pos[l]-)*m+;i<=pos[l]*m;i++){
if(a[i]!=c){
flag=;break;
}
}
if(!flag) tag[pos[l]]=c;
else tag[pos[l]]=-;
}
}
else{
if(tag[pos[l]]==c){
num+=pos[l]*m-l+;
}
else{
if(tag[pos[l]]!=-){
for(int i=(pos[l]-)*m+;i<=pos[l]*m;i++)
a[i]=tag[pos[l]];
}
for(int i=l;i<=pos[l]*m;i++){
if(a[i]==c) num++;
else a[i]=c;
}
int flag=;
for(int i=(pos[l]-)*m+;i<=pos[l]*m;i++){
if(a[i]!=c){
flag=;break;
}
}
if(!flag) tag[pos[l]]=c;
else tag[pos[l]]=-;
}
for(int i=pos[l]+;i<pos[r];i++){
if(tag[i]==c) num+=m;
else{
if(tag[i]!=-) tag[i]=c;
else{
for(int j=(i-)*m+;j<=i*m;j++){
if(a[j]==c) num++;
else a[j]=c;
}
int flag=;
for(int j=(i-)*m+;j<=i*m;j++){
if(a[j]!=c){
flag=;break;
}
}
if(!flag) tag[i]=c;
else tag[i]=-;
}
}
}
if(tag[pos[r]]==c) num+=r-((pos[r]-)*m+)+;
else{
if(tag[pos[r]]!=-){
for(int i=(pos[r]-)*m+;i<=min(pos[r]*m,n);i++){
a[i]=tag[pos[r]];
}
}
for(int i=(pos[r]-)*m+;i<=r;i++){
if(a[i]==c) num++;
else a[i]=c;
}
int flag=;
for(int i=(pos[r]-)*m+;i<=min(pos[r]*m,n);i++){
if(a[i]!=c){
flag=;break;
}
}
if(!flag) tag[pos[r]]=c;
else tag[pos[r]]=-;
}
}
return num;
} int main()
{
scanf("%d",&n);
m=sqrt(n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
pos[i]=(i-)/m+;
}
memset(tag,-,sizeof(tag));
for(int i=;i<=n;i++){
int l,r,c;
scanf("%d%d%d",&l,&r,&c);
printf("%d\n",Find(l,r,c));
}
} /*
10
1 3 4 2 5 7 11 3 5 1
1 2 1
2 4 2
3 5 3
4 6 4
5 9 4
3 5 1
7 9 4
5 9 4
3 7 2
5 6 2 1
1
0
0
2
0
3
4
0
2 */

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

  1. LOJ.6284.数列分块入门8(分块)

    题目链接 \(Description\) 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c. \(Solution\) 模拟一些数据可以发现,询问后 ...

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

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

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

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

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

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

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

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

  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. Eclipse debug模式下使用16进制(Hex)查看变量值

    转载自:http://blog.csdn.net/jinhill/article/details/5767035 因为工作中需要查看byte[]原始编码,eclipse中debug模式下默认查看byt ...

  2. 子字符串substring 问题 - KMP 字符串匹配算法备忘录

    本文为自己对KMP的理解. 对KMP很好的介绍可以参考 http://www.cnblogs.com/yjiyjige/p/3263858.html 本文为对这篇文章的提炼和补充. KMP算法基本思想 ...

  3. [Luogu 3958] NOIP2017 D2T1 奶酪

    题目链接 人生第一篇题解,多多关照吧. 注意事项: 1.多组数据,每次要先初始化. 2.因为涉及到开根,所以记得开double. 整体思路: 建图,判断「起点」与「终点」是否连通. 方法可选择搜索(我 ...

  4. 选择Asp for javascript,非.net。

    写Web类型的程序我使用过的服务器端语言有C#和Python.PHP稍Copy过几段代码,Asp很早听说过.C#我主要用来写Web服务比较多,C#这种强类型语言写Web不太爽,特别构造复杂的JSON数 ...

  5. java修饰符——transient

    一.背景 上星期去CRM上开发一个功能,该系统里面有自动分页,需要在实体类里加入一个分页变量 // 分页 private PageInfo pageInfo = new PageInfo(); 这个本 ...

  6. Item 8 覆盖equals时请遵守通用约定

    在覆盖equals方法的时候,你必须要遵守它的通用约定,不遵守,写出来的方法,会出现逻辑错误.下面是约定的内容:   equals方法实现了等价关系:   自反性.对于任何非null的引用值,x.eq ...

  7. 【BZOJ4868】期末考试 [三分][贪心]

    期末考试 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description Input Output Samp ...

  8. bzoj 2079: [Poi2010]Guilds——结论题

    Description Zy皇帝面临一个严峻的问题,两个互相抵触的贸易团体,YYD工会和FSR工会,他们在同一时间请求在王国各个城市开办自己的办事处.这里有n个城市,其中有一些以双向马路相连,这两个工 ...

  9. 【Atcoder】CODE FESTIVAL 2017 qual A D - Four Coloring

    [题意]给定h,w,d,要求构造矩阵h*w满足任意两个曼哈顿距离为d的点都不同色,染四色. [算法]结论+矩阵变换 [题解] 曼哈顿距离是一个立着的正方形,不方便处理.d=|xi-xj|+|yi-yj ...

  10. bzoj 2809 左偏树\平衡树启发式合并

    首先我们对于一颗树,要选取最多的节点使得代价和不超过m,那么我们可以对于每一个节点维护一个平衡树,平衡树维护代价以及代价的和,那么我们可以在logn的时间内求出这个子树最多选取的节点数,然后对于一个节 ...