acm.hdu.edu.cn/showproblem.php?pid=1556
点的覆盖问题 线段数lazy_tag。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
struct node{
int l, r, lazy;
int mid(){
return (l + r) >> 1;
}
}tree[N << 2];
void pushdown(int rt){
if(tree[rt].lazy){
tree[rt << 1].lazy += tree[rt].lazy;
tree[rt << 1 | 1].lazy += tree[rt].lazy;
tree[rt].lazy = 0;
}
}
void buildtree(int l, int r, int rt){
tree[rt].l = l;
tree[rt].r = r;
tree[rt].lazy = 0;
if(l == r) return;
int mid = tree[rt].mid();
buildtree(l, mid, rt << 1);
buildtree(mid+1, r, rt << 1 | 1);
}
void update(int l, int r, int rt){
if(tree[rt].l >= l && tree[rt].r <= r){
tree[rt].lazy++;
return;
}
pushdown(rt);
int mid = tree[rt].mid();
if(r <= mid) update(l, r, rt << 1);
else if(l > mid) update(l, r, rt << 1 | 1);
else update(l, mid, rt << 1),update(mid+1, r, rt << 1 | 1);
}
int query(int id, int rt){
if(tree[rt].l == id && tree[rt].r == id){
return tree[rt].lazy;
}
pushdown(rt);
int mid = tree[rt].mid();
if(id <= mid) return query(id, rt << 1);
else return query(id, rt << 1 | 1);
}
int main(){
// freopen("in.txt", "r", stdin);
int n;
while(scanf("%d",&n) != EOF && n){
buildtree(1, n, 1);
int a,b;
for(int i=0; i<n; i++){
scanf("%d%d",&a,&b);
update(a,b,1);
}
printf("%d",query(1,1));
for(int i=2; i<=n; i++)
printf(" %d",query(i,1));
printf("\n");
}
return 0;
}