题面版权来自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 ...
随机推荐
-
时间戳 时区 java mysql
当一个时间 比如2016年5月6日,生成时间戳.这个运算是与时区有关的.首先得确认这个时间是哪个时区的,然后转换成utc时区的时间.再减去1970,得到的秒数,就是时间戳. 时间戳是个一定的值,他与时 ...
-
Bloom Filter学习
参考文献: Bloom Filters - the math http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html B ...
-
ajax 例子
引用 function initCsvModel(year,cityId){ var args = new Object(); args.url= "listUpload!initCsvMo ...
-
어느 도시 보유 하 면 사랑 이다(事態が発生すれば、ある都市の恋はしません)【Si les villes un amour】{If have love in a city}
如果在北京拥有爱情 半夜在簋街喝啤酒 吃小龙虾 在后海的苦情歌声里 搂着你数那四合院的瓦片 如果在上海拥有爱情 去外滩手挽手 吹吹风 坐一下午 去城隍庙尝试各种小吃 嘲笑你嘴角残余的糯米糕 如果在杭州 ...
-
Google机器学习教程心得(一)
Hello world Google Machine Learning Recipes 1 官方中文博客 http://chinagdg.org/2016/03/machine-learning-re ...
-
iOS 数字每隔3位添加一个逗号的
+(NSString *)countNumAndChangeformat:(NSString *)num { ; long long int a = num.longLongValue; ) { co ...
-
Java开发经常容易犯的错误
调用Set.addAll()方法时抛UnsupportedOperationException异常 上面的Set是Map中keySet的返回结果. 程序中这样两句代码运行时,抛UnsupportedO ...
-
发布逸出 java this 逸出【转】
转自:http://blog.csdn.net/joker_zhou/article/details/7322801 (1)发布:发布是指将一个对象,使其引用储存到一个其他代码可以访问到的地方,在一个 ...
-
Metasploit渗透测试模块(一)
1.Metasploit模块加载 初始化界面,成功要加载数据库 查看 Metasploit中已近存在的漏洞模块使用 show payloads
-
idea中使用FindBugs-IDEA插件
下载 - 安装 - 重启idea即可: 项目右键或者文件右键即可看到 FindBugs 选项. 选择某个选项直接检测即可.检测结果如下图: 这里的Correctness是重点关注对象.这里面的错误往 ...