2016大连网络赛 H题 传送门:HDU - 5875


Function Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)

Problem Description

  The shorter, the simpler. With this problem, you should be convinced of this truth.

  You are given an array A of N postive integers, and M queries in the form \((l,r)\). A function \(F(l,r) (1≤l≤r≤N)\) is defined as:
\[ F(l,r)=\begin{cases} A_l & l=r \\ F(l,r-1) mod A_r & l<r \\ \end{cases}\]
  You job is to calculate F(l,r), for each query (l,r).

Input

  There are multiple test cases.

  The first line of input contains a integer T, indicating number of test cases, and T test cases follow.

  For each test case, the first line contains an integer \(N(1≤N≤100000)\).
  The second line contains N space-separated positive integers: \(A_1,…,A_N (0≤A_i≤10_9)\).
  The third line contains an integer M denoting the number of queries.
  The following M lines each contain two integers \(l,r (1≤l≤r≤N)\), representing a query.

Output

  For each query\((l,r)\), output \(F(l,r)\) on one line.

Sample Input

1
3
2 3 3
1
1 3

Sample Output

2

Source

2016 ACM/ICPC Asia Regional Dalian Online


题目大意:

  • 给定序列\(A_N\),操作\(F(l,r)\)表示查询\(A_l mod A_{l+1} mod……mod A_{r}\)

基本思路:

  • 首先要分析多次取模操作的特征。\(a mod b\)对于a<b时无意义,\(a mod b mod c\)对于b<c无意义。所以,区间里有效取模应该是递减的。
  • 再进一步思考可以发现 取模过程的递减非常快 ,至少也是\(a mod b > a/2\),注意到一旦a变成0就可以不考虑后面的区间,也就是说施加取模次数是log级的,最多也就30次左右。

具体实现:

  • 预处理是个很大的问题,最简单的办法是 记录\(A_i\)后面第一个比\(A_i\)小的数的位置 ,\(n^2\)复杂度明显太慢。但仔细一想,只有非常极端的情况复杂度才会达到\(n^2\)。(然后居然真的就这么过了哈哈哈)
  • 考虑更优化的预处理方法:每次只需要知道这个数后面第一个比它小的数,有点类似区间最小值,只不过要从左到右选择区间,在RMQ上进行修改即可。
  • 查询过程就很容易了实现了,每次跳到下一个位置,当前值为0或者超出区间则退出。

注意事项:

  • 根据题意(和做题习惯),查询操作应该是很多,所以一定要预处理。每次查询都找一边当前区间的LIS的做法是不行的。
  • 所以这不就是个区间LIS么。

Codes:

暴力版本:

#include<bits/stdc++.h>
using namespace std;const int MAXN = 100010;int main()
{int t,n,m,a[MAXN],nex[MAXN];scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=1; i<=n; ++i)scanf("%d",&a[i]);for(int i=1; i<=n; ++i){nex[i] = 0;for(int j=i+1; j<=n; ++j)if(a[i] > a[j]){nex[i] = j;break;}}scanf("%d",&m);while(m--){int l,r;scanf("%d %d",&l,&r);int ans = a[l],now = nex[l];while(now <= r && now != 0){ans %= a[now];if(ans == 0)break;now = nex[now];}printf("%d\n",ans);}}return 0;
}

修改RMQ版本:


咕咕咕

转载于:https://www.cnblogs.com/MMMMMMing/p/9561668.html

