线段树的离散化和成段增减和单点查询。开始的时候二分函数写得有点问题,一直在WA,
然后修改下就过了。离散化时将所有的时间点都加入到一个X数组中,经过判重后X的元素
有k个,我们就可以建立一个k个元素的线段树。查询和修改时只需找到时间点在X数组中
的位置,然后就和普通线段树没有任何区别了,这题不需要从叶子向根节点更新,只需从
根到叶子节点更新。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 const int MAXN = 100100; int col[MAXN << 2], sum[MAXN << 2], q[MAXN]; int X[MAXN << 2], si[MAXN], ti[MAXN]; int n, mm, e, k; /* void PushUp(int rt) { sum[rt] = max(sum[rt << 1], sum[rt << 1 | 1]); } */ void PushDown(int rt) { if(col[rt]) { col[rt << 1] += col[rt]; col[rt << 1 | 1] += col[rt]; sum[rt << 1] += col[rt]; sum[rt << 1 | 1] += col[rt]; col[rt] = 0; } } void build(int l, int r, int rt) { int m = l + r >> 1; sum[rt] = 0; col[rt] = 0; if(l == r) { return; } build(lson); build(rson); //PushUp(rt); } void update(int L, int R, int l, int r, int rt) { int m = l + r >> 1; if(L <= l && r <= R) { col[rt] ++; sum[rt] ++; return; } PushDown(rt); if(L <= m) update(L, R, lson); if(R > m) update(L, R, rson); //PushUp(rt); } int query(int L, int R, int l, int r, int rt) { int m = l + r >> 1, ret = 0; if(L <= l && r <= R) { return sum[rt]; } PushDown(rt); if(L <= m) return query(L, R, lson); if(R > m) return query(L, R, rson); } int BS(int key, int n, int X[]) { int l = 0, r = n - 1; while(l <= r) { int m = l + r >> 1; if(key == X[m]) return m; if(key < X[m]) r = m - 1; else l = m + 1; } return l; } void init() { int i, j; scanf("%d%d", &n, &mm); e = 0; for(i = 0; i < n; i ++) { scanf("%d%d", &si[i], &ti[i]); X[e ++] = si[i]; X[e ++] = ti[i]; } for(i = 0; i < mm; i ++) { scanf("%d", &q[i]); X[e ++] = q[i]; } sort(X, X + e); k = 1; for(i = 1; i < e; i ++) { if(X[i] != X[i - 1]) X[k ++] = X[i]; } } int main() { int T, cas, i; scanf("%d", &T); for(cas = 1; cas <= T; cas ++) { init(); build(0, k, 1); for(i = 0; i < n; i ++) { int L = BS(si[i], k, X); int R = BS(ti[i], k, X); update(L, R, 0, k, 1); } printf("Case #%d:\n", cas); for(i = 0; i < mm; i ++) { int p = BS(q[i], k, X); printf("%d\n", query(p, p, 0, k, 1)); } } return 0; }