P3792 由乃与大母神原型和偶像崇拜
题意
给定长为 \(n\) 的数组 \(a\),支持单点修改,\(q\) 次查询区间 \([l,r]\) 是否可以重排为值域上连续的一段。
\(n,q\le5\times10^5,a_i\le2.5\times10^7\) \(\quad\) \(\text{1 s, 512 MB}\)
题解
倘若可以被重排成值域上连续的一段,那么处于哪一段上也就是也可以确定的,令区间最大最小值分别为 \(Max\) 和 \(Min\),那么在值域上连续一定是 \([Min,Max]\),问题转换为判断区间是否能和 \([Min,Max]\) 重合。
从数颜色的角度是困难的,不妨换一个思路,类似哈希的思想,先预处理值域上的前缀平方和,再用线段树维护区间平方和,最后判断值是否相同即可,可以选择取模或者 unsigned long long 自然溢出。
还有一种方法是维护前继相同的值,询问时先判断 \([Min,Max]\) 的长度是否和区间长度相同,后判断区间内元素最大前继是否落在区间内即可。
时间复杂度均为 \(\mathcal{O}(n\log n)\)。
哈希 + 自然溢出实现:
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5,NN = 2.5e7 + 5;
int n,q,a[N],Vmax = INT_MIN;
#define ull unsigned int long long
struct XDT{
int l,r,mi,ma; ull sum;
}t[N << 2];
#define ls p << 1
#define rs p << 1 | 1
void pushup(int p){
t[p].mi = min(t[ls].mi,t[rs].mi);
t[p].ma = max(t[ls].ma,t[rs].ma);
t[p].sum = t[ls].sum + t[rs].sum;
}
void build(int p,int l,int r){
t[p].l = l, t[p].r = r;
if (l == r){
t[p].mi = t[p].ma = a[l];
t[p].sum = (ull)a[l] * a[l];
return ;
}
int mid = (l + r) >> 1;
build(ls,l,mid), build(rs,mid + 1,r);
pushup(p);
}
void modify(int p,int x,int y){
if (t[p].l == t[p].r){
t[p].mi = t[p].ma = y;
t[p].sum = y * y;
return ;
}
int mid = (t[p].l + t[p].r) >> 1;
if (x <= mid) modify(ls,x,y);
else modify(rs,x,y);
pushup(p);
}
ull querySUM(int p,int l,int r){
if (l <= t[p].l && t[p].r <= r){
return t[p].sum;
}
int mid = (t[p].l + t[p].r) >> 1; ull val = 0;
if (l <= mid) val += querySUM(ls,l,r);
if (r > mid) val += querySUM(rs,l,r);
return val;
}
int queryMAX(int p,int l,int r){
if (l <= t[p].l && t[p].r <= r){
return t[p].ma;
}
int mid = (t[p].l + t[p].r) >> 1, val = INT_MIN;
if (l <= mid) val = max(val,queryMAX(ls,l,r));
if (r > mid) val = max(val,queryMAX(rs,l,r));
return val;
}
int queryMIN(int p,int l,int r){
if (l <= t[p].l && t[p].r <= r){
return t[p].mi;
}
int mid = (t[p].l + t[p].r) >> 1, val = INT_MAX;
if (l <= mid) val = min(val,queryMIN(ls,l,r));
if (r > mid) val = min(val,queryMIN(rs,l,r));
return val;
}
ull s[NN];
int read(){
int x = 0; char ch = getchar();
while (ch < '0' || ch > '9'){
ch = getchar();
}
while ('0' <= ch && ch <= '9'){
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x;
}
int main(){
n = read(), q = read();
for (int i = 1;i <= n;i++) a[i] = read(), Vmax = max(Vmax,a[i]);
for (int i = 1;i <= Vmax;i++) s[i] = s[i - 1] + (ull)i * i;
build(1,1,n);
while (q--){
int o = read(),l = read(),r = read();
if (o == 1)
modify(1,l,r);
else{
if (querySUM(1,l,r) == s[queryMAX(1,l,r)] - s[queryMIN(1,l,r) - 1])
puts("damushen");
else
puts("yuanxing");
}
}
return 0;
}
P3792 由乃与大母神原型和偶像崇拜的更多相关文章
- 洛谷P3792 由乃与大母神原型和偶像崇拜
P3792 由乃与大母神原型和偶像崇拜 题目背景 由乃最近没事干,去研究轻拍学去了 就是一个叫做flip flappers,轻拍翻转小膜女的番 然后研究的过程中她看到了一个叫做大母神原型的东西 大母神 ...
- p3792 由乃与大母神原型和偶像崇拜(思维+线段树)
要求 1.修改x位置的值为y 2.查询区间l,r是否可以重排为值域上连续的一段 可以,很lxl 然后一开始思考合并区间,但是发现可以重排序,GG 然后想了特殊性质,比如求和,但是显然可以被叉 这时候我 ...
- AC日记——由乃与大母神原型和偶像崇拜 洛谷 P3792
由乃与大母神原型和偶像崇拜 思路: 逆元+线段树维护和+线段树维护平方和+线段树维护最大最小值: 代码: #include <bits/stdc++.h> using namespace ...
- 【洛谷P3792】由乃与大母神原型和偶像崇拜
题目大意:维护一个序列,支持单点修改和查询一段区间能不能组成连续的一段数. 题解:查询区间能不能组成一段连续的数这个操作较为复杂,很难在较小时间复杂度内直接维护.这里采用线段树维护区间哈希的策略,即: ...
- LuoguP3792 由乃与大母神原型和偶像崇拜
题目地址 题目链接 题解 由乃题还是毒瘤啊orz 显然的一个结论是,如果保证不重复,维护区间min,max然后判断max-min+1==r-l+1是否成立即可 但是有重复 于是就要orz题解区的各位大 ...
- 「Luogu 3792」由乃与大母神原型和偶像崇拜
更好的阅读体验 Portal Portal1: Luogu Description 给你一个序列\(a\) 每次两个操作: 修改\(x\)位置的值为\(y\): 查询区间\([l, r]\)是否可以重 ...
- 強大的javascrpt原型链學習
一个自带隐式的 __proto__ 属性[implicit __proto__ property],指向foo的原型 這有點類似實現C# 繼承作用 a類的公共東西,給b和c類共用 var a = { ...
- Cocos引擎现身 IndiePrize 全球游戏开发者大会!Cocos的两大男神成为压轴嘉宾
2019全球游戏开发者大会今天11月10日,在深圳南山海上世界文化艺术中心拉开帷幕.除了号称精品游戏"奥斯卡"的IndiePrize将在现场展开最终角逐,更有来自美国.俄罗斯.澳大 ...
- 《Xenogears》(异度装甲)隐含的原型与密码
<Xenogears>(异度装甲)隐含的原型与密码 X 彩虹按:一种高次元的“生命体”,因“事故”被抓来当成“超能源”,其实那不只是“无限的能源”而已,“它”是有意志的!在我们眼里看来,这 ...
- 十大Intellij IDEA快捷键
转载:http://blog.csdn.net/dc_726/article/details/42784275 Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一 ...
随机推荐
- eclipse注释取消注释
方法一:使用Ctrl+/快捷键 1 第1步:在Eclipse中拖动鼠标,选中需要注释的代码,通常为连续多行代码. 2 第2步:按住Ctrl+/快捷键,如图所示. 3 第3步:会发现所选代码被&qu ...
- .NET 9 预览版6发布
微软发布了 .NET 9 的第 6 个预览版,此版本包括对运行时.SDK..NET MAUI.ASP.NET Core 和 C# 的更新,预览版没有包含太多新的主要功能或特性,因为已接近 .NET 9 ...
- yearrecord——一个类似痕迹墙的React数据展示组件
介绍一下自己做的一个类似于力扣个人主页提交记录和GitHub主页贡献记录的React组件. 下图分别是力扣个人主页提交记录和GitHub个人主页的贡献记录,像这样类似痕迹墙的形式可以比较直观且高效得展 ...
- 洛谷[NOIP2015 普及组] 金币
[NOIP2015 普及组] 金币 题目背景 NOIP2015 普及组 T1 题目描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之 ...
- 怎么使用github action定时运行js脚本?
github action是使用yaml文件来做到CI/CD的,文件位置存放在 .github/workflows,yaml文件内容如下: name: ncatest.cx.js on: push: ...
- 什么是spring.factories,引入未知模块报错如何解决
对于maven中引入其他外部包加入容器的过程,需要用到spring.factories spring.factories的作用:将自动配置类与对应的配置类集中在一起,方便springboot自动装配, ...
- 【WPF】Command 的一些使用方案
Command,即命令,具体而言,指的是实现了 ICommand 接口的对象.此接口要求实现者包含这些成员: 1.CanExecute 方法:确定该命令是否可以执行,若可,返回 true:若不可,返回 ...
- k8s 环境搭建(2)
安装docker组件 配置本地源或者自带的网络源2选1 1.切换镜像源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce ...
- pidstat命令详解
pidstat命令详解 pidstat 命令是 sysstat 工具的一个命令,用来监控全部或者指定进程的CPU.内存.线程.设备IO等系统资源的占用情况.pidstat 首次运行时显示自系统启动开始 ...
- 03 OLED显示屏实现
目录 前言 一.软件模拟IIC协议 1.开启IIC协议 2.结束IIC协议 3.传输数据 二.OLED的操作 1.传输数据的准备 2.写入命令 3.写入数据 4.初始化函数 5.设置光标 6.显示字符 ...