HIHO Coder - 1299 打折机票

2024-02-27 01:08
文章标签 coder 打折 机票 hiho 1299

本文主要是介绍HIHO Coder - 1299 打折机票,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

描述

 因为思念新宿的"小姐姐"们,岛娘计划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
时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

PS.真的很想吐槽那个图=日=


这是一个静态的线段树问题。

#include <cstdio>
#include <algorithm>
#include <cstring>using namespace std;const int maxn = 1e6+7;
int a[maxn];
struct node
{int l, r, x;
}tickt[maxn*4];void BuildTree(int x, int left, int right)
{tickt[x].l = left;tickt[x].r = right;if (left == right){tickt[x].x = a[left];return;}int mid = (left+right) >> 1;BuildTree(x<<1, left, mid);BuildTree(x<<1|1, mid+1, right);tickt[x].x = max(tickt[x<<1].x, tickt[x<<1|1].x);
}
int query(int x, int left, int right)
{if(left <= tickt[x].l && tickt[x].r <= right)return tickt[x].x;int ans = 0;int mid = (tickt[x].l + tickt[x].r) >> 1;if (mid >= left) ans = max(ans, query(x<<1, left, right));if (mid < right) ans = max(ans, query(x<<1|1, left, right));return ans;
}
int main()
{int m, n;scanf("%d %d", &n, &m);memset(a, 0, sizeof(a));for(int i = 1; i <= n; i++){int x, y;scanf("%d %d", &x, &y);a[x] = max(a[x], y);}BuildTree(1, 1, 100000);for(int i = 1; i <= m; i++){int from, to;scanf("%d %d", &from, &to);int p = query(1, from, to);if(p == 0)printf("None\n");elseprintf("%d\n", p);}return 0;
}



这篇关于HIHO Coder - 1299 打折机票的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750738

相关文章

HIHO #1190 : 连通性·四(点的双联通分量)

题目链接 点的双联通分量,不注意写出了一个bug,找了2个多小时= =,我的边存的是0开始的,然后ans数组一开始也是0,然后就是if的地方。。。。。 还是tarjan的算法,结合提示,这里需要存边,然后栈里面保存的是边,而不是点,这里我用边在边集es中的编号,作为边的标志 #include<bits/stdc++.h>using namespace std;#define cl(a,b

HIHO #1185 : 连通性·三

题目链接 先使用tarjan算法,计算强连通分量,进行缩点成DAG,然后在使用拓扑排序计算 tarjan中,我们只需要从1号节点计算,因为开始时在1号点。 建立新图的过程中,1号点不能到达的点也不用建立到新图里面 #include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#defin

HIHO #1184 : 连通性二·边的双连通分量

题目链接 Tarjan算法,介绍可以看题目讲解,很好很清楚 无向图边的双联通分量的定义:对于一个无向图的子图,当删除其中任意一条边后,不改变图内点的连通性,这样的子图叫做边的双连通子图。而当子图的边数达到最大时,叫做边的双连通分量。 或者说,对于一个连通图,如果任意两点至少存在两条”边不重复”的路径。也就是要去每条边至少在一个简单的环中,也就是说所有的边都不是桥 同样是2个方法: 1)题

HIHO #1183 : 连通性一·割边与割点

题目链接 使用Tarjan算法计算无向图的割点和桥,提示讲解的也很清晰 需要注意的是,某一个割点可能会被多次计算,所以一般是先记录然后最后统一输出 1)按照题目的伪代码直接实现 2)稍微优化一下的,省一些空间 #include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define

HIHO #1182 : 欧拉路·三(有向图 输出欧拉路径)

题目链接 A)建图是巧妙,使用边表示每一个数字,那么就是走完每一个边一次再回到起点,便是求欧拉回路 B)建图是有向图,建图需要注意,同时,输出的时候逆序输出 C)path保存的是完整的路径,输出的时候只需&1即可 #include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#defin

HIHO #1181 : 欧拉路·二(fleury算法输出欧拉路径)

题目链接 伪代码 DFS(u):While (u存在未被删除的边e(u,v))删除边e(u,v)DFS(v)EndPathSize ← PathSize + 1Path[ PathSize ] ← u 点之间可能存在多条边,所以存边,然后标记每条边的标号,还是一个常见的存边的表示法 #include<bits/stdc++.h>using namespace std;#define c

hiho一下 第四十九周 欧拉路·一

【题目链接】:click here~~ 时间限制: 10000ms 单点时限: 1000ms 内存限制: 256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏。现在他们控制的角色来到了一个很大的湖边。湖上有N个小岛(编号1..N),以及连接小岛的M座木桥。每座木桥上各有一个宝箱,里面似乎装着什么

hiho 1000: A+B

时间限制: 1000ms 单点时限: 1000ms 内存限制: 256MB 描述 求两个整数A+B的和 输入 输入包含多组数据。 每组数据包含两个整数A(1 ≤ A ≤ 100)和B(1 ≤ A ≤ 100)。 输出 对于每组数据输出A+B的和。 样例输入 1 23 4 样例输出 37 代码(C语言): #include <stdio.h>in

hiho一下第56周 高斯消元

小Ho:<吧唧><吧唧><吧唧> 小Hi:小Ho,你还吃呢。想好了么? 小Ho:肿抢着呢(正想着呢)...<吞咽>...我记得这个问题上课有提到过,应该是一元一次方程组吧。 我们把每一件商品的价格看作是x[1]..x[n],第i个组合中第j件商品数量记为a[i][j],其价格记作y[i],则可以列出方程式: a[1][1] * x[1] + a[1][2] * x[2] + ... +

Coder-Strike 2014 - Finals (online edition, Div. 1) C. Bug in Code

水题一道,但是卡了一个早上 我本着数据结构去做的,知道用树状数组就是没有想出来维护的方法.... 用树状数组维护,提名 i 次的人有getsum个 注意一点的是,如果怀疑的人是 1 2,然后有一个人是同时提名这两个的,那么这个人就会被算两次 因此我每次用树状数组统计的时候,将同时和第i个人提名的各个人数减1,再统计,然后再恢复(这是一种很麻烦的做法,我是渣渣别介意 #include