博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva 100 The 3n + 1 problem (RMQ)
阅读量:6253 次
发布时间:2019-06-22

本文共 1459 字,大约阅读时间需要 4 分钟。

  预处理,RMQ求区间最大值。

代码如下:

1 #include 
2 #include
3 #include
4 #include
5 #include
6 7 using namespace std; 8 9 typedef long long LL;10 const int N = 4444444;11 const int M = 22;12 int pre[N], RMQ[M][N >> 2];13 int dfs(LL n) {14 if (n <= 0) cout << n << endl;15 if (n < N && pre[n]) return pre[n];16 int tmp;17 if (n & 1) tmp = dfs(n * 3 + 1) + 1;18 else tmp = dfs(n >> 1) + 1;19 if (n < N) pre[n] = tmp;20 return tmp;21 }22 23 void PRE() {24 pre[1] = 1;25 for (int i = 2, end = N >> 2; i < end; i++) if (pre[i] == 0) dfs(i);26 // for (int i = 1; i < 20; i++) cout << i << ' ' << pre[i] << endl;27 // prepare RMQ28 for (int i = 0, end = N >> 2; i < end; i++) RMQ[0][i] = pre[i];29 for (int i = 1; i < M; i++) {30 for (int j = 0, end = (N >> 2) - (1 << i); j <= end; j++) {31 RMQ[i][j] = max(RMQ[i - 1][j], RMQ[i - 1][j + (1 << i - 1)]);32 }33 }34 }35 36 int query(int l, int r) {37 if (l > r) swap(l, r);38 int ep = (int) log2((double) r - l + 1);39 return max(RMQ[ep][l], RMQ[ep][r - (1 << ep) + 1]);40 }41 42 int main() {43 PRE();44 int l, r;45 while (cin >> l >> r) cout << l << ' ' << r << ' ' << query(l, r) << endl;46 return 0;47 }
View Code

 

——written by Lyon

转载于:https://www.cnblogs.com/LyonLys/p/uva_100_Lyon.html

你可能感兴趣的文章
java多线程 - 并发
查看>>
php-mvc新闻项目体会-1
查看>>
List 无限分类生成树结构
查看>>
在VIM编辑文本时不退出VIM前提下执行linux命令
查看>>
java多线程目录
查看>>
关于 self 和static的区别
查看>>
读《面向程序员的数据库访问性能优化法则》
查看>>
EHCACHE
查看>>
HTML 5标准中最新引入的template标签介绍
查看>>
IOS沙盒(sandbox)机制和文件操作(三)
查看>>
如何估算文章阅读时长?
查看>>
默认Web字体样式
查看>>
最全的css hack 方式
查看>>
oracle 约束
查看>>
在索智SC3807VS EVB上调试开发以太网功能(使用V3s的内部EMAC+PHY)
查看>>
C语言实现的PadLeft,在str的左边使用bychar补齐为指定的长度
查看>>
Python绘制PDF文件~超简单的小程序
查看>>
nginx 重启命令
查看>>
Oracle分页
查看>>
简单介绍JS/JQuery绑定事件的几种方式
查看>>