码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-05-08 13:32:19      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

打折机票

时间限制: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;
}

 

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

标签:

原文地址:http://www.cnblogs.com/zhangchengc919/p/5470196.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!