http://hihocoder.com/contest/challenge20/problem/1
给出时间 票价,查询一段时间内最高票价。
建树:
①先用数组把时间日期对应存好,若同一天多张票取最高价的机票,没票的日期的票价初始化为0
②把数组对应到树上(叶子节点??)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const int maxn = 100005;
const int INF = 0x3f3f3f3f;
int M[maxn<<2],ct = 1,Ni[maxn];
void PushUP(int rt)
{
M[rt] = max(M[rt<<1],M[rt<<1|1]);
}
void build(int l, int r, int rt)
{
if(l == r)
{
M[rt] = Ni[ct];
ct++;
return;
}
int m = (l+r)>>1;
build(lson);
build(rson);
PushUP(rt);
}
int querymax(int L, int R, int l, int r, int rt)
{
if(L <= l && r <= R)
{
return M[rt];
}
int m = (l+r)>>1;
int ret = 0;
if(L <= m)
ret = max(ret, querymax(L, R, lson));
if(R > m)
ret = max(ret, querymax(L, R, rson));
return ret;
}
int main()
{
int N, Q;
scanf("%d%d",&N,&Q);
memset(Ni, 0, sizeof(Ni));
while(N--)
{
int i,j;
scanf("%d%d",&i,&j);
if(j > Ni[i])
Ni[i] = j; // 取最贵机票
}
build(1, 100000, 1); // 以时间为标建树
while(Q--)
{
int a, b;
scanf("%d%d",&a,&b);
int c = querymax(a, b, 1, 100000, 1);
if(c == 0)
printf("None"); // 为0表示无机票
else
printf("%d",c);
if(Q != 0)
printf("\n");
}
return 0;
}