Luogu T14448 区间开方
题面版权来自Shlw。题目链接
题目背景
无
题目描述
给定一个数列,元素均为正整数,对其以下两种操作:
1.将某区间每一个数变为其算术平方根(取整)
2.求出某区间内所有数的最大值
输入输出格式
输入格式:
第一行包含两个整数$n$,$m$,分别表示该数列数字的个数和操作的总个数。第二行包含n个用空格分隔的整数,表示给定的数列。接下来m行,每行包含3个整数,表示一个操作,具体如下:
操作1:1 $x$ $y$ 含义:将区间[$x$,$y$]内每个数进行开方。
操作2:2 $x$ $y$ 含义:输出区间[$x$,$y$]内所有数的最大值。
输出格式:
输出包含若干行整数,即为所有操作2的结果。
输入输出样例
9 7
71 25 69 41 75 91 12 76 24
1 1 2
1 1 2
1 1 1
1 3 7
2 9 9
1 7 7
2 1 2
24
2
说明
对于20%的数据,n,m<=1000。
对于60%的数据,n,m<=10000。
对于100%的数据,n,m<=200000。
数据全部随机。
题解:
20分做法:
直接暴力。复杂度O($n*m$)。
60分做法:
我不知道。网上有关于线段树处理区间开方区间求和的题,只是自己不会写,不知道能不能迁移到区间最值上。(其实是为了看起来有部分分才设置60%数据的)
100分做法:
注意到数据是较为随机的,也就是说$m$次操作中差不多有$m/2$次开方操作,区间随机时每个元素被开方$m/4$次。然而一个9位数开方几十次之后就会变成1,以后的所有开方操作都是毫无意义的。考虑到元素最小值为1,所以在查询最大值时也没有必要将1考虑进去。
总而言之,1是“无需处理的元素”,然而在$m$次操作后期序列中会出现很长很长的一段全为1的元素,可以在区间操作时考虑跳过。
关于跳过一些未来可能会合并但一定不会分裂的区间可以使用并查集。
与之相似的一道题: CodeVS 4874 染色 题目链接
设fa[i]为“i以及i以后第一个不为1的数的编号”。换句话说,若$a_i$不为1,则$fa_{i}=i$;若$a_i$为1,则$fa_{i}$为$i$后第一个不为1的数的编号。发现$fa$可以进行路径压缩,在处理开方和求$max$时,从$find(i)$开始,逐次开方或求$max$,处理后若当前元素为1,将当前元素与下一个进行合并,否则开始处理下一个元素。
复杂度:O(跑得过)(手动滑稽)
代码:
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=2e5+10;
4 int a[maxn],fa[maxn];
5 int n,m;
6 int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
7 void change(int l,int r)
8 {
9 int i,j;
10 i=l;
11 do
12 {
13 i=find(i);
14 if(i>r){break;}
15 a[i]=(int)(sqrt(a[i]));
16 if(a[i]==1){fa[i]=find(i+1);}
17 else{i++;}
18 }while(i<=r);
19 //for(i=1;i<=n;i++){cout<<a[i]<<" ";}cout<<endl;
20 }
21 void query(int l,int r)
22 {
23 int i=l,j,ans=1;
24 do
25 {
26 i=find(i);
27 if(i>r){break;}
28 ans=max(ans,a[i]);
29 if(a[i]==1){fa[i]=find(i+1);}
30 else{i++;}
31 }while(i<=r);
32 printf("%d\n",ans);
33 }
34 int main()
35 {
36 int i,j,flag,l,r;
37 //freopen("data.in","r",stdin);
38 //freopen("test.out","w",stdout);
39 cin>>n>>m;
40 for(i=1;i<=n;i++){scanf("%d",&a[i]);}
41 for(i=1;i<=n+1;i++){fa[i]=i;}
42 for(i=1;i<=m;i++)
43 {
44 scanf("%d%d%d",&flag,&l,&r);
45 if(flag==1){change(l,r);}
46 else{query(l,r);}
47 }
48 return 0;
49 }
Luogu T14448 区间开方的更多相关文章
- 线段树 区间开方区间求和 & 区间赋值、加、查询
本文同步发表于 https://www.zybuluo.com/Gary-Ying/note/1288518 线段树的小应用 -- 维护区间开方区间求和 题目传送门 约定: sum(i,j) 表示区间 ...
- LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)
#6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5 题目描述 给出 ...
- LibreOJ 6281 数列分块入门 5(分块区间开方区间求和)
题解:区间开方emmm,这马上让我想起了当时写线段树的时候,很显然,对于一个在2^31次方以内的数,开方7-8次就差不多变成一了,所以我们对于每次开方,如果块中的所有数都为一了,那么开方也没有必要了. ...
- HDU 4027 Can you answer these queries?(线段树区间开方)
Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K ...
- Can you answer these queries?-HDU4027 区间开方
题意: 给你n个数,两个操作,0为区间开方,1为区间求和 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027 思路: 如果当该区间的数都为1,我们没必要 ...
- BZOJ 3038: 上帝造题的七分钟2【线段树区间开方问题】
3038: 上帝造题的七分钟2 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1469 Solved: 631[Submit][Status][Dis ...
- HDU 4027—— Can you answer these queries?——————【线段树区间开方,区间求和】
Can you answer these queries? Time Limit:2000MS Memory Limit:65768KB 64bit IO Format:%I64d & ...
- 上帝造题的七分钟2/花神游历各国/GSS4 线段树维护区间开方 By cellur925
题目传送门 或者 另一个传送门 询问区间和都好说.但是开方?? 其实是这样的,一个数(1e9)以内连续开方6次就会变成1,于是我们就可在开方操作上进行暴力修改.暴力修改的意思其实也就是找到叶子节点进行 ...
- BZOJ 3211: 花神游历各国【线段树区间开方问题】
3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 3514 Solved: 1306[Submit][Status][Discu ...
随机推荐
- 给编译出的程序添加图标(exe的图标)
安装依赖: go get github.com/akavel/rsrc 在对应程序的源码路径下创建manifest文件,图标也要放进去(xxx.ico), 命名:main.exe.manifest : ...
- 2021升级版微服务教程6—Ribbon使用+原理+整合Nacos权重+实战优化 一篇搞定
2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...
- 【Java基础】Java8 新特性
Java8 新特性 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).使用它可以写出更简洁.更灵活的代码. L ...
- Mac中安装Git
Mac 安装git 打开Mac终端输入git命令 如果出现以下代码说明已经安装 usage: git [--version] [--help] [-C <path>] [-c <na ...
- Linux学习安装
Linux学习安装 服务器指的是网络中能对其他机器提供某些服务的计算机系统,相对普通PC, 服务器指的是高性能计算机,稳定性.安全性要求更高 linux安装学习 1.虚拟机 一台硬件的机器 安装vmw ...
- Amazon Selling Partner API 开发笔记
资料整理 1.sp-api介绍:https://developer.amazonservices.com/ 2.github文档:https://github.com/amzn/selling-par ...
- Java 如何给Word文档添加多行文字水印
前言 我在以往的文章中曾介绍过如何给Word文档添加文本水印和图片水印,及怎样删除文档中的水印.关于文本水印,之前那篇教程里主要指的是单行字体的水印,而在操作Word文档时,有时也会碰到需要添加多行文 ...
- 浅谈前端常用脚手架cli工具及案例
前端常用脚手架工具 前端有很多特定的脚手架工具大多都是为了特定的项目类型服务的,比如react项目中的reate-react-app,vue项目中的vue-cli,angular 项目中的angula ...
- 在OpenDaylight controller上开发App
安装环境:Ubuntu18.04 一.安装依赖 1. 安装JDK: sudo apt update sudo apt install openjdk-8-jdk-headless 选择默认的 JDK: ...
- bootstrap 轮播图带缩列图两端对齐,并自动换行然后左对齐!
禁止自动轮播 data-interval="false" 完整代码如下: 1 <!DOCTYPE html> 2 <html> 3 4 <head&g ...