您的位置:首页 > 其它

【HDOJ】1556 Color the ball

2014-10-09 23:12 423 查看
解法一:线段树, 延迟更新.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

#define MAXN 100001
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1

int sum[MAXN<<2];
int delta[MAXN<<2];

void PushUp(int rt) {
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}

void PushDown(int rt, int n) {
if (delta[rt]) {
delta[rt<<1] += delta[rt];
delta[rt<<1|1] += delta[rt];
sum[rt<<1] += delta[rt] * (n - (n>>1));
sum[rt<<1|1] += delta[rt] * (n>>1);
delta[rt] = 0;
}
}

void build() {
memset(sum, 0, sizeof(sum));
memset(delta, 0, sizeof(delta));
}

void update(int ll, int rr, int l, int r, int rt) {
if (ll<=l && rr>=r) {
delta[rt]++;
sum[rt] += r-l+1;
return ;
}
PushDown(rt, r-l+1);
int mid = (l+r)>>1;
if (ll <= mid)
update(ll, rr, lson);
if (mid < rr)
update(ll, rr, rson);
PushUp(rt);
}

int query(int ll, int rr, int l, int r, int rt) {
if (ll<=l && rr>=r) {
return sum[rt];
}
PushDown(rt, r-l+1);
int mid = (l+r)>>1, ret = 0;
if (ll <= mid)
ret += query(ll, rr, lson);
if (mid < rr)
ret += query(ll, rr, rson);
return ret;
}

int main() {
int n, a, b;
int i, tmp;

while (scanf("%d", &n)!=EOF && n) {
build();
for (i=0; i<n; ++i) {
scanf("%d %d", &a, &b);
update(a, b, 1, n, 1);
}
for (i=1; i<=n; ++i) {
tmp = query(i, i, 1, n, 1);
if (i != n)
printf("%d ", tmp);
else
printf("%d\n", tmp);
}
}

return 0;
}


解法二:树状数组

#include <cstdio>
#include <cstring>

#define MAXN 100001

int sum[MAXN];
int n;

int lowbit(int x) {
return x&(-x);
}

void update(int x, int delta) {
while (x <= n) {
sum[x] += delta;
x += lowbit(x);
}
}

int getSum(int x) {
int ret = 0;
while (x > 0) {
ret += sum[x];
x -= lowbit(x);
}
return ret;
}

int main() {
int i, a, b;

while (scanf("%d", &n)!=EOF && n) {
memset(sum, 0, sizeof(sum));
for (i=1; i<=n; ++i) {
scanf("%d %d", &a, &b);
update(a, 1);
update(b+1, -1);
}
for (i=1; i<=n; ++i) {
int tmp = getSum(i);
if (i != n)
printf("%d ", tmp);
else
printf("%d\n", tmp);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: