博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3264 Balanced Lineup
阅读量:6532 次
发布时间:2019-06-24

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

POJ_3264

    这是一个RMQ问题,可以直接用线段树处理出区间的最大及最小值,在O(logN)的时间完成每次的查询操作。

#include
#include
#define MAXD 130000 #define INF 1000000000 int a[MAXD], b[MAXD], N, Q, M; void init() {
int i, j, k; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); for(M = 1; M < N + 2; M <<= 1); for(i = 0, j = M + 1; i < N; i ++, j ++) {
scanf("%d", &k); a[j] = b[j] = k; } for(i = M - 1; i; i --) {
a[i] = a[2 * i + 1]; if(a[i] == 0 || (a[2 * i] != 0 && a[2 * i] < a[i])) a[i] = a[2 * i]; b[i] = b[2 * i + 1]; if(b[2 * i] > b[i]) b[i] = b[2 * i]; } } void solve() {
int i, s, t, min, max; for(i = 0; i < Q; i ++) {
scanf("%d%d", &s, &t); min = INF; max = 0; s = s - 1 + M; t = t + 1 + M; for(;s ^ t ^ 1; s >>= 1, t >>= 1) {
if(~s & 1) {
if(a[s ^ 1] && a[s ^ 1] < min) min = a[s ^ 1]; if(b[s ^ 1] > max) max = b[s ^ 1]; } if(t & 1) {
if(a[t ^ 1] && a[t ^ 1] < min) min = a[t ^ 1]; if(b[t ^ 1] > max) max = b[t ^ 1]; } } printf("%d\n", max - min); } } int main() {
while(scanf("%d%d", &N, &Q) == 2) {
init(); solve(); } return 0; }

转载地址:http://elqbo.baihongyu.com/

你可能感兴趣的文章
POJ2677 Tour(DP:双调巡游)
查看>>
控件哥 对 技术 的 反动 是 一种 批判 的 精神
查看>>
android 自定义控件之简单的loading框
查看>>
ZetCode PyQt4 tutorial Dialogs
查看>>
SQL 函数
查看>>
unix环境高级编程-线程控制(1)
查看>>
面试题
查看>>
mongodb入门
查看>>
vuex简介(转载)
查看>>
51nod1007:正整数分组 DP
查看>>
开始博客园之旅
查看>>
C#运行时通过字符串实例化类对象
查看>>
OPC网络资源地址列表
查看>>
使用python比较两个文件的不同之处
查看>>
传统网络配置命令与IP高级路由命令
查看>>
Python基础教程总结(二)
查看>>
iOS 程序开发
查看>>
iOS 设置控件圆角、文字、字体
查看>>
2018年统计用区划代码和城乡划分代码(截止2018年10月31日)
查看>>
vmware安装centos
查看>>