社区讨论

k-d tree 过不了

P3810【模板】三维偏序 / 陌上花开参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mi6omlff
此快照首次捕获于
2025/11/20 08:17
4 个月前
此快照最后确认于
2025/11/20 08:17
4 个月前
查看原帖
虽然我的代码在COGS的[偏序++]上过了(蒟蒻不会写分块),但是毕竟那题的数据范围只有4w,毕竟kd树是暴力,我的代码在这里只拿了50分。大家不要写kd树。
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,D,rt,nw,cur,ans[N];
struct Node {
  int p[3],mn[3],mx[3],l,r,sz;
  bool operator<(const Node &T)const {
    return p[D]<T.p[D];
  }
  void up(const Node &T) {
    sz+=T.sz;
    for (int i=0;i<3;++i)
      mn[i]=min(mn[i],T.mn[i]),mx[i]=max(mx[i],T.mx[i]);
  }
} t[N];
void build(int &u,int l,int r,int d) {
  u=l+r>>1,D=d; nth_element(t+l,t+u,t+r+1); t[u].sz=1;
  for (int i=0;i<3;++i) t[u].mn[i]=t[u].mx[i]=t[u].p[i];
  if (l<u) build(t[u].l,l,u-1,(d+1)%3),t[u].up(t[t[u].l]);
  if (u<r) build(t[u].r,u+1,r,(d+1)%3),t[u].up(t[t[u].r]);
}
void query(int u) {
  if (!u) return; int f1=1,f2=1;
  for (int i=0;i<3;++i) {
    if (t[u].mn[i]>t[nw].p[i]) return;
    if (t[u].mx[i]>t[nw].p[i]) f1=0;
    if (t[u].p[i]>t[nw].p[i]) f2=0;
  }
  if (f1) return void(cur+=t[u].sz);
  if (f2) ++cur;
  query(t[u].l),query(t[u].r);
}
int main() {
  scanf("%d%d",&n,&rt);
  for (int i=1;i<=n;++i)
    for (int j=0;j<3;++j) scanf("%d%d",&t[i].p[j]);
  build(rt,1,n,0);
  for (nw=1;nw<=n;++nw) cur=0,query(rt),++ans[cur];
  for (int i=1;i<=n;++i) printf("%d\n",ans[i]);
}

回复

6 条回复,欢迎继续交流。

正在加载回复...