您的位置:首页 > 其它

HDU 4325 Flowers

2012-08-09 16:10 253 查看
  线段树的离散化和成段增减和单点查询。开始的时候二分函数写得有点问题,一直在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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: