线段树飞机票
来源:互联网 发布:linux云计算视频教程 编辑:程序博客网 时间:2024/04/28 15:25
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|1const 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;}
0 0
- 线段树飞机票
- 飞机票
- 飞机票
- 买飞机票
- 订飞机票网站
- 飞机票(超级脚本)
- 订飞机票的代码
- 飞机票的预定策略问题
- C语言编写飞机票系统
- 学会怎么买一折飞机票
- 飞机票(一个神奇的脚本)
- Hibernate+Servlet订购飞机票系统
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 线段_线段树
- 中国国航往返飞机票怎么改签
- web_reg_find函数在飞机票订票中的例子
- Associate File Extension with Shell OPEN command and Application(转)
- 正确理解ThreadLocal
- 大臣的旅费____树的直径
- HDU 2604 Queuing
- Android编程之SparseArray<E>详解
- 线段树飞机票
- 交换两个数
- JSP自定义标记
- Java获取某个日期前后几天日期
- HDU 1754 I hate it 【单节点+最大值】
- 一个可以点击的slider
- 删除表数据drop、truncate和delete的用法
- 从代码上看程序生死周期(生死循环,生命周期)(转)
- 90. Subsets II