描述
因爲思念新宿的"小姐姐"們,島娘計劃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
分析:很明顯的線段樹區間求最值,區別:存在間斷點特殊處理一下
/*
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
*/
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
#define INF -0xf
const int maxn=1000005;
using namespace std;
struct node
{
int id;
int price;
};
int segTree[maxn];
int a[maxn];
void Build(int node, int b, int e)
{
if (b == e)
segTree[node] = a[b];
else
{
Build(2*node, b, (b+e)/2);
Build(2*node+1, (b+e)/2+1, e);
if (segTree[2 * node] >= segTree[2 * node + 1])
segTree[node] = segTree[2 * node];
else
segTree[node] = segTree[2 * node + 1];
}
}
int Query(int node,int b,int e,int left,int right)
{
if (b>=left && e<=right) return segTree[node];
int m=(b+e)/2;
int sum=0;
if(left<=m)sum=max(sum,Query(node<<1,b,m,left,right));
if(right>m)sum=max(sum,Query(node<<1|1,m+1,e,left,right));
return sum;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int a1,a2;
for (int i=1;i<=n;i++)
a[i]=INF;
for (int i=1;i<=n;i++)
{
scanf("%d%d",&a1,&a2);
if (a[a1] == INF) a[a1]=a2;
else a[a1]=max(a[a1],a2);
}
Build(1,1,n);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&a1,&a2);
int ans=Query(1,1,n,a1,a2);
if (ans == 0) printf("None\n");//特判
else printf("%d\n",ans);
}
return 0;
}