士兵杀敌 三 【ST算法】
2015-07-22 18:30
344 查看
题目链接:
http://acm.nyist.net/JudgeOnline/problem.php?pid=119
解法: RMQ问题。
代码:
http://acm.nyist.net/JudgeOnline/problem.php?pid=119
解法: RMQ问题。
代码:
[code]#include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #include <complex> #include <string> #include <functional> #include <iterator> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <set> #include <map> #include <list> #include <bitset> #include <sstream> #include <iomanip> #include <fstream> #include <iostream> #include <cmath> #include <cstring> #include <cstdio> #include <time.h> #include <ctype.h> #include <string.h> #include <assert.h> using namespace std; int n, k, p, l, r; int a[100010]; int s[100010][20]; int maxsum[100010][20], minsum[100010][20]; int rmq(int l, int r) { int k = log2((double)(r - l + 1)); int MAX = max(maxsum[l][k], maxsum[r - (1 << k) + 1][k]); int MIN = min(minsum[l][k], minsum[r - (1 << k) + 1][k]); return MAX - MIN; } int main() { int t; int q; while (scanf("%d %d", &n, &q)!=EOF) { for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); maxsum[i][0] = minsum[i][0] = a[i]; } for (int j = 1; (1 << j) <= n; j++) for (int i = 1; i + (1 << j) - 1 <= n; i++) { maxsum[i][j] = max(maxsum[i][j - 1], maxsum[i + (1 << (j - 1))][j - 1]); minsum[i][j] = min(minsum[i][j - 1], minsum[i + (1 << (j - 1))][j - 1]); } int s, t; while (q--) { scanf("%d%d",&s,&t); printf("%d\n", rmq(s, t)); } } return 0; }
相关文章推荐
- error:unknow filesystem grub rescue
- CSS相对定位、绝对定位之我见
- COMPUTER HARDWARE OPENCART 主题模板 ABC-0059
- spring中关于定时器的配置
- Jquery 操作Html 控件 CheckBox、Radio、Select 控件
- mysql中Where条件中字段顺序的重要性
- C/C++学习一
- State Pattern
- LIS(最长的序列)和LCS(最长公共子)总结
- COMPUTER HARDWARE OPENCART 主题模板 ABC-0059
- Kafka配置文档
- 226题——Invert Binary Tree(队列,广度优先搜索)
- UVa10935 用map将string映射成int处理问题
- 【转】C/C++函数的系统调用的几种方式
- Jquery单选树
- 做的东西随便上传
- c语言,变长数组
- URL加载
- 关于 MySQL LEFT JOIN 你可能需要了解的三点
- VS调试时找不到dll或exe的方法