#6284. 数列分块入门 8(区间询问等于一个数 cc 的元素,并将这个区间的所有元素改为 c)
题目链接:https://loj.ac/problem/6284
题目大意:中文题目
具体思路:还是和sqrt那个题的思路相同的,标记每一块的值是不是相同的,注意lazy下标的下放。
AC代码:
#include<bits/stdc++.h>
using namespace std;
# define ll long long
const int maxn = 2e6+;
const int inf = 0x3f3f3f3f;
const int mod = 1e4+;
ll l[maxn],r[maxn],belong[maxn];
ll flag[maxn],a[maxn];
int n;
void buildblock()
{
ll tmp=(ll)sqrt(n);
ll tot=n/tmp;
if(n%tmp)
tot++;
for(ll i=; i<=n; i++)
{
belong[i]=(i-)/tmp+1ll;
}
for(ll i=; i<=tot; i++)
{
l[i]=(i-)*tmp+1ll;
r[i]=i*tmp;
}
r[tot]=n;
}
void down(int pos)
{
if(flag[pos]==-)
return ;
for(int i=l[pos]; i<=r[pos]; i++)
{
a[i]=flag[pos];
}
flag[pos]=-;
}
ll ask(ll st,ll ed,ll val)
{
int ans=;
down(belong[st]);
if(belong[st]==belong[ed])
{
for(int i=st; i<=ed; i++)
{
ans+=(a[i]==val?:);
a[i]=val;
}
return ans;
}
down(belong[st]);
for(int i=st; i<=r[belong[st]]; i++)
{
ans+=(a[i]==val?:);
a[i]=val;
}
down(belong[ed]);
for(int i=l[belong[ed]]; i<=ed; i++)
{
ans+=(a[i]==val?:);
a[i]=val;
}
for(int i=belong[st]+; i<belong[ed]; i++)
{
if(flag[i]==-){
for(int j=l[i]; j<=r[i]; j++)
ans+=(a[j]==val?:);
}
else if(flag[i]==val){
ans+=(r[i]-l[i]+);
}
flag[i]=val;
}
return ans;
}
int main()
{
for(int i=; i<=maxn; i++)
flag[i]=-;
scanf("%d",&n);
for(int i=; i<=n; i++)
scanf("%lld",&a[i]);
buildblock();
ll st,ed,val;
while(n--)
{
scanf("%lld %lld %lld",&st,&ed,&val);
printf("%lld\n",ask(st,ed,val));
}
return ;
}
#6284. 数列分块入门 8(区间询问等于一个数 cc 的元素,并将这个区间的所有元素改为 c)的更多相关文章
- LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)
#6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ.6284.数列分块入门8(分块)
题目链接 \(Description\) 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c. \(Solution\) 模拟一些数据可以发现,询问后 ...
- #6278. 数列分块入门 2(询问区间内小于某个值 xx 的元素个数)
题目链接:https://loj.ac/problem/6278 题目大意:中文题目 具体思路:数列分块模板题,对于更新的时候,我们通过一个辅助数组来进行,对于原始的数组,我们只是用来加减,然后这个辅 ...
- #6279. 数列分块入门 3(询问区间内小于某个值 xx 的前驱(比其小的最大元素))
题目链接:https://loj.ac/problem/6279 题目大意:中文题目 具体思路:按照上一个题的模板改就行了,但是注意在整块查找的时候的下标问题. AC代码: #include<b ...
- LOJ#6284. 数列分块入门 8
分块的时候开一个数组标记这个区间是不是都是一样颜色的部分,如果是的话,我后面的查询,更新部分就可以直接整块操作,对于不是不全部都一样颜色的块在具体进到快里面去暴力. 在更新的时候对边上的两个不完整的块 ...
- 数列分块入门九题(三):LOJ6283~6285
Preface 最后一题我一直觉得用莫队是最好的. 数列分块入门 7--区间乘法,区间加法,单点询问 还是很简单的吧,比起数列分块入门 7就多了个区间乘. 类似于线段树,由于乘法的优先级高于加法,因此 ...
- 数列分块入门1~9 loj6277~6285
hzwer的讲解 一 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,单点查值. #include <iostream> #include <cstdi ...
- LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)
#6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给 ...
- LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)
#6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
随机推荐
- struts2 OGNL配和通用标签和其它标签的使用
三.OGNL配合通用标签的其他使用 1.iterator标签(很重要) 动作类 package com.itheima.web.action; import java.util.ArrayList; ...
- appium-基础搭建,适配,问题,优化,提速
搭建开发环境,导入testng/log4j/maven 1.配置jdk环境 2.安装appium,下载eclipse-adt,配置appium环境 github.com/getlantern/foru ...
- Hibernate的入门:
1 下载Hibernate5 http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-r ...
- RHCSA考试真题
2018年 RHCSA考试真题... ------------ 考前需要做的基础 破解root密码 KVM虚拟机与VM虚拟机 主机名:station.domain1.example.comIP地址:1 ...
- JAVA核心技术I---JAVA基础知识(单例模式和final关键字)
一:单例模式 C++设计模式中提及,不再赘述设计模式---对象性能模式之单例模式(Singleton) public class single{ static single Instance=new ...
- Git(介绍和安装)
Git 是什么 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制系统. 与常用的版本控制工具 CVS, Subversion 等不同,它 ...
- python+selenium 模拟登陆,自动下单
目前写的实在太粗糙,留着,以后来写上
- java中数组、集合、字符串之间的转换,以及用加强for循环遍历
java中数组.集合.字符串之间的转换,以及用加强for循环遍历: @Test public void testDemo5() { ArrayList<String> list = new ...
- node的优缺点及应用场景
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎(V8引擎执行Javascript的速度非常快,性能非常好) 可以说node是运行在服务器端V8引擎上的Ja ...
- 067、如何部署Calico网络 (2019-04-10 周三)
参考https://www.cnblogs.com/CloudMan6/p/7509975.html Calico 是一个纯三层的虚拟网络方案,Calico为每个容器分配一个IP,每个host都是 ...