萌新妹子裸题求助
查看原帖
萌新妹子裸题求助
651786
yyc_楼主2023/2/25 16:23
#include<bits/stdc++.h>
#define mids(l,r) const auto mid = l + r >> 1
#define cint const int&
using namespace std;
const int maxn = 5e5+10;
int n,m,k;
struct data {
    int a,b,c;
    int cnt,ans;
    bool ta;
}p[maxn],tmp[maxn];
using cdt = const data&;
inline bool cmpc(cdt u,cdt v) {return u.c < v.c;}
inline bool cmpb(cdt u,cdt v) {return u.b == v.b ? cmpc(u,v) : u.b < v.b;}
inline bool cmpa(cdt u,cdt v) {return u.a == v.a ? cmpb(u,v) : u.a < v.a;}
void cdqb(cint l,cint r) {
    if(l == r) return;
    mids(l,r);
    sort(p+l,p+r+1,cmpb); 
    cdqb(l,mid),cdqb(mid+1,r);
    sort(p+l,p+r+1,cmpb); 
    sort(p+l,p+mid+1,cmpc),
    sort(p+mid+1,p+r+1,cmpc);
    int i = l,j= mid+1,tc =0 ;
    for(;j<=r;++j){
        while(i <= mid && p[i].c <= p[j].c) {
            if(p[i].ta == 0) tc += p[i].cnt;
            ++i;
        }
        if(p[j].ta) p[j].ans += tc;
    }
}
void cdqa(cint l,cint r) {
    if(l == r) return;
    mids(l,r);
    sort(p+l,p+r+1,cmpa);
    cdqa(l,mid),cdqa(mid+1,r);
    sort(p+l,p+r+1,cmpa);
    for(int i = l;i<=mid;++i) p[i].ta = 0;
    for(int i = mid+1;i<=r;++i) p[i].ta = 1;
    sort(p+l,p+r+1,cmpb); 
    cdqb(l,r);
    sort(p+l,p+r+1,cmpa);
}
int ans[maxn];
signed main() {
    ios::sync_with_stdio(0),cin.tie(0);
    cin>>n>>k;
    for(int i = 1;i<=n;++i) cin>>p[i].a>>p[i].b>>p[i].c;
    sort(p+1,p+n+1,cmpa);
    p[n + 1].a = 1e18, p[n + 1].b = 1e18, p[n + 1].c = 1e18;
    for(int tc = 0,i = 1;i<=n;++i){
        ++tc;
        if(p[i].a != p[i+1].a || p[i].b != p[i+1].b || p[i].c != p[i+1].c) {
            p[++m] = p[i];
            swap(p[m].cnt,tc);
        }
    }
    cdqa(1,m);
    for(int i = 1;i<=m;++i)
        ans[p[i].ans + p[i].cnt - 1] += p[i].cnt;
    for(int i = 0;i<n;++i) cout<<ans[i]<<'\n';
}
2023/2/25 16:23
加载中...