一、题面

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. linux环境下搭建osm_web服务器三(Openlays和slippymap):

    Openlays和slippymap 上一步,我们已经有了自己的地图瓦片服务器,现在,开始实现SlippyMap啦! <1>下载释放OpenLayers到 www文件夹 SlippyMap ...

  2. [SoapUI] JsonPath is to JSON what XPath is to XML

    1.通过JsonUtil验证Json的有效性 2.两种方式通过JPath读取Json的内容

  3. [Training Video - 7] [Database connection] Various databases which are supported, Drivers for database connection, SQL Groovy API

    Various databases which are supported Drivers for database connection groovy.sql.Sql package SoapUI怎 ...

  4. Java 读取jar内的文件的超简便方法

    坑爹的java课程设计,偏要用jar来运行 读取.存储jar内文件的支持也好低 存储方法: 进入jar文件其实没有说的那么困难,jar文件本质是一个zip格式的压缩文件,只是把文件后缀名改了,要用Ja ...

  5. Native2Ascii文件转换 -- 待完善

    摘自:https://www.oschina.net/code/snippet_87799_1612 Native2Ascii文件转换 -- 待完善 package com.xxx.xxx.Util; ...

  6. 汉诺塔(hanoi)

    汉诺塔代码: def hanoi(n,x,y,z): if n == 1: print(x,'-->',z) else: hanoi(n-1,x,z,y) print(x,'-->',z) ...

  7. 001 KNN分类 最邻近算法

    1.文件5.0,3.5,1.6,0.6,apple5.1,3.8,1.9,0.4,apple4.8,3.0,1.4,0.3,apple5.1,3.8,1.6,0.2,apple4.6,3.2,1.4, ...

  8. eclipse netbeans 代码模板

    eclipse  代码模板  插入slf4j ${:import(org.slf4j.Logger,org.slf4j.LoggerFactory)} private static final Log ...

  9. Jrebel 独立部署tomcat 远程同步项目

    一直在用 jrebel 感觉热部署的 功能,修改xml配置文件等,省去了很多的重新启动的时间. 由于偶然间发现 jrebel 还有remote 路由功能.这样,在服务器端用jrebel部署的项目和本地 ...

  10. ceph常用命令(转)

    原文:http://michaelkang.blog.51cto.com/1553154/1698287 一:ceph集群启动.重启.停止 1:ceph 命令的选项如下: 选项简写描述 --verbo ...