题面版权来自Shlw题目链接

题目背景

题目描述

给定一个数列,元素均为正整数,对其以下两种操作:

1.将某区间每一个数变为其算术平方根(取整)

2.求出某区间内所有数的最大值

输入输出格式

输入格式:

第一行包含两个整数$n$,$m$,分别表示该数列数字的个数和操作的总个数。第二行包含n个用空格分隔的整数,表示给定的数列。接下来m行,每行包含3个整数,表示一个操作,具体如下:

操作1:1 $x$ $y$ 含义:将区间[$x$,$y$]内每个数进行开方。

操作2:2 $x$ $y$ 含义:输出区间[$x$,$y$]内所有数的最大值。

输出格式:

输出包含若干行整数,即为所有操作2的结果。

输入输出样例

输入样例#1:

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
输出样例#1:

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 区间开方的更多相关文章

  1. 线段树 区间开方区间求和 & 区间赋值、加、查询

    本文同步发表于 https://www.zybuluo.com/Gary-Ying/note/1288518 线段树的小应用 -- 维护区间开方区间求和 题目传送门 约定: sum(i,j) 表示区间 ...

  2. LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)

    #6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5   题目描述 给出 ...

  3. LibreOJ 6281 数列分块入门 5(分块区间开方区间求和)

    题解:区间开方emmm,这马上让我想起了当时写线段树的时候,很显然,对于一个在2^31次方以内的数,开方7-8次就差不多变成一了,所以我们对于每次开方,如果块中的所有数都为一了,那么开方也没有必要了. ...

  4. HDU 4027 Can you answer these queries?(线段树区间开方)

    Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65768/65768 K ...

  5. Can you answer these queries?-HDU4027 区间开方

    题意: 给你n个数,两个操作,0为区间开方,1为区间求和 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027 思路: 如果当该区间的数都为1,我们没必要 ...

  6. BZOJ 3038: 上帝造题的七分钟2【线段树区间开方问题】

    3038: 上帝造题的七分钟2 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1469  Solved: 631[Submit][Status][Dis ...

  7. HDU 4027—— Can you answer these queries?——————【线段树区间开方,区间求和】

    Can you answer these queries? Time Limit:2000MS     Memory Limit:65768KB     64bit IO Format:%I64d & ...

  8. 上帝造题的七分钟2/花神游历各国/GSS4 线段树维护区间开方 By cellur925

    题目传送门 或者 另一个传送门 询问区间和都好说.但是开方?? 其实是这样的,一个数(1e9)以内连续开方6次就会变成1,于是我们就可在开方操作上进行暴力修改.暴力修改的意思其实也就是找到叶子节点进行 ...

  9. BZOJ 3211: 花神游历各国【线段树区间开方问题】

    3211: 花神游历各国 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 3514  Solved: 1306[Submit][Status][Discu ...

随机推荐

  1. 低功耗降线性稳压器,24V转5V降压芯片

    PW2330开发了一种高效率的同步降压DC-DC变换器3A输出电流.PW2330在4.5V到30V的宽输入电压范围内工作集成主开关和同步开关,具有非常低的RDS(ON)以最小化传导 损失.PW2330 ...

  2. 干电池升压3.3V的电源芯片

    PW5100适用于一节干电池升压到3.3V,两节干电池升压3.3V的升压电路,PW5100干电池升压IC. 干电池1.5V和两节干电池3V升压到3.3V的测试数据 两节干电池输出500MA测试: PW ...

  3. Vue案例之todoLIst实现

    使用Vue实现todolist案例,如有不对敬请大佬多多指教 功能: 1.增加功能:在新增版块里面的输入框内输入数据,点击后面的"添加"按钮,将输入的数据添加到列表中,默认是未完成 ...

  4. mysql半同步复制跟无损半同步区别

    mysql半同步复制跟无损半同步复制的区别: 无损复制其实就是对semi sync增加了rpl_semi_sync_master_wait_point参数,来控制半同步模式下主库在返回给会话事务成功之 ...

  5. JavaScript中函数的this指向!

    JavaScript的this的指向问题! 这是我自己敲的, 报错! <button>点击查看绑定事件的this指向!</button> <script> // 函 ...

  6. Linux网卡没有eth0显示ens33原因以及解决办法

    原因 首先说明下eth0与ens33的关系: 目前的主流网卡为使用以太网络协定所开发出来的以太网卡 (Ethernet),因此我们 Linux 就称呼这种网络接口为 ethN (N 为数字). 举例来 ...

  7. Linux中LPC、RPC、IPC的区别

    其实这玩意儿就是纸老虎,将英文缩写翻译为中文就明白一半了. IPC:(Inter Process Communication )跨进程通信 这个概念泛指进程之间任何形式的通信行为,是个可以拿来到处套的 ...

  8. 【转载】Linux中找不到ifconfig命令的解决方法

    ifconfig命令出错 ifconfig命令是设置或显示网络接口的程序,可以显示出我们机器的网卡信息,可是有些时候最小化安装CentOS等Linux发行版的时候会默认不安装ifconfig等命令,这 ...

  9. node集群(cluster)

    使用例子 为了让node应用能够在多核服务器中提高性能,node提供cluster API,用于创建多个工作进程,然后由这些工作进程并行处理请求. // master.js const cluster ...

  10. map 传递给函数的代价

    https://github.com/unknwon/the-way-to-go_ZH_CN/blob/master/eBook/08.1.md map 传递给函数的代价很小:在 32 位机器上占 4 ...