题目传送门
- 才入门树状数组,没有搞懂这个题和树状数组有什么联系,其实这个题虽然给的是一个二维的图,但是可以把它放到一维来看,首先他给出的x,y是有顺序的,y一定的时候,后面给出的一定比前面的level高,而这里的y一定的情况下按照x的顺序排列,所以就可以把他当成一个x轴
下面用题目的样例来解释
5
1 1
5 1
7 1
3 3
5 5
首先y等于1的时候,输入x
这个时候查找x前面所有的和就是它的level
此时level0=1,level1=1,level2=1;
1 5 7//对应的x
1 1 1//对应的树状数组
然后输入y等于3的时候,就插进去一个x=3
level2+1=2
1 3 5 7
1 1 1 1
y=5的时候,插进去x=5,已经存在了,这个时候把5这里的树状数组的值更新为加1
level3=1
1 3 5 7
1 1 2 1
完整代码
#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<vector>
#include<queue>
#include<string>
#include <cmath>
#include<set>
#define mod 999997
#define lson l, mid, root << 1
#define rson mid + 1, r, root << 1 | 1
#define father l , r , root
#define lowbit(x) ( x & ( - x ) )
using namespace std;
typedef long long ll;
const int maxn = 32010;
const int inf = 0x3f3f3f3f;
int cnt[maxn];
int a[maxn];
int sum(int x){
int ans=0;
for(int i=x;i>0;i-=lowbit(i)){
ans+=a[i];
}
return ans;
}
void update(int x){
for(int i=x;i<=maxn;i+=lowbit(i)){
a[i]++;
}
}
int main( ){
int n;
while(~scanf("%d",&n)){
//scanf("%d",&n);
memset(cnt,0,sizeof(cnt));
memset(a,0,sizeof(a));
for(int i=0;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
cnt[sum(x+1)]++;
update(x+1);//更新该位置的值+1
}
for(int i=0;i<n;i++){
printf("%d\n",cnt[i]);
}
}
return 0;
}