题目大意
给定区间[1,N],初始时区间的每个数都是0,对其进行多次操作,每次给出两个数a和b,要求你对在区间[a,b]的数全部加1,在操作结束后输出每个数的值
题解
最基础的树状数组了,就是修改区间[a,b]的值,询问单个元素的值
代码:
#include<iostream> #include<cstring> #include<cstdio> #define MAXN 100005 using namespace std; int c[MAXN]; int n; int lowbit(int x) { return x&-x; } void add(int x,int d) { while(x<=n) { c[x]+=d; x+=lowbit(x); } } int sum(int x) { int ret=0; while(x>0) { ret+=c[x]; x-=lowbit(x); } return ret; } int main(void) { int i,j,l,r; while(scanf("%d",&n)==1&&n) { memset(c,0,sizeof(c)); for(i=1;i<=n;i++) { scanf("%d%d",&l,&r); add(l,1); add(r+1,-1); } for(i=1;i<n;i++) printf("%d ",sum(i)); printf("%d\n",sum(i)); } return 0; }