hihocoder 1299 打折机票 线段树

题目链接:http://hihocoder.com/problemset/problem/1299

code:

//线段树
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 100005
using namespace std;
int price[maxn];
int Max[maxn];
int segTree[4*maxn];
int maxtime;
void built(int node,int begin,int end)
{
    if(begin == end){
        segTree[node] = price[begin];
    }
    else{
        built(node*2,begin,(begin+end)/2);
        built(node*2+1,(begin+end)/2+1,end);
        segTree[node] = max(segTree[node*2],segTree[node*2 + 1]);
    }
}
int query(int node,int begin,int end,int left,int right)
{
    int p1, p2;
    if (left > end || right < begin)
        return -1;
    if (begin >= left && end <= right)
        return segTree[node];
    p1 = query(2 * node, begin, (begin + end) / 2, left, right);
    p2 = query(2 * node + 1, (begin + end) / 2 + 1, end, left, right);
    if (p1 == -1)
        return p2;
    if (p2 == -1)
        return p1;
    if (p1 >= p2)
        return  p1;
    return  p2;
}
int main()
{
    int n,m;
    memset(price,0,sizeof(price));
    memset(Max,0,sizeof(Max));
    maxtime = 0;
    cin >> n >> m;
    for(int i = 0;i < n;i ++)
    {
        int t,p;
        cin >> t >> p;
        price[t] = max(price[t],p);
        maxtime = max(maxtime,t);
    }
    built(1,1,maxtime);
    while(m --)
    {
        int a,b;
        cin >> a >> b;
        int ans =  query(1,1,maxtime,a,b);
        if(ans == 0)
            cout << "None" << endl;
        else
            cout << ans << endl;
    }
    return 0;
}
时间: 2024-08-02 23:44:26

hihocoder 1299 打折机票 线段树的相关文章

线段树之应用 ---- #1299 : 打折机票

#1299 : 打折机票 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 因为思念新宿的"小姐姐"们,岛娘计划6月份再去一趟东京,不过这次看来她需要自掏腰包.经过了几天的夜战,岛娘终于在体力耗尽之前,用Python抓下了所有6月份,上海至东京的全部共 n 张机票.现在请你帮助债台高筑的岛娘筛选出符合时间区间要求的,最贵的机票. 输入 输入数据的第一行包含两个整数 n,?m(1?≤?n,?m?≤?105),分别表示机票的总数,和询问的总数.接下来的 n 行,

HIHO Coder - 1299 打折机票

描述 因为思念新宿的"小姐姐"们,岛娘计划6月份再去一趟东京,不过这次看来她需要自掏腰包.经过了几天的夜战,岛娘终于在体力耗尽之前,用Python抓下了所有6月份,上海至东京的全部共 n 张机票.现在请你帮助债台高筑的岛娘筛选出符合时间区间要求的,最贵的机票. 输入 输入数据的第一行包含两个整数 n,?m(1?≤?n,?m?≤?105),分别表示机票的总数,和询问的总数.接下来的 n 行,每行两个整数 t,?v (1?≤?t,?v?≤?105),表示每张机票出发的时间和价格. 接下来的

hihocode #1299 打折机票

题意很简单就是给你两个数n和m,n表示有n张飞机票,m表示有m次查询,接下来n行,每行两个数,分别表示航班出发的时间和价格,接下来m行,每行两个数表示查询这两个数时间内航班最贵的价格.如果没有要求的机票就输出"None".这道题是一道典型的RMQ问题,就是区间最值查询问题.这里提供两种解法. 1.线段树可以解决,而且是一道线段树的裸题. //segment tree #include <iostream> #include <cstdio> #include &

hihoCoder - 1079 - 离散化 (线段树 + 离散化)

#1079 : 离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去,有些海报就会被其他社团的海报所遮挡住.看到这个场景,小Hi便产生了这样的一个疑问--最后到底能有几张海报还能被看见呢? 于是小Ho肩负起了解决这个问题的责任:因为宣传栏和海报的高度都是一样的,所以宣传栏可以被视作

hihoCoder:#1079(线段树+离散化)

题目大意:给n个区间,有的区间可能覆盖掉其他区间,问没有完全被其他区间覆盖的区间有几个?区间依次给出,如果有两个区间完全一样,则视为后面的覆盖前面的. 题目分析:区间可能很长,所以要将其离散化.但离散化之后区间就变成了连续的,不再是离散的.也就是叶子由左右端点为u.u变成了左右端点为u-1.u,左右儿子有(l,mid)和(mid+1,r)变成了(l,mid)和(mid,r).所以离散化之后要以长度为1的区间为叶子节点建立线段树,而不是以1.2.3...为叶子节点建线段树. 代码如下: # inc

hihocoder 1074 字体设计(线段树)

这题可以把问题转化为,对于一个位置,限制的位置必然是,递增时候,小于他本身,或者递减时候,大于他本身的位置,然后在这个区间中,寻找最大(小)值的位置,这样利用线段树维护即可,对于一个限制位置,可以先把数字离散化掉,然后用权值做节点很容易就处理出来了,然后第二个问题就是普通的rmq问题 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N

codevs 1299 切水果 线段树

1299 切水果 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 简单的说,一共N个水果排成一排,切M次,每次切[L,R]区间的所有水果(可能有的水果被重复切),每切完一次输出剩下水果数量 数据已重新装配,不会出现OLE错误 时限和数据范围适当修改,避免数据包过大而浪费空间资源 输入描述 Input Description 第1行共包括2个正整数,分别为N,M. 接下来m行每行两个正整数L,R 输出描述 Output Description 一共输出M行,每

hihoCoder - 1116 - 计算 (线段树)

计算 题目传送:#1116 : 计算 这里说下sum,pre,suf,ji数组的含义: sum:所求答案 pre:所有前缀积之和 suf:所有后缀积之和 ji:区间内所有数之积 以一个例子说明: 比如我们现在正在合并区间{3,4},{2,5} 而区间{3,4}所表示的 sum1=3 + 4 + 3 * 4 = 19 pre1 = 3 + 3 * 4 = 12 suf1 = 3 * 4 + 4 = 16 ji1 = 3 * 4 = 12 而区间{2,5} sum2 = 2 + 5 + 2 * 5

[HIHO1299]打折机票(线段树)

题目链接:http://hihocoder.com/problemset/problem/1299 线段树,按照t为下标去更新v,更新的时候要保留最大的那个. 1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include