Problem Description:

考虑如下的序列生成算法:从整数n开始,如果n是偶数,把它除以2;如果 n 是奇数,把它乘3加1。用新得到的值重复上述步骤,直到 n = 1 时停止。例如,n = 22 时该算法生成的序列是:  22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1 。
人们猜想(没有得到证明)对于任意整数 n,该算法总能终止于 n = 1。这个猜想对于至少 1 000 000内的整数都是正确的。对于给定的 n,该序列的元素(包括 1)个数被称为 n 的循环节长度。在上述例子中,22 的循环节长度为 16。输入两个数 i 和 j,你的任务是计算 i 到 j(包含 i 和 j)之间的整数中,循环节长度的最大值。

Input:

输入包含一个整数m(1≤m≤10^5),表示测试组数,接下来的m行每行包含两个整数 i 和 j(0<i≤j≤50000)。

Output:

对于每对整数 i 和 j,输出二者之间的整数中的最大循环节长度。

Sample Input:

4
1 10
100 200
201 210
900 1000

Sample Output:

20
125
89
174
解题思路:打表预处理1~5×10^5每个数的循环节长度,然后建立线段树,区间查询(O(logn))即可,所以总的时间复杂度大概为O(nlogn)。
AC代码:
 #include<bits/stdc++.h>
using namespace std;
const int maxn=;
int a,b,n,m,tmp,s[maxn+],t[(maxn+)<<];
void build(int l,int r,int x){
int mid=(l+r)>>;
if(l==r){t[x]=s[mid];return;}
build(l,mid,x<<);
build(mid+,r,x<<|);
t[x]=max(t[x<<],t[x<<|]);
}
int query(int l,int r,int x){
if(a<=l&&b>=r)return t[x];//如果该节点表示的区间恰好是要查询的区间,直接返回结果,即[l,r]是[a,b]的一个子集,直接返回最大值,不用继续往下查找
else{
int mid=(l+r)>>;
if(b<=mid)return query(l,mid,x<<);//判断(编号)区间在哪棵子树上[a,b]在[l,r]的左子树[l,mid]上
else if(a>mid)return query(mid+,r,x<<|);//[a,b]在[l,r]的右子树[mid+1,r]上
else return max(query(l,mid,x<<),query(mid+,r,x<<|));//表示[a,b],有一部分在[l,mid]上,有一部分在[mid+1,r]上,直接返回左右区间的最大值
}
}
int main(){
for(int i=;i<=maxn;++i){//预处理打表
tmp=i;n=;
while(tmp!=){tmp=(tmp%)?*tmp+:tmp/;++n;}
s[i]=n;
}
build(,maxn,);//建树
while(~scanf("%d",&m)){
while(m--){
scanf("%d %d",&a,&b);
printf("%d\n",query(,maxn,));
}
}
return ;
}

ACM_3n+1问题(克拉兹问题+线段树区间查询最大值)的更多相关文章

  1. Light OJ-1082 - Array Queries,线段树区间查询最大值,哈哈,水过~~

                                                                                                        ...

  2. 线段树 区间查询最大值,单体修改 hdu 1754

    #include<cstdio> #include<algorithm> #include<string.h> #include<math.h> #in ...

  3. HDU 1754 I Hate It(线段树区间查询,单点更新)

    描述 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老 ...

  4. POJ_3468 A Simple Problem with Integers 【线段树区间查询+修改】

    一.题目 POJ3468 二.分析 裸的线段树区间查询+修改. 三.AC代码 #include <cstdio> #include <iostream> #include &l ...

  5. ACM_最值差(线段树区间查询最值)

    最值差 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定N个数A1A2A3A4...AN.求任意区间Ai到Aj中的最大数与最小 ...

  6. POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 53703   Accepted: 25237 ...

  7. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  8. HDU 4614 Vases and Flowers(二分+线段树区间查询修改)

    描述Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to ...

  9. POJ_3368 Frequent values 【线段树+区间查询】

    一.题面 POJ3368 二.分析 仍然是一道只需要区间查询不需要区间修改的线段树题. 这题的题面比较特别,它是一组非减的数组.当需要去找一段区间内出现次数最多的数字时,这些数字必然是连续的,那么就可 ...

随机推荐

  1. (一)python条件语句和基本数据类型

    条件语句 语法一:if...else  if <条件成立>: 处理过程 else: 处理过程 语法二:if...elif...else if <条件1成立>: 处理过程1 el ...

  2. js之获取html标签的值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. [bzoj4300][绝世好题] (动规)

    Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数 ...

  4. Poor Hanamichi

    Poor Hanamichi Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. JS动态添加div,然后在div中添加元素

    需求: 组织部中有个这样的需求,根据年份动态显示该年份下的定性指标! 我的做法: 先是放一个空的div,让后根据指标的数据,动态的往div中添加元素. 代码: 空的div,存放定性指标 <div ...

  6. FFT快速傅里叶变换

    FFT太玄幻了,不过我要先膜拜HQM,实在太强了 1.多项式 1)多项式的定义 在数学中,由若干个单项式相加组成的代数式叫做多项式.多项式中的每个单项式叫做多项式的项,这些单项式中的最高项次数,就是这 ...

  7. Non-inclusive cache method using pipelined snoop bus

    A non-inclusive cache system includes an external cache and a plurality of on-chip caches each havin ...

  8. Ubuntu 16.04安装FTP客户端filezilla

    1.安装: sudo apt-get install filezilla 参考: http://os.51cto.com/art/201103/247564.htm

  9. Mybatis在Spring环境下的启动顺序

    主要看三个类: mybatis-spring-1.2.2.jar包 -> org.mybatis.spring.SqlSessionFactoryBean mybatis-3.2.6.jar包 ...

  10. ASPNET Razor 使用 @Ajax.BeginForm 需要注意到的细节

    创建空的web项目,通过Nuget引用mvc组件来搭建空的MVC项目时, 在视图页面中无法使用@Ajax.BegForm来进行异步提交数据, 而新建默认的MVC模板项目却能够正常使用@Ajax.Beg ...