网上关于树状数组有很多讲解,我就不说了(其实是领悟不够彻底。。。。)
先上个题目的链接点击打开链接
先向下更新加一遍
update(y,1);
然后把更新多余的内容在取消掉update(x-1,-1);然后向上取和#include<iostream> #include<cstdio> #include<cstring> #define MM(x,y) memset(x,y,sizeof(x)) using namespace std; const int N=110000; typedef long long ll; int n; ll bit[N]; void update(int k,int num) { while(k>0) { bit[k]+=num; k-=k&-k; } } int sum(int k) { int res=0; while(k<=n) { res+=bit[k]; k+=k&-k; } return res; } int main() { int x,y; while(cin>>n&&n) { MM(bit,0); int t=n; while(t--) { cin>>x>>y; update(y,1); update(x-1,-1); } for(int i=1;i<n;i++) { cout<<sum(i)<<" "; } cout<<sum(n)<<endl; } return 0; }