题意

给定长为 \(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. 实现ASP.Net Core3.1运行在DockeDesktop下并用Nginx实现负载均衡

    一.首先去https://docs.docker.com/get-docker/下载Windows版本的Docker Desktop并安装(需要win10专业版以上操作系统,并启用CPU虚拟化和安装H ...

  2. python使用flask框架生成excle返回前端(包含图片、表格、表头灰色、表格加边框)

    python使用flask框架生成excle文档,文档中包含图片和表格,其中表格要包含图片.表格.表头灰色.表格加边框,照片和表格不重叠. 逻辑:获得图片的高度,根据高度计算表格从第几行开始插入. 效 ...

  3. yb课堂 基于浏览器和node.js的http客户端Axios 《三十四》

    什么是Axios 基于promise用于浏览器和node.js的http客户端 支持浏览器和node.js 支持Promise API 支持拦截请求和响应 支持转换请求和响应数据 JSON数据的自动转 ...

  4. 深度学习论文翻译解析(二十三):Segment Angthing

    论文标题:Segment Angthing 论文作者: Alexander Kirillov  Eric Mintun  Nikhila Ravi  Hanzi Mao... 论文地址:2304.02 ...

  5. MobaXterm是一款功能强大的远程SSH利器,是您远程计算机的终极工具箱

    MobaXterm 是一款功能强大的远程终端应用,可以用于 Windows 系统上的 SSH.Telnet.RDP.VNC 等远程登录.它支持多种会话类型,拥有强大的终端功能,还支持 X11 图形界面 ...

  6. PHP集群session共享

    集群的概念没有多复杂,其实就是多台电脑为了同一个目标在一起工作.在Web应用中,就是多个服务器提供一个站点的服务. 搭建PHP集群的第一步就是设置负载均衡. 默认情况下PHP是将session存在本地 ...

  7. ASP.NET Core 程序集注入(三)

    前言: 在Autofac的使用中,提供了个种注入的API其中GetAssemblies()用着特别的舒坦. 1.core2.0也可以使用Autofac的包,但框架自身也提供了默认的注入Api,ISer ...

  8. MFC 关于按键状态获取

    alt键会阻断消息? moousemovealt键无法判断,按下一次 并松开一次状态改变一次#define KeyState GetAsyncKeyState BOOL bCtrlDown = (Ke ...

  9. 【DataBase】MySQL 11 SQL函数 单行函数其五 流程控制函数 & 单行函数总结

    SQL函数其五 流程控制函数 & 单行函数总结 视频参考自:P43 - P52 https://www.bilibili.com/video/BV1xW411u7ax  单IF函数使用 -- ...

  10. 【JS】04 DOM 文档对象模型 P1 查找元素、改变内容、绑定事件

    什么是DOM? Document Object Model 文档指的是HTML文档 当浏览器打开一个网页的时候,实际上把HTML文档读取到内存中进行解析 整个HTML文档被封装为document文档对 ...