博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3264 线段树 ST
阅读量:6026 次
发布时间:2019-06-20

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

题意:给你一个数列,从中挑一段,问你这段数的最大值减最小值是多少。

思路:线段树。

// by Sirius_Ren#include 
#include
#define N 50000using namespace std;int n,q,xx,yy,tree[N*4],MAX[N*4],MIN[N*4],ansmax,ansmin;void build(int l,int r,int pos){ if(l==r){scanf("%d",&tree[pos]);MAX[pos]=MIN[pos]=tree[pos];return;} int mid=(l+r)/2; build(l,mid,pos*2),build(mid+1,r,pos*2+1); MAX[pos]=max(MAX[pos*2],MAX[pos*2+1]);MIN[pos]=min(MIN[pos*2],MIN[pos*2+1]);}void query(int l,int r,int pos){ if(l>=xx&&r<=yy){ansmax=max(ansmax,MAX[pos]);ansmin=min(ansmin,MIN[pos]);return;} int mid=(l+r)/2; if(mid>=yy)query(l,mid,pos*2); else if(mid

这里写图片描述

ST:

#include 
#include
#include
using namespace std;int n,m,xx,yy,MAX,MIN,f[1000001][17],g[1000001][17];int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&f[i][0]),g[i][0]=f[i][0]; for(int j=1;j<=16;j++) for(int i=1;i<=n;i++) if(i+(1<
<=n){ f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]); g[i][j]=min(g[i][j-1],g[i+(1<<(j-1))][j-1]); } while(m--){ scanf("%d%d",&xx,&yy); int k=log(yy-xx+1)/log(2.0); MAX=max(f[xx][k],f[yy-(1<

这里写图片描述

转载于:https://www.cnblogs.com/SiriusRen/p/6532435.html

你可能感兴趣的文章
RandomAccessFile和memory-mapped files
查看>>
.NET Core采用的全新配置系统[3]: “Options模式”下的配置是如何绑定为Options对象...
查看>>
MySQL隔离级别
查看>>
URAL 1051 Simple Game on a Grid
查看>>
求时间差的sql语句。 比如如下数据
查看>>
PHP后期静态绑定分析与应用
查看>>
001 有关中文乱码的处理
查看>>
[转载]大型网站运维探讨和心得
查看>>
NIO学习系列:核心概念及基本读写
查看>>
vc中ASSERT()和VERIFY()区别
查看>>
centOS 搭建SVN服务器,提交自动发布代码,详细教程,及注意事项
查看>>
HTML<div><span>字符实体
查看>>
CentOS6.3安装PowerVault MD Storage Manager
查看>>
HTML 表格
查看>>
VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三
查看>>
php 未实例化类调用方法的问题
查看>>
Anaconda jupyter notebook 出现 kernel error 解决办法
查看>>
T-SQL游标
查看>>
我对读计算机软件专业硕士的几点看法
查看>>
linux中Dcumentation目录下的basic_profiling.txt文档翻译
查看>>