一、题面

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. code1074 食物链

    开3*n的并查集,其中x用来连接与x同类的,x+n用来连接x吃的,x+2*n用来连接x被吃的. 1 x y时,如果 x吃y 或 x被y吃,那么为假话, 否则x与y同类,x吃的y也吃,x被吃的y也被吃: ...

  2. [SoapUI] 设置Excel的第一行为自动过滤

    import org.apache.poi.ss.util.* XSSFWorkbook workbook = new XSSFWorkbook() XSSFSheet sheet = workboo ...

  3. STM32F4库函数里面的RCC_DeInit(void)函数分析

    void RCC_DeInit(void) { /*Set HSION bit,内部高速时钟使能HSI振荡器打开*/ RCC->CR |=(uint32_t)0x00000001; /*Rese ...

  4. [GO]ticker的使用

    package main import ( "time" "fmt" ) //ticker是一个定时触发的计时器,它会以一个间隔往channel发送整一个事件( ...

  5. git的使用和一些命令

    1. https://github.com/ 在这个网站注册一个帐号. http://gitref.org/zh/creating/ 待会写.. [命令] a)

  6. 老司机带你玩Spring.Net -入门篇

    网上有 Spring.Net 的相关的很多介绍的文章还有实践例子,推荐个还不错的博客 Spring.Net 学习笔记 .以前对 Spring.Net 算是有过一面之缘,但却迟迟未真正相识.在网上有太多 ...

  7. Spring bean管理器 bean实例化的三种方式

    bean实例化的三种方式实现 第一种:使用类的无参数构造方法创建(常用 重要) 第一种实例化方式最常用,实例化类时会通过调用无参构造方法创建.示例代码如下: package spring.com.Us ...

  8. css3系列之animation

    在上次博文中已经讲了transition,其实animation与transition功能相同,都是通过改变元素 的属性来实现动画效果的.但是它们也有区别:transition是只能通过改变指定属性的 ...

  9. 检测远程主机上的某个端口是否开启——telnet命令

    要测试远程主机上的某个端口是否开启,无需使用太复杂的工作,windows下就自带了工具,那就是telnet.ping命令是不能检测端口,只能检测你和相应IP是否能连通. 1 安装telnet.win7 ...

  10. 解决jeesite开发java.lang.String cannot be cast to com.thinkgem.jeesite.modules.sys.security.SystemAuthorizingRealm$Principal问题

    解决jeesite问题java.lang.String cannot be cast to SystemAuthorizingRealm问题 这些天在jeesite项目上进行二次开发,遇到许多莫名其妙 ...