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 ...
随机推荐
- C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串
在工作中,如果需要跟XML打交道,难免会遇到需要把一个类型集合转换成XML格式的情况.之前的方法比较笨拙,需要给不同的类型,各自写一个转换的函数.但是后来接触反射后,就知道可以利用反射去读取一个类型的 ...
- 【#】Spring3 MVC (三)---请求处理方法 参数及返回值总结
博客分类: spring MVCJSPServletCC++ @RequestMapping("/xxxx") public String aaa(){ } 在处理用户请求的方 ...
- mysql json格式数据处理
1.查询字段所对应的值: SELECT c.result_http->"$.create_time",json_extract(c.result_http,"$.e ...
- Kubernetes (1.6) 中的存储类及其动态供给
原文地址:http://blog.fleeto.us/translation/dynamic-provisioning-and-storage-classes-kubernetes-0?utm_sou ...
- Java SimpleDateFormat用法
? Java中怎么才能把日期转换成想要的格式呢,或把字符串转换成一定格式的日期,如把数据库中的日期或时间转换成自己想要的格式,JAVA中提供了SimpleDateFormat类可以实现,以下是Si ...
- Hadoop压缩之CompressionCodecFactory
1.CompressionCodecFactory简介 当在读取一个压缩文件的时候,可能并不知道压缩文件用的是哪种压缩算法,那么无法完成解压任务.在Hadoop中,CompressionCodecFa ...
- HttpUploader2-queue版本
1.1 2016版本 目标: 1.大幅度优化JS代码,面向开发人员更加友好,逻辑清晰,代码简洁,便于阅读,定制开发,扩展,更加符合企业级应用需求. 2.大幅度使用并发技术来提高上传速度,与HttpUp ...
- Gym - 101498G(Super Subarray )
In this problem, subarray is defined as non-empty sequence of consecutive elements. We define a suba ...
- Rose如何由模型生成代码(正向工程)
原创 正向工程: 选中要转换的模型. 单击 tools>Java/J2EE > Syntax Check 来检查目标代码是否符合规范,比如命名错误. 察看rose log窗口(下方)察看检 ...
- ASP.NET Core2利用Jwt技术在服务端实现对客户端的身份认证
背景 在微服务架构下,一般都会按不同的业务或功能将整个系统切分成不同的独立子系统,再通过REST API或RPC进行通讯并相互调用,形成各个子系统之间的串联结构.在这里,我们将采用REST API的通 ...