你好陌生人,我需要帮助
现在我认为大概率是是 ≤ 的问题。导致我没能将一些相等的情况算入答案。
#include<bits/stdc++.h>
#define endl '\n'
#define lint __int128
using namespace std;
const int N=2e5+10;
struct node{
int a,b,c,id;
}s[N];
int n,k;
int tr[N];
int lowbit(int x){
return x&(-x);
}//end
void add(int x){
for(int i=x;i<=k;i+=lowbit(i)) tr[i]++;
}//end
void clear(int x){
for(int i=x;i<=k;i+=lowbit(i)) {
if(tr[i]) tr[i]=0;
else break;
}
}//end
int query(int x){
int ans=0;
for(int i=x;i;i-=lowbit(i)) ans+=tr[i];
return ans;
}//end
bool cmp1(node x,node y){
if(x.a==y.a&&x.b==y.b) return x.c<y.c;
if(x.a==y.a) return x.b<y.b;
return x.a<y.a;
}//end
bool cmp2(node x,node y){
if(x.b==y.b) return x.c<y.c;
return x.b<y.b;
}//end
int f[N];
int ans[N];
node a[N],b[N];
void solve(int l,int r){
if(l==r) return;
int mid=l+r>>1;
solve(l,mid); solve(mid+1,r);
for(int i=l;i<=mid;i++) a[i]=s[i];
for(int i=mid+1;i<=r;i++) b[i]=s[i];
sort(a+l,a+mid+1,cmp2);
sort(b+mid+1,b+r+1,cmp2);
int i=l-1;
for(int j=mid+1;j<=r;j++){
while(i<mid&&a[i+1].b<=b[j].b){
i++;
add(a[i].c);
}
f[b[j].id]+=query(b[j].c);
}
for(;i>=l;i--) clear(a[i].c);
}//end
int main(){
freopen("1.in","r",stdin );
// ios::sync_with_stdio(0);
cin>>n>>k;
for(int i=1;i<=n;i++){
int a,b,c; cin>>a>>b>>c;
s[i]={a,b,c,i};
}
sort(s+1,s+n+1,cmp1);
solve(1,n);
for(int i=1;i<=n;i++) ans[f[i]]++;
for(int i=0;i<n;i++) cout<<ans[i]<<endl;
return 0;
}//end