• 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
    ");
                else printf("%d
    ",temp);
            }
        }
        return 0;
    }
  • 相关阅读:
    IntelliJ IDEA常用的快捷键积累总结
    Linux命令(六)之防火墙iptables的相关操作以及端口的开放
    Linux命令(五)之service服务查找、启动/停止等相关操作
    Linux命令(四)之常用文件拷贝/移动,文件解压缩,文件查找等相关的操作
    Linux命令(三)vim编辑器的常用命令
    Linux命令(一)之目录结构、Linux终端操作、关机重启等一些基本操作
    zookeeper核心知识与投票机制详解
    zuul开发实战(限流,超时解决)
    IO多路复用技术详解
    Linux五大网络IO模型图解
  • 原文地址:https://www.cnblogs.com/zhangchengc919/p/5470196.html
Copyright © 2020-2023  润新知