一、题面

POJ3264

二、分析

  典型的区间问题,没有更新只有查询。

  可以用线段树,也可以用ST表,但ST表空间上可能会多点。

  查询的时候需要注意的是,在判断区间是完全属于右子树还是左子树时,要根据建树的情况来选择,不然会出错。具体看代码

三、AC代码

 #include <cstdio>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <fstream> using namespace std; const int MAXN = 5e4 + ;
const int INF = 2e8;
int Data[MAXN], Max, Min;
struct Node
{
int l, r;
int nMax, nMin;
}segTree[MAXN<<]; void Build(int p, int L, int R)
{
segTree[p].l = L;
segTree[p].r = R;
if(L == R)
{
segTree[p].nMax = segTree[p].nMin = Data[R];
return;
}
int mid = (L + R) >> ;
Build(p<<, L, mid);
Build(p<< | , mid + , R);
segTree[p].nMax = max(segTree[p<<].nMax, segTree[p<<|].nMax);
segTree[p].nMin = min(segTree[p<<].nMin, segTree[p<<|].nMin); } void Query(int v, int L, int R)
{
int l = segTree[v].l;
int r = segTree[v].r;
if(l == L && r == R)
{
//cout << l << " ---- " << r << " : ";
//cout << segTree[v].nMax << " -- " << segTree[v].nMin << endl;
Max = max(segTree[v].nMax, Max);
Min = min(segTree[v].nMin, Min);
return;
}
int mid = (l + r) >> ;
//因为前面建树的时候是mid+1,所以这里必须是<不能有等于
if(L > mid)
{
Query(v<< | , L, R);
}
else if(R <= mid)
{
Query(v<<, L, R);
}
else
{
Query(v<<, L, mid);
Query(v<< | , mid + , R);
}
} int main()
{
//freopen("input.txt", "r", stdin);
int N, Q;
while(scanf("%d %d", &N, &Q) != EOF)
{
int L, R;
for(int i = ; i <= N; i++)
scanf("%d", &Data[i]);
Build(, , N);
for(int i = ; i < Q; i++)
{
Max = -INF, Min = INF;
scanf("%d %d", &L, &R);
Query(, L, R);
printf("%d\n", Max - Min);
}
}
}
 #include <cstdio>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <fstream> using namespace std;
const int MAXN = 5e4 + ;
const int INF = 2e8;
int Data[MAXN];
int STmax[MAXN][], STmin[MAXN][];
int Logn[MAXN]; void Pre_log()
{
Logn[] = , Logn[] = ;
for(int i = ; i < MAXN; i++) {
Logn[i] = Logn[i/] + ;
}
} void Pre_st(int N)
{
for(int i = ; i <= N; i++) {
STmin[i][] = STmax[i][] = Data[i];
}
for(int j = ; j <= Logn[N]; j++) {
for(int i = ; i + (<<j) - <= N; i++) {
STmax[i][j] = max(STmax[i][j-], STmax[i+(<<(j-))][j-]);
STmin[i][j] = min(STmin[i][j-], STmin[i+(<<(j-))][j-]);
}
}
} int Query_min(int L, int R)
{
int k = Logn[R - L + ];
return min(STmin[L][k], STmin[R-(<<k)+][k]);
} int Query_max(int L, int R)
{
int k = Logn[R - L + ];
return max(STmax[L][k], STmax[R-(<<k)+][k]);
} int main()
{
//freopen("input.txt", "r", stdin);
int N, Q;
Pre_log();
while(scanf("%d %d", &N, &Q) != EOF)
{
int L, R;
for(int i = ; i <= N; i++)
scanf("%d", &Data[i]);
Pre_st(N);
for(int i = ; i < Q; i++)
{
int ansMax, ansMin;
scanf("%d %d", &L, &R);
ansMax = Query_max(L, R);
ansMin = Query_min(L, R);
printf("%d\n", ansMax - ansMin);
}
}
}

POJ_3264 Balanced Lineup 【线段树 + 区间查询】的更多相关文章

  1. BZOJ-1699 Balanced Lineup 线段树区间最大差值

    Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 41548 Accepted: 19514 Cas ...

  2. [POJ] 3264 Balanced Lineup [线段树]

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 34306   Accepted: 16137 ...

  3. 【POJ】3264 Balanced Lineup ——线段树 区间最值

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 34140   Accepted: 16044 ...

  4. bzoj 1636: [Usaco2007 Jan]Balanced Lineup -- 线段树

    1636: [Usaco2007 Jan]Balanced Lineup Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 772  Solved: 560线 ...

  5. POJ 3264 Balanced Lineup 线段树 第三题

    Balanced Lineup Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line ...

  6. poj 3264 Balanced Lineup(线段树、RMQ)

    题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...

  7. POJ 3264 Balanced Lineup (线段树)

    Balanced Lineup For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the s ...

  8. POJ 3264 Balanced Lineup 线段树RMQ

    http://poj.org/problem?id=3264 题目大意: 给定N个数,还有Q个询问,求每个询问中给定的区间[a,b]中最大值和最小值之差. 思路: 依旧是线段树水题~ #include ...

  9. POJ3264 Balanced Lineup —— 线段树单点更新 区间最大最小值

    题目链接:https://vjudge.net/problem/POJ-3264 For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000 ...

  10. POJ3264 Balanced Lineup 线段树区间最大值 最小值

    Q个数 问区间最大值-区间最小值 // #pragma comment(linker, "/STACK:1024000000,1024000000") #include <i ...

随机推荐

  1. Ha-Federation-hdfs +Yarn集群部署方式

    经过一下午的尝试,终于把这个集群的搭建好了,搭完感觉也没有太大的必要,就当是学习了吧,为之后搭建真实环境做基础. 以下搭建的是一个Ha-Federation-hdfs+Yarn的集群部署. 首先讲一下 ...

  2. InteliJ中文乱码;IDE快捷键使用

    启动服务器的时候出现如图 解决方法: 对服务器的位置进行编辑 增加如图的信息 -Dfile.encoding=UTF-8

  3. javascript总结37:DOM:innerText 和 innerHTML

    innerText 和 innerHTML 作用: 给双标签的元素设置内容/获取双标签里面的内容 不同点: innerText 只是用于获取文本或设置文本 innerHTML 不仅可以用于设置/获取文 ...

  4. page next page prev

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  5. MATLAB搬移到别的电脑出现License Manager Error -9

    是注册码的问题,不需要重装,主要是以前的安装包不见了.解决办法: 下一个KeyGen的MLMCrypt.exe文件.运行之后在当前目录下出现一个LICENSE.DAT文件. 复制到matlab.exe ...

  6. Python之安装第三方扩展库

    PyPI 地址:https://pypi.python.org/pypi 如果你知道你要找的库的名字,那么只需要在右上角搜索栏查找即可. 1.pip安装扩展库 (1)安装最新版本的扩展库: cmd&g ...

  7. modelsim使用常见问题及解决办法集锦 ②

    二.Error deleting “msim_transcript” Error deleting “msim_transcript”:permission denied. Check the Nat ...

  8. spring Mybatis集成

    pom文件 <?xml version="1.0" encoding="UTF-8"?><project xmlns="http:/ ...

  9. [leetcode] 4. Path Sum

    终于到了二叉树.题目如下: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that ...

  10. 构造复杂Lambda困惑之学会用LinqPad和Linqer实现Sql 和 Lambda之间的互转

    一:linq的话我们可能会遇到两个问题: 1. 我们的linq出现性能低下的时候,如果优化???? 我们写的linq所生成的sql是无法控制的... (要做性能优化,必须预先知道sql会生成啥样的?? ...