题意

给定长为 \(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 由乃与大母神原型和偶像崇拜的更多相关文章

  1. 洛谷P3792 由乃与大母神原型和偶像崇拜

    P3792 由乃与大母神原型和偶像崇拜 题目背景 由乃最近没事干,去研究轻拍学去了 就是一个叫做flip flappers,轻拍翻转小膜女的番 然后研究的过程中她看到了一个叫做大母神原型的东西 大母神 ...

  2. p3792 由乃与大母神原型和偶像崇拜(思维+线段树)

    要求 1.修改x位置的值为y 2.查询区间l,r是否可以重排为值域上连续的一段 可以,很lxl 然后一开始思考合并区间,但是发现可以重排序,GG 然后想了特殊性质,比如求和,但是显然可以被叉 这时候我 ...

  3. AC日记——由乃与大母神原型和偶像崇拜 洛谷 P3792

    由乃与大母神原型和偶像崇拜 思路: 逆元+线段树维护和+线段树维护平方和+线段树维护最大最小值: 代码: #include <bits/stdc++.h> using namespace ...

  4. 【洛谷P3792】由乃与大母神原型和偶像崇拜

    题目大意:维护一个序列,支持单点修改和查询一段区间能不能组成连续的一段数. 题解:查询区间能不能组成一段连续的数这个操作较为复杂,很难在较小时间复杂度内直接维护.这里采用线段树维护区间哈希的策略,即: ...

  5. LuoguP3792 由乃与大母神原型和偶像崇拜

    题目地址 题目链接 题解 由乃题还是毒瘤啊orz 显然的一个结论是,如果保证不重复,维护区间min,max然后判断max-min+1==r-l+1是否成立即可 但是有重复 于是就要orz题解区的各位大 ...

  6. 「Luogu 3792」由乃与大母神原型和偶像崇拜

    更好的阅读体验 Portal Portal1: Luogu Description 给你一个序列\(a\) 每次两个操作: 修改\(x\)位置的值为\(y\): 查询区间\([l, r]\)是否可以重 ...

  7. 強大的javascrpt原型链學習

    一个自带隐式的 __proto__ 属性[implicit __proto__ property],指向foo的原型 這有點類似實現C# 繼承作用 a類的公共東西,給b和c類共用 var a = { ...

  8. Cocos引擎现身 IndiePrize 全球游戏开发者大会!Cocos的两大男神成为压轴嘉宾

    2019全球游戏开发者大会今天11月10日,在深圳南山海上世界文化艺术中心拉开帷幕.除了号称精品游戏"奥斯卡"的IndiePrize将在现场展开最终角逐,更有来自美国.俄罗斯.澳大 ...

  9. 《Xenogears》(异度装甲)隐含的原型与密码

    <Xenogears>(异度装甲)隐含的原型与密码 X 彩虹按:一种高次元的“生命体”,因“事故”被抓来当成“超能源”,其实那不只是“无限的能源”而已,“它”是有意志的!在我们眼里看来,这 ...

  10. 十大Intellij IDEA快捷键

    转载:http://blog.csdn.net/dc_726/article/details/42784275 Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一 ...

随机推荐

  1. C#皮肤美化

    关于Winform窗体美化,目前大致了解是有两种方式:第一种方式是重写Winform本身的控件,不过这需要非常熟悉控件的各个属性和事件并且要求具有很高的GDI绘图技术.第二种方式是借助第三方Winfo ...

  2. redis基本数据结构-集合set

    redis基本数据结构-集合set 特性 一个集合键最多存储 2^32 - 1 个字符串值 元素在集合内无序(哈希表-链地址法解决冲突) 元素在集合内唯一 向集合添加元素 sadd key value ...

  3. KubeCube 用户管理与身份认证

    前言 KubeCube (https://kubecube.io) 是由网易数帆近期开源的一个轻量化的企业级容器平台,为企业提供 kubernetes 资源可视化管理以及统一的多集群多租户管理功能.K ...

  4. CF1363A 题解

    洛谷链接&CF 链接 题目简述 共有 \(T\) 组数据. 对于每组数据,给定 \(n,x\) 和 \(n\) 个数,问是否可以从 \(n\) 个数中选 \(x\) 个使其和为奇数,可以输出 ...

  5. Docker Compose 基本概要

    Docker Compose 基本概要 Compose 是一个用于定义和运行多容器 Docker 应用程序的工具.使用 YAML 文件来配置多个应用程序的服务,包括生产.暂存.开发.测试以及 CI 工 ...

  6. Oracle 删除大量表记录操作总结

    By:授客 QQ:1033553122 删除表数据操作 清空所有表记录 TRUNCATE TABLE your_table_name; 或者批量删除满足条件的表记录 BEGIN LOOP DELETE ...

  7. Nuxt.js必读:轻松掌握运行时配置与 useRuntimeConfig

    title: Nuxt.js必读:轻松掌握运行时配置与 useRuntimeConfig date: 2024/7/29 updated: 2024/7/29 author: cmdragon exc ...

  8. axios传递参数的使用

    今天在学习elasticsearch时,遇到一个问题:项目中前端采用的是Vue2+axios,后端的接口采用Restful风格来接收: 关于Resultful风格: 1. GET(SELECT):从服 ...

  9. 【Axure RP】Axure RP 9 下载安装及汉化

    本体及破解机下载: http://www.sd173.com/soft/7951.html 汉化补丁教程见: https://blog.csdn.net/weixin_74457789/article ...

  10. 【SVN】属性功能配置

    一.配置SVN提交模板 更改SVN提交信息模板 (参考源博客): https://www.cnblogs.com/fairylyl/p/10505833.html 右键属性配置: 新建一项属性,选择[ ...