写在前面:
题目卡内存,离散化+二维树状数组 爆内存。
思路:
观察到一个点的左下部分,x和y一定是小于等于这个点的。
题目数据已经排序了,按 y 单调递增的顺序每次查询比当前比 x 小的点的个数就是左下部分的个数 ,再 add(x) 即可。
Code
#include <iostream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <algorithm>
#include <vector>
#include <string>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
//#include <unordered_map>
#define guo312 std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define ll long long
#define Inf LONG_LONG_MAX
#define inf INT_MAX
#define endl "\n"
#define PI 3.1415926535898
using namespace std;
const int N=4e4;
int c[N],ans[N];
int lowbit(int x){
return x&(-x);
}
void add(int x){
for( ;x<N;c[x]++,x+=lowbit(x));
}
int query(int x){
int re=0;
for( ;x>0;re+=c[x],x-=lowbit(x));
return re;
}
int main(){
guo312;
int n,x,y; cin>>n;
for(int i=1;i<=n;i++){
cin>>x>>y; x++,y++;
ans[query(x)]++;
add(x);
}
for(int i=0;i<n;i++){
cout<<ans[i]<<endl;
}
return 0;
}