LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)
题目描述
给出一个长为 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)的更多相关文章
- LOJ.6284.数列分块入门8(分块)
题目链接 \(Description\) 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c. \(Solution\) 模拟一些数据可以发现,询问后 ...
- [Libre 6281] 数列分块入门 5 (分块)
水一道入门分块qwq 题面:传送门 开方基本暴力.. 如果某一个区间全部都开成1或0就打上标记全部跳过就行了 因为一个数开上个四五六次就是1了所以复杂度能过233~ code: //By Menteu ...
- LOJ#6284. 数列分块入门 8
分块的时候开一个数组标记这个区间是不是都是一样颜色的部分,如果是的话,我后面的查询,更新部分就可以直接整块操作,对于不是不全部都一样颜色的块在具体进到快里面去暴力. 在更新的时候对边上的两个不完整的块 ...
- LOJ.6281.数列分块入门5(分块 区间开方)
题目链接 int内的数(也不非得是int)最多开方4.5次就变成1了,所以还不是1就暴力,是1就直接跳过. #include <cmath> #include <cstdio> ...
- LibreOJ 6277 数列分块入门 1(分块)
题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...
- LibreOJ 6280 数列分块入门 4(分块区间加区间求和)
题解:分块的区间求和比起线段树来说实在是太好写了(当然,复杂度也高)但这也是没办法的事情嘛.总之50000的数据跑了75ms左右还是挺优越的. 比起单点询问来说,区间询问和也没有复杂多少,多开一个su ...
- LibreOJ 6278 数列分块入门 2(分块)
题解:非常高妙的分块,每个块对应一个桶,桶内元素全部sort过,加值时,对于零散块O(sqrt(n))暴力修改,然后暴力重构桶.对于大块直接整块加.查询时对于非完整块O(sqrt(n))暴力遍历.对 ...
- LibreOJ 6281 数列分块入门 5(分块区间开方区间求和)
题解:区间开方emmm,这马上让我想起了当时写线段树的时候,很显然,对于一个在2^31次方以内的数,开方7-8次就差不多变成一了,所以我们对于每次开方,如果块中的所有数都为一了,那么开方也没有必要了. ...
- LibreOJ 6279 数列分块入门 3(分块+排序)
题解:自然是先分一波块,把同一个块中的所有数字压到一个vector中,将每一个vector进行排序.然后对于每一次区间加,不完整的块加好后暴力重构,完整的块直接修改标记.查询时不完整的块暴力找最接近x ...
随机推荐
- Python os.walk文件遍历
os.walk(top, topdown=True, onerror=None, followlinks=False) 可以得到一个三元tupple(dirpath, dirnames, filena ...
- [技巧篇]09.Struts2豁然开朗的一些配置[记得要看哟]
这里留下一个重要的信息,关于部署描述符,关于struts2的核心配置文件,关于JSON插件的属性配置介绍,还有特别重要的JSON的注解 关于struts.xml的配置,这里学到了新的知识 使用插件方式 ...
- android极光推送初步了解
推送可以及时,主动的与用户发起交互 (1)继承jar包,照示例AndroidManifest.xml添加. (2)自定义MyApp继承自Application,在onCreate方法中调用JPushI ...
- redis启动脚本
#!/bin/sh # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the ...
- SpringBoot 在CentOS7部署,注册为服务,开机启动
1.首先在maven工程的pom文件中引入以下标签并保存 <build> <plugins> <plugin> <groupId>org.springf ...
- Spring注解概览(数漫江湖)
从Java5.0开始,Java开始支持注解.Spring做为Java生态中的领军框架,从2.5版本后也开始支持注解.相比起之前使用xml来配置Spring框架,使用注解提供了更多的控制Spring框架 ...
- MSSQL 错误:在将 varchar 值 '1,2,3,5,6' 转换成数据类型 int 时失败。
MSSQL 错误:在将 varchar 值 '1,2,3,5,6' 转换成数据类型 int 时失败.
- vue实现微信对话
因为项目中需要实现仿微信对话功能,于是抽空实现了下,主要是h5的canvas的把图片和文字绘制到画布上 原文来自我的个人博客:http://lvhww.com/index.php/archives/6 ...
- python实战===爬取所有微信好友的信息
''' 爬取所有T信好友的信息 ''' import itchat from pandas import DataFrame itchat.login() friends=itchat.get_fri ...
- notifier chain — 内核通知链【转】
转自:http://blog.csdn.net/g_salamander/article/details/8081724 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣 ...