居然在别人的树状数组里面看到了这道题。
这明明是差分好吧
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 100010;
int n,a,b,t[N];
int main(){
while(scanf("%d",&n)&&n){
memset(t,0,sizeof(t));
for(int i = 0;i<n;i++) {
scanf("%d%d",&a,&b);
t[a]++;t[b+1]--;
}
for(int i = 1;i<=n;i++)t[i] += t[i-1];
for(int i = 1;i<n;i++)
printf("%d ",t[i]);
printf("%d\n",t[n]);
}
return 0;
}
附上树状数组代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 100010;
int n,a[N],b[N],c[N];
inline int lowbit(int x){
return x & (-x);
}
int sum(int x){
int s = 0;
while(x > 0){
s += c[x];
x -= lowbit(x);
}
return s;
}
void add(int i,int x){
if(!i) return ;
while(i <= N) {
c[i] += x;
i += lowbit(i);
}
}
int main(){
while(scanf("%d",&n)&&n){
for(int i = 0;i<n;i++) scanf("%d%d",a+i,b+i);
memset(c,0,sizeof(c));
for(int i = 0;i<n;i++) {
add(a[i],1);
add(b[i]+1,-1);
}
for(int i = 1;i<n;i++)
printf("%d ",sum(i));
printf("%d\n",sum(n));
}
return 0;
}