BZOJ 1699 [Usaco2007 Jan]Balanced Lineup排队 线段树

题意:链接

方法:线段树

解析:

题意即题解。

多次询问区间最大值与最小值的差,显然直接上线段树或者rmq维护区间最值即可。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 50010
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define pa pair<int,int>
using namespace std;
int n,q;
int ma[N<<2],mi[N<<2],dis[N<<2];
void init()
{
    memset(ma,-1,sizeof(ma));
    memset(mi,0x3f,sizeof(mi));
}
void pushup(int rt)
{
    ma[rt]=max(ma[rt<<1],ma[rt<<1|1]);
    mi[rt]=min(mi[rt<<1],mi[rt<<1|1]);
}
void build(int l,int r,int rt)
{
    if(l==r)
    {
        int x;
        scanf("%d",&x);
        ma[rt]=mi[rt]=x;
        return;
    }
    int mid=(l+r)>>1;
    build(lson),build(rson);
    pushup(rt);
}
pa query(int L,int R,int l,int r,int rt)
{
    pa ret;
    ret.first=-1,ret.second=0x3f3f3f3f;
    if(L<=l&&r<=R)
    {
        pa p;
        p.first=ma[rt],p.second=mi[rt];
        return p;
    }
    int mid=(l+r)>>1;
    if(L<=mid)
    {
        pa tmp=query(L,R,lson);
        ret.first=max(ret.first,tmp.first),ret.second=min(ret.second,tmp.second);
    }
    if(R>mid)
    {
        pa tmp=query(L,R,rson);
        ret.first=max(ret.first,tmp.first),ret.second=min(ret.second,tmp.second);
    }
    return ret;
}
int main()
{
    init();
    scanf("%d%d",&n,&q);
    build(1,n,1);
    for(int i=1;i<=q;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        pa tmp=query(x,y,1,n,1);
        printf("%d\n",tmp.first-tmp.second);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 14:25:29

BZOJ 1699 [Usaco2007 Jan]Balanced Lineup排队 线段树的相关文章

bzoj 1699: [Usaco2007 Jan]Balanced Lineup排队 分块

1699: [Usaco2007 Jan]Balanced Lineup排队 Time Limit: 5 Sec  Memory Limit: 64 MB Description 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛. 但是为了避免水平悬殊,牛的身高不应该相差太大. John 准备了Q (1 <= Q <= 180,000) 个可能的牛的

[bzoj 1699] [Usaco2007 Jan]Balanced Lineup排队

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1699 [Usaco2007 Jan]Balanced Lineup排队 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1443  Solved: 920[Submit][Status][Discuss] Description 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一

BZOJ1699: [Usaco2007 Jan]Balanced Lineup排队

1699: [Usaco2007 Jan]Balanced Lineup排队 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 933  Solved: 568[Submit][Status] Description 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛. 但是为了避免水平悬殊,牛的身高不应该相差太大. Jo

[Usaco2007 Jan]Balanced Lineup排队

[Usaco2007 Jan]Balanced Lineup排队 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 2333 Solved: 1424 Description 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛. 但是为了避免水平悬殊,牛的身高不应该相差太大. John 准备了Q (1 <= Q &l

[BZOJ] 1636: [Usaco2007 Jan]Balanced Lineup

1636: [Usaco2007 Jan]Balanced Lineup Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 909  Solved: 644[Submit][Status][Discuss] Description For the daily milking, Farmer John's N cows (1 <= N <= 50,000) always line up in the same order. One day Farmer

P1699: [Usaco2007 Jan]Balanced Lineup排队

很明显是一道RMQ问题,倍增法,维护一下区域的最大/小值就行了. 1 var n,i,j,q,f,t,times:longint; 2 hmin,hmax:array[0..100,0..50000] of longint; 3 function min(a,b:longint):longint; 4 begin 5 if a>b then exit(b) 6 else exit(a); 7 end; 8 function max(a,b:longint):longint; 9 begin 10

BZOJ1636: [Usaco2007 Jan]Balanced Lineup

1636: [Usaco2007 Jan]Balanced Lineup Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 476  Solved: 345[Submit][Status] Description For the daily milking, Farmer John's N cows (1 <= N <= 50,000) always line up in the same order. One day Farmer John deci

POJ3264 Balanced Lineup RMQ 线段树

求区间内最大数和最小数的差,用两棵线段树,一个维护区间最大值,一个维护区间最小值. #include <stdio.h> #include <vector> #include <math.h> #include <string.h> #include <string> #include <iostream> #include <queue> #include <list> #include <algori

POJ3264——Balanced Lineup(线段树)

本文出自:http://blog.csdn.net/svitter 题意:在1~200,000个数中,取一段区间,然后在区间中找出最大的数和最小的数字,求这两个数字的差. 分析:按区间取值,很明显使用的线段树.区间大小取200000 * 4 = 8 * 10 ^5; 进行查询的时候,注意直接判断l, r 与mid的关系即可,一开始写的时候直接与tree[root].L判断,多余了, 逻辑不正确. #include <iostream> #include <stdio.h> #inc