社区讨论
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 条回复,欢迎继续交流。
正在加载回复...