HDU - 5875 Function [单调性剪枝+预处理]相关推荐

  1. HDU - 5875 Function(单调栈)

    题目链接:点击查看 题目大意:给出一段连续数列,在给出m个询问,要求按照给出的函数查询得到结果 题目分析:第一眼一看题目会觉得是个递归题目,但是盲目递归肯定会TLE,所以我们要分析这个题目到底要干什么 ...

  2. 【HDU - 5875】Function(线段树,区间第一个小于某个数的数 或 RMQ二分)

    题干: The shorter, the simpler. With this problem, you should be convinced of this truth.        You a ...

  3. HDU 5608 function (杜教筛)

    function 推式子 n2−3n+2=∑d∣nf(d)calulateS(n)∑i=1nf(i)mod109+7n ^ 2 - 3n + 2 = \sum_{d \mid n} f(d)\\ ca ...

  4. HDU 1175 连连看 dfs+剪枝

    点击打开链接 连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

  5. HDU 6750 Function(莫比乌斯反演)(2020百度之星初赛1)

    Function 推式子 S(n)=∑i=1n∑d∣id[gcd(d,id)==1]=∑d=1nd∑d∣i[gcd(d,id)==1]=∑d=1nd∑i=1nd[gcd(d,i)==1]=∑d=1nd ...

  6. Tempter of the Bone HDU - 1010(DFS + 奇偶剪枝)

    题目 这个题思路不难,就是不用奇偶剪枝的话会出现TLE,奇偶剪枝说白了就是一个矩阵分成两种区域,从一种区域走到另一个区域必是奇数步数,从一种区域走回自己的区域必是偶数步数,就算出现了障碍物这个结论依旧 ...

  7. hdu - 1010 dfs + 奇偶剪枝

    problem - 1010 找有多少条路可以到达目的地.如果能到达的话必须在t时刻.先统计有多少个不能走的点,如果n*m-wall,(wall表示'X'点数量 )<= k 的话,一定无法在t时 ...

  8. HDU - 5875 2016 ACM/ICPC 大连网络赛 H题 暴力

    题目链接 题意:给你一个区间l,r一直将val[l]模上val[l+1],val[l+2]...val[r],因为一个模上比前一个数小数是没有意义的,所以需要将每一个点找到右边第一个小于他的点就行. ...

  9. HDU 5400 Arithmetic Sequence

    HDU 5400 Arithmetic Sequence /** HDU 5400 Arithmetic Sequence 直接预处理求解就好了 预处理找出以a[i]结尾最长的subArr长度(满足条 ...

最新文章

  1. 你了解计算机系统的层次结构吗?计算机语言怎么发展的?
  2. 【Spark亚太研究院系列丛书】Spark实战高手之路-第3章Spark架构设计与编程模型第1节 ①...
  3. NYOJ 613 免费馅饼
  4. 21、Java并发性和多线程-Java中的锁
  5. unzip 分包_建筑总包企业计量分包成本时,未取得相应分包发票,增值税如何处理?...
  6. 647. Palindromic Substrings
  7. C++函数的传入参数是指针的指针(**)的详解
  8. 工作54:对ref的理解
  9. oracle truncate 日期,【Oracle】truncate和delete区别
  10. jsp中如何将Java对象转成js对象?
  11. 特斯拉限时赠送4.6万元完全自动驾驶功能,马斯克:市值能涨1000%
  12. asp.net 2.0 + sqlserver2005 数据依赖缓存
  13. Kafka集群中 topic数据的分区 迁移到其他broker
  14. 英特尔技术领导委员会(GTC) 专题系列之主席致辞
  15. 湿空气性质计算,随笔与学习记录(2.水蒸气分压,含湿量,相对湿度)
  16. java 如何查看文件编码_java判断文件编码 终于弄懂了编码是怎么回事
  17. SAP中通过删除新建未记账成本要素期间的方式更改成本要素类别
  18. 分享漂亮有创意的思维导图,流程图模板
  19. 北京游玩攻略,-怎么游玩清华北大
  20. 第二章 MATLAB数据与矩阵

热门文章

  1. textview 复制粘贴_Android TextView使用剪贴板复制粘贴
  2. hive的hql怎么运行_在Ubuntu上安装Apache Hive并运行HQL查询
  3. java xml stax_如何使用Java StAX Iterator API用Java编写XML文件
  4. 10.14-10.20学习总结
  5. ROS的学习(七)ROS的话题
  6. (一)mybatis之JDBC介绍
  7. [转]自己写PHP扩展之创建一个类
  8. 【索引】反向索引--条件 范围查询(二)
  9. Linux I2C设备驱动编写(二)
  10. 我的Linux笔记5--我要连网