给我们n个数,然后有m个询问,每个询问为L,R,询问区间[L,R]的最大最小值,最小公约数,最大公约数,和,异或,或,且

这些问题通通可以用RMQ的思想来解决。

以下用xor来作为例子

设dp[i][j]为以i开头的,长度为2^j的区间的所有值得异或

那么dp[i][j] = dp[i][j-1] xor dp[i+(1<<(j-1))][j-1]

这样,运用动态规划的思想,我们可以在nlogn的时间复杂度内算出以任意点开头的,长度为1,2,4,8...2^j 的区间的异或值。

那么询问任意区间的异或值时,只要将L->R之间的距离用二进制数来表示,那么只需要log(R-L+1)步就能求出所需的询问。

 1 #include <stdio.h>
 2 #include <string.h>
 3 const int N = 100000 + 10;
 4 int a[N];
 5 int dp[N][30];
 6 int n;
 7 void init()
 8 {
 9     for(int i=1;i<=n;++i)
10         dp[i][0] = a[i];
11     for(int j=1;(1<<j)<=n;++j)
12     {
13         for(int i=1;i+(1<<j)-1<=n;++i)
14         {
15             dp[i][j] = dp[i][j-1] ^ dp[i+(1<<(j-1))][j-1];
16         }
17     }
18 }
19
20 int query(int L, int R)
21 {
22     int ans = 0;
23     int seg = R - L + 1;
24     int tmp = 1, i = 0;
25     while(seg)
26     {
27         if(seg&1)
28         {
29             ans ^= dp[L][i];
30             L += tmp;
31         }
32         seg>>=1;
33         i++;
34         tmp = tmp * 2;
35     }
36     return ans;
37 }
38 int main()
39 {
40     while(scanf("%d",&n)!=EOF)
41     {
42         for(int i=1;i<=n;++i)
43             scanf("%d",&a[i]);
44         init();
45         int m,L,R;
46         scanf("%d",&m);
47         while(m--)
48         {
49             scanf("%d%d",&L,&R);
50             printf("%d\n",query(L,R));
51         }
52     }
53     return 0;
54 }

View Code

同理,以上所说的其他问题同样能够求解。

预处理的时间复杂度是O(nlogn), 每次询问是O(logn)

转载于:https://www.cnblogs.com/justPassBy/p/4836397.html

询问任意区间的min,max,gcd,lcm,sum,xor,or,and相关推荐

  1. hdu-3071 Gcd Lcm game---质因数分解+状态压缩+线段树

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3071 题目大意: 给定一个长度为n的序列m次操作,操作的种类一共有三种 查询 L :查询一个区间的所 ...

  2. 将数据归一化到任意区间范围的方法

    将数据归一化到任意区间范围的方法    一般常见的数据归一化,是归一化到0~1,或者-1~1的区间,但在一些特殊场合下,我们需要根据实际情况归一化到其他任意区间,方法是:     将数据归一化到[a, ...

  3. LINQ to SQL语句之 Count/Sum/Min/Max/Avg

    Count/Sum/Min/Max/Avg操作符 适用场景:统计数据吧,比如统计一些数据的个数,求和,最小值,最大值,平均数. Count 说明:返回集合中的元素个数,返回INT类型:不延迟.生成SQ ...

  4. Linq-语句之Select/Distinct和Count/Sum/Min/Max/Avg

    上一篇讲述了LINQ,顺便说了一下Where操作,这篇开始我们继续说LINQ to SQL语句,目的让大家从语句的角度了解LINQ,LINQ包括LINQ to Objects.LINQ to Data ...

  5. POJ 2429 GCD LCM Inverse

    设答案为ans1,ans2 ans1=a1*gcd,ans2=a2*gcd,a1,a2互质 gcd*a1*b1=lcm,gcd*a2*b2=lcm a1*b1=lcm=(ans1*ans2)/gcd= ...

  6. [JavaScript] JS求闭区间[min,max]的和

    求闭区间[min,max]的和 区间是指一个集合,包含在某两个特定实数之间的所有实数,亦可能同时包含该两个实数. 闭区间[10,20]表示{X|10<=X<=20},包含10和20 开区间 ...

  7. 10.matlab中sort , min/max以及ceil 函数

    1.sort  排序 2.min/max 求最大最小值    3.ceil----向上取整(不进行四舍五入)

  8. P3175 [HAOI2015]按位或(Min - Max容斥,FMT,概率期望,全网最清晰的题解!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P3175 Prob ...

  9. splunk的统计分析功能——特定字段的统计功能包括取值分布(+topK,min/max/平均值)...

    特定字段的统计功能--取值分布,topK,min/max/平均值 例如: date_second 60 值, 100% 的事件 时段平均值 时段最大值 时段最小值 上限值 时段上限值 罕见值 具有此字 ...

最新文章

  1. 【贪心】【P5078】Tweetuzki 爱军训
  2. android:AlertDialog控件
  3. ZABBIX3.0配置邮件报警
  4. 如何在VMware Player中设置和安装Windows Home Server“ Vail”
  5. Python 数据分析三剑客之 Pandas(一):认识 Pandas 及其 Series、DataFrame 对象
  6. Android 开源框架 ( 二 ) 基于OkHttp进一步封装的okhttp-utils介绍
  7. 微信上如何发送GIF动图
  8. -Android的发展webservice-号码归属地查询
  9. java paypal开发详解_PayPal 开发详解(六):下载paypal立即付款SDK 并编译打包
  10. 考研的意义---解读
  11. hadoop基础----hadoop理论(四)-----hadoop分布式并行计算模型MapReduce详解
  12. 双柱状图与双折线图混合
  13. .dwg(sw)-exb
  14. GDOI2021赛后总结高一赛季总结
  15. 汉字生成woff字体文件
  16. mysql如何降级_降级MySQL(参考MySQL官方文档)
  17. 爬取小猪网的短租房信息
  18. B/S结构下套打票据实现 - Lodop打印组件
  19. 读书笔记:多智能体机器学习(二)
  20. 【人工智能】人工智能起源以来,经过科学工作者们的大量研究与实践,向着体系化、理论化方向发展

热门文章

  1. centos7设置静态IP地址
  2. C# List的方法和属性
  3. Zookeeper 3.6.0启动时 8080端口被占用
  4. Kotlin入门(22)适配器的简单优化
  5. Android开发笔记(一百六十)休眠模式下的定时器控制
  6. linux 判断上一条命令是否指令成功
  7. 打印出所有的 水仙花数 ,所谓 水仙花数 是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 水仙花数 ,因为153=1的三次方+5的三次方+3的三次方。...
  8. 为了测试自动驾驶,福特将车带到了一个仿造城市
  9. 【原创】Oracle RAC原理和安装
  10. 网页中JS实现(调用)打印预览功能