POJ_3264 Balanced Lineup 【线段树 + 区间查询】
一、题面
二、分析
典型的区间问题,没有更新只有查询。
可以用线段树,也可以用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 【线段树 + 区间查询】的更多相关文章
- BZOJ-1699 Balanced Lineup 线段树区间最大差值
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 41548 Accepted: 19514 Cas ...
- [POJ] 3264 Balanced Lineup [线段树]
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 34306 Accepted: 16137 ...
- 【POJ】3264 Balanced Lineup ——线段树 区间最值
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 34140 Accepted: 16044 ...
- bzoj 1636: [Usaco2007 Jan]Balanced Lineup -- 线段树
1636: [Usaco2007 Jan]Balanced Lineup Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 772 Solved: 560线 ...
- POJ 3264 Balanced Lineup 线段树 第三题
Balanced Lineup Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line ...
- poj 3264 Balanced Lineup(线段树、RMQ)
题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...
- 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 ...
- POJ 3264 Balanced Lineup 线段树RMQ
http://poj.org/problem?id=3264 题目大意: 给定N个数,还有Q个询问,求每个询问中给定的区间[a,b]中最大值和最小值之差. 思路: 依旧是线段树水题~ #include ...
- POJ3264 Balanced Lineup —— 线段树单点更新 区间最大最小值
题目链接:https://vjudge.net/problem/POJ-3264 For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000 ...
- POJ3264 Balanced Lineup 线段树区间最大值 最小值
Q个数 问区间最大值-区间最小值 // #pragma comment(linker, "/STACK:1024000000,1024000000") #include <i ...
随机推荐
- linux环境下搭建osm_web服务器三(Openlays和slippymap):
Openlays和slippymap 上一步,我们已经有了自己的地图瓦片服务器,现在,开始实现SlippyMap啦! <1>下载释放OpenLayers到 www文件夹 SlippyMap ...
- [SoapUI] JsonPath is to JSON what XPath is to XML
1.通过JsonUtil验证Json的有效性 2.两种方式通过JPath读取Json的内容
- [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怎 ...
- Java 读取jar内的文件的超简便方法
坑爹的java课程设计,偏要用jar来运行 读取.存储jar内文件的支持也好低 存储方法: 进入jar文件其实没有说的那么困难,jar文件本质是一个zip格式的压缩文件,只是把文件后缀名改了,要用Ja ...
- Native2Ascii文件转换 -- 待完善
摘自:https://www.oschina.net/code/snippet_87799_1612 Native2Ascii文件转换 -- 待完善 package com.xxx.xxx.Util; ...
- 汉诺塔(hanoi)
汉诺塔代码: def hanoi(n,x,y,z): if n == 1: print(x,'-->',z) else: hanoi(n-1,x,z,y) print(x,'-->',z) ...
- 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, ...
- eclipse netbeans 代码模板
eclipse 代码模板 插入slf4j ${:import(org.slf4j.Logger,org.slf4j.LoggerFactory)} private static final Log ...
- Jrebel 独立部署tomcat 远程同步项目
一直在用 jrebel 感觉热部署的 功能,修改xml配置文件等,省去了很多的重新启动的时间. 由于偶然间发现 jrebel 还有remote 路由功能.这样,在服务器端用jrebel部署的项目和本地 ...
- ceph常用命令(转)
原文:http://michaelkang.blog.51cto.com/1553154/1698287 一:ceph集群启动.重启.停止 1:ceph 命令的选项如下: 选项简写描述 --verbo ...