hihocoder-1299 打折机票(线段树)

题目链接:

打折机票

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

 因为思念新宿的"小姐姐"们,岛娘计划6月份再去一趟东京,不过这次看来她需要自掏腰包。经过了几天的夜战,岛娘终于在体力耗尽之前,用Python抓下了所有6月份,上海至东京的全部共 n 张机票。现在请你帮助债台高筑的岛娘筛选出符合时间区间要求的,最贵的机票。

输入

输入数据的第一行包含两个整数 n, m(1 ≤ n, m ≤ 105),分别表示机票的总数,和询问的总数。接下来的 n 行,每行两个整数 t, v (1 ≤ t, v ≤ 105),表示每张机票出发的时间和价格。 接下来的 m 行,每行两个整数 a, b (1 ≤ a ≤ b ≤ 105),表示每个询问所要求的时间区间。

输出

对于每组询问,输出一行表示最贵的价格。如果没有符合要求的机票,输出一行"None"。

样例输入
7 6
1 1
2 1
4 3
4 4
4 5
6 9
7 9
1 7
1 2
6 7
3 3
4 4
5 5
样例输出
9
1
9
None
5
None

题意:



思路

线段树找区间最大值;

AC代码

#include <bits/stdc++.h>
using namespace std;
#define Riep(n) for(int i=1;i<=n;i++)
#define Riop(n) for(int i=0;i<n;i++)
#define Rjep(n) for(int j=1;j<=n;j++)
#define Rjop(n) for(int j=0;j<n;j++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
typedef long long LL;
const LL mod=1e9+7;
const double PI=acos(-1.0);
const int inf=0x3f3f3f3f;
const int N=1e5+5;
int n,m;
struct Node
{
    int l,r,ans;
}tree[4*N];
void build(int node,int L,int R)
{
    tree[node].l=L;
    tree[node].r=R;
    tree[node].ans=0;
    if(L>=R)return ;
    int mid=(L+R)>>1;
    build(2*node,L,mid);
    build(2*node+1,mid+1,R);
}
void update(int node,int pos,int num)
{
    if(tree[node].l==tree[node].r&&tree[node].r==pos)
    {
        tree[node].ans=max(tree[node].ans,num);
        return ;
    }
    int mid=(tree[node].l+tree[node].r)>>1;
    if(pos<=mid)update(2*node,pos,num);
    else update(2*node+1,pos,num);
    tree[node].ans=max(tree[2*node].ans,tree[2*node+1].ans);
}
int query(int node,int L,int R)
{
    if(L<=tree[node].l&&R>=tree[node].r)
    {
        return tree[node].ans;
    }
    int mid=(tree[node].l+tree[node].r)>>1;
    if(R<=mid)return query(2*node,L,R);
    else if(L>mid)return query(2*node+1,L,R);
    else return max(query(2*node,L,mid),query(2*node+1,mid+1,R));
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int x,y;
        build(1,1,N-2);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&y);
            update(1,x,y);
        }
        while(m--)
        {
            scanf("%d%d",&x,&y);
            int temp=query(1,x,y);
            if(!temp)printf("None\n");
            else printf("%d\n",temp);
        }
    }
    return 0;
}

 

posted @ 2016-05-08 12:02  LittlePointer  阅读(202)  评论(0编辑  收藏  举报