首页 > 代码库 > HDU 4417 - Super Mario
HDU 4417 - Super Mario
先来一个离线版本的线段树:
1 /* 2 ID:esxgx1 3 LANG:C++ 4 PROG:hdu4417 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <iostream> 9 #include <algorithm> 10 using namespace std; 11 12 #define MAXN 100007 13 14 int v[MAXN * 4]; 15 16 #define recursive_def int l, int r, int i 17 #define lsi i<<1 18 #define rsi i<<1 | 1 19 #define lsn l, m, lsi 20 #define rsn m+1, r, rsi 21 #define pushup v[i] = v[lsi] + v[rsi]; 22 23 void build(recursive_def) 24 { 25 v[i] = 0; 26 if (l == r) return; 27 else { 28 int m = (l+r) >> 1; 29 build(lsn); 30 build(rsn); 31 } 32 } 33 34 void update(int x, recursive_def) 35 { 36 if (l == r) v[i] += 1; 37 else { 38 int m = (l+r) >> 1; 39 if (x <= m) update(x, lsn); 40 else update(x, rsn); 41 pushup 42 } 43 } 44 45 int query(int L, int R, recursive_def) 46 { 47 if (L <= l && r <= R) return v[i]; 48 int m = (l+r) >> 1; 49 int rslt; 50 if (L <= m) rslt = query(L, R, lsn); 51 else rslt = 0; 52 53 if (m < R) rslt += query(L, R, rsn); 54 return rslt; 55 } 56 57 struct A{ 58 int x, h; 59 } brick[MAXN]; 60 61 int cmp1(const A &a, const A &b) 62 { 63 return a.h < b.h; 64 } 65 66 #define MAXM 100007 67 68 struct B{ 69 int L, R, H, d, cnt; 70 } qs[MAXM]; 71 72 int cmp2(const B &a, const B &b) 73 { 74 return a.H < b.H; 75 } 76 77 int cmp3(const B &a, const B &b) 78 { 79 return a.d < b.d; 80 } 81 82 int main(void) 83 { 84 #ifndef ONLINE_JUDGE 85 freopen("in.txt", "r", stdin); 86 #endif 87 int T; 88 scanf("%d", &T); 89 for(int t=1; t<=T; ++t) { 90 int N, M; 91 printf("Case %d:\n", t); 92 scanf("%d%d", &N, &M); 93 for(int i=0; i<N; ++i) { 94 scanf("%d", &brick[i].h); 95 brick[i].x = i; 96 } 97 sort(brick, brick + N, cmp1); 98 for(int i=0; i<M; ++i) { 99 scanf("%d%d%d", &qs[i].L, &qs[i].R, &qs[i].H);100 qs[i].d = i;101 }102 sort(qs, qs+M, cmp2);103 build(0, N-1, 1);104 int bb = 0;105 for(int i=0; i<M; ++i) {106 while(brick[bb].h <= qs[i].H) {107 update(brick[bb].x, 0, N-1, 1);108 if (++bb >= N) break;109 }110 qs[i].cnt = query(qs[i].L, qs[i].R, 0, N-1, 1);111 }112 sort(qs, qs+M, cmp3);113 for(int i=0; i<M; ++i)114 printf("%d\n", qs[i].cnt);115 }116 return 0;117 }
2014-07-25 19:50:07 | Accepted | 4417 | 265MS | 3100K | 1980 B | G++ |
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。