线段树飞机票

来源:互联网 发布:linux云计算视频教程 编辑:程序博客网 时间:2024/04/28 15:25

http://hihocoder.com/contest/challenge20/problem/1

给出时间 票价,查询一段时间内最高票价。


建树:

①先用数组把时间日期对应存好,若同一天多张票取最高价的机票,没票的日期的票价初始化为0

②把数组对应到树上(叶子节点??)


#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1const int maxn = 100005;const int INF = 0x3f3f3f3f;int M[maxn<<2],ct = 1,Ni[maxn];void PushUP(int rt){    M[rt] = max(M[rt<<1],M[rt<<1|1]);}void build(int l, int r, int rt){    if(l == r)    {        M[rt] = Ni[ct];        ct++;        return;    }    int m = (l+r)>>1;    build(lson);    build(rson);    PushUP(rt);}int querymax(int L, int R, int l, int r, int rt){    if(L <= l && r <= R)    {        return M[rt];    }    int m = (l+r)>>1;    int ret = 0;    if(L <= m)        ret = max(ret, querymax(L, R, lson));    if(R > m)        ret = max(ret, querymax(L, R, rson));    return ret;}int main(){    int N, Q;    scanf("%d%d",&N,&Q);    memset(Ni, 0, sizeof(Ni));    while(N--)    {        int i,j;        scanf("%d%d",&i,&j);        if(j > Ni[i])            Ni[i] = j;               // 取最贵机票    }    build(1, 100000, 1);             // 以时间为标建树    while(Q--)    {        int a, b;        scanf("%d%d",&a,&b);        int c = querymax(a, b, 1, 100000, 1);        if(c == 0)            printf("None");          //  为0表示无机票        else            printf("%d",c);        if(Q != 0)            printf("\n");    }    return 0;}

0 0
原创粉丝点击