ACM_3n+1问题(克拉兹问题+线段树区间查询最大值)
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问题(克拉兹问题+线段树区间查询最大值)的更多相关文章
- Light OJ-1082 - Array Queries,线段树区间查询最大值,哈哈,水过~~
...
- 线段树 区间查询最大值,单体修改 hdu 1754
#include<cstdio> #include<algorithm> #include<string.h> #include<math.h> #in ...
- HDU 1754 I Hate It(线段树区间查询,单点更新)
描述 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老 ...
- POJ_3468 A Simple Problem with Integers 【线段树区间查询+修改】
一.题目 POJ3468 二.分析 裸的线段树区间查询+修改. 三.AC代码 #include <cstdio> #include <iostream> #include &l ...
- ACM_最值差(线段树区间查询最值)
最值差 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定N个数A1A2A3A4...AN.求任意区间Ai到Aj中的最大数与最小 ...
- POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 53703 Accepted: 25237 ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- HDU 4614 Vases and Flowers(二分+线段树区间查询修改)
描述Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to ...
- POJ_3368 Frequent values 【线段树+区间查询】
一.题面 POJ3368 二.分析 仍然是一道只需要区间查询不需要区间修改的线段树题. 这题的题面比较特别,它是一组非减的数组.当需要去找一段区间内出现次数最多的数字时,这些数字必然是连续的,那么就可 ...
随机推荐
- stall and flow separation on airfoil or blade
stall stall and flow separation Table of Contents 1. Stall and flow separation 1.1. Separation of Bo ...
- Python基础—面向对象(初级篇)
一.什么是面向对象编程 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计),python语言比较灵活即支持面向对象编程也支持面向函数式编程. 面向过程编程 ...
- Leetcode 93.复制IP地址
复制IP地址 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135& ...
- poj 2420 模拟退火法基础
/* 题意:给n个电脑,求一个点到这n个电脑的距离和最小. 模拟退火法:和poj1379的方法类似 因为坐标范围是0-10000 不妨把它看成是10000*10000的正方形来做 */ #includ ...
- jsp之${CTX}理解
jsp之${CTX} 根据自己的需要选择以下标签. <%@ taglib uri="/struts-tags" prefix="s"%> <% ...
- Spring的发展【一】
1.1. Spring1.x 时代 在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置文件中切换. ...
- J2EE 课件3 JSP标记
•JSP标记包括指令标记.动作标记和自定义标记.其中自定义标记主要讲述与Tag文件有关的Tag标记 1.指令标记page page 指令用来定义整个JSP页面的一些属性和这些属性的值,属性值用单 ...
- 洛谷—— P1419 寻找段落
https://www.luogu.org/problem/show?pid=1419 题目描述 给定一个长度为n的序列a_i,定义a[i]为第i个元素的价值.现在需要找出序列中最有价值的“段落”.段 ...
- BZOJ(6) 1084: [SCOI2005]最大子矩阵
1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3566 Solved: 1785[Submit][Sta ...
- 战术网络安全检查表 | Symantec Connect
"知己知彼,百战不殆: 不知彼而知己,一胜一负: 不知彼,不知己,每战必殆." 孙子(中国古代军事家). 孙子的话在今日仍能够使我们产生共鸣. 机构只有了解敌人和自己优缺点才能在持 ...