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 ...
随机推荐
- 双向数据绑定实现之Object.defineProperty
vue.js利用的是es5的 defineproperty 特性实现的双向数据绑定,了解一下基本原理. 举例 var person= {}; Object.defineProperty(person, ...
- [LeetCode] 16. 3Sum Closest ☆☆☆
Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...
- [LeetCode] 8. String to Integer (atoi) ☆
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- spring中使用@Async注解进行异步处理
引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3. ...
- 确保web安全的https、确认访问用户身份的认证(第七章、第八章)
第七章 确保web安全的https 1.http的缺点: (1)通信使用明文,内容可能会被窃听 (2)不验证通信方的身份,因此有可能遭遇伪装 (3)无法证明报文的完整性,因此有可能已遭篡改. 2.通信 ...
- 静态资源(JS/CSS)存储在localStorage
一.简单了解SEO SEO由英文Search Engine Optimization缩写而来, 中文意译为“搜索引擎优化”.SEO是指从自然搜索结果获得网站流量的技术和过程. 搜索引擎不优化的网站分为 ...
- 区块链~Merkle Tree(默克尔树)算法解析~转载
转载~Merkle Tree(默克尔树)算法解析 /*最近在看Ethereum,其中一个重要的概念是Merkle Tree,以前从来没有听说过,所以查了些资料,学习了Merkle Tree的知识,因为 ...
- mssql手工注入2
--+ 先说一些函数的说明: substring(str,start,len) 截取字符串的作用,第一个参数为要截取的字符串,第二个参数为从哪里开始截取,第三个参数为截取的长度 ascii(char) ...
- linux驱动基础系列--Linux下Spi接口Wifi驱动分析
前言 本文纯粹的纸上谈兵,我并未在实际开发过程中遇到需要编写或调试这类驱动的时候,本文仅仅是根据源码分析后的记录!基于内核版本:2.6.35.6 .主要是想对spi接口的wifi驱动框架有一个整体的把 ...
- UVA 11076 Add Again
题目链接:UVA-33478 题意为给定n个数,求这n个数能组成的所有不同的排列组成的数字的和. 思路:发现对于任意一个数字,其在每一位出现的次数是相同的.换言之,所有数字的每一位相加的和是相同的. ...