内存限制: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. Base class does not contain a constructor that takes '0' argument

    刚刚在写一段直播室网站中的一段程序遇,突然遇到一个错误,如下 'TVLLKBLL.BaseClass' does not contain a constructor that takes 0 argu ...

  2. [技巧篇]11.JavaScript原生态如何获取浏览器请求地址中的参数

    var getAccessParams = function(){ var i,ilen,strs,keyName,keyValue, params={}, path = window.locatio ...

  3. HDU 5901 Count primes 大素数计数

    题意:计算1~N间素数的个数(N<=1e11) 题解:题目要求很简单,作为论文题,模板有两种 \(O(n^\frac{3}{4} )\),另一种lehmer\(O(n^\frac{2}{3})\ ...

  4. asp.net SimpleImpersonation使用身份模拟访问局域网共享目录

    mvc中默认账户的权限很低,缺省情况下,ASP.NET应用程序以本机的ASPNET帐号运行,该帐号属于普通用户组,权限受到一定的限制,以保障ASP.NET应用程序运行的安全.但是有时需要某个ASP.N ...

  5. jquery ajax的知识点

    jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(p ...

  6. Freemarker <#list List/Map/Array[] as Object>

    http://blog.csdn.net/ani521smile/article/details/52164366 详细教程链接

  7. 20155335俞昆《java程序设计》第十周总结

    学号 2016-2017-2 <Java程序设计>第十周学习总结 ## 事实上网络编程,我们可以简单的理解为两台计算机相互通讯数据而已,对于程序员而言,掌握一种编程接口并使用一种编程模型相 ...

  8. niceScroll 简单使用 及 插件API

    官方网址[https://nicescroll.areaaperta.com/]  注:效果见官网右侧滚动条 jquery.nicescroll文件下载地址 引入核心文件,插件需要引入1.5.X以上版 ...

  9. js_如何优化你的代码让它更好看

    1.对于美的东西我们很难拒绝,比如美女.哈哈哈,程序员的梗. 2.所以我希望我写出来的代码也是很美观的,让人看起来会很舒服. 3.要想让你的代码简约美观,就要涉及封装,模块化了,可复用代码.vue可以 ...

  10. hydra 密码破解工具详解

    一.简介 hydra是著名黑客组织thc的一款开源的暴力密码破解工具,可以在线破解多种密码.官 网:http://www.thc.org/thc-hydra,可支持AFP, Cisco AAA, Ci ...