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\n"); else printf("%d\n",temp); } } return 0; }