社区讨论
树套树代码MLE on #10 球跳
P3810【模板】三维偏序 / 陌上花开参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mlka989w
- 此快照首次捕获于
- 2026/02/13 10:43 6 天前
- 此快照最后确认于
- 2026/02/15 21:25 4 天前
我已经无计可施了
CPP#include<iostream>
#include<algorithm>
using namespace std;
struct sd{
int x,y,z;
bool operator<(sd b)const{
if(x!=b.x)return x<b.x;
if(y!=b.y)return y<b.y;
return z<b.z;
}bool operator==(sd b)const{
return x==b.x && y==b.y && z==b.z;
}
};
int n,k;
int p[114514];
sd a[114514];
struct tree2{
int sum=0,l=1,r=200000;
tree2 *left=NULL,*right=NULL;
};
struct tree1{
int sum=0,l=1,r=200000;
tree1 *left=NULL,*right=NULL;
tree2 *next=NULL;
}*top=new tree1;
void add(tree2 *t,int x){
t->sum++;
if(t->l==t->r){
return;
}int mid=t->l+t->r>>1;
if(x<=mid){
if(!t->left){
t->left=new tree2;
t->left->l=t->l;
t->left->r=mid;
}add(t->left,x);
}else{
if(!t->right){
t->right=new tree2;
t->right->l=mid+1;
t->right->r=t->r;
}add(t->right,x);
}
}void add(tree1 *t,int x,int y){
if(!t->next){
t->next=new tree2;
t->next->r=k;
}t->sum++;
add(t->next,y);
if(t->l==t->r){
return;
}int mid=t->l+t->r>>1;
if(x<=mid){
if(!t->left){
t->left=new tree1;
t->left->l=t->l;
t->left->r=mid;
}add(t->left,x,y);
}else{
if(!t->right){
t->right=new tree1;
t->right->l=mid+1;
t->right->r=t->r;
}add(t->right,x,y);
}
}int query(tree2 *t,int l,int r){
if(!t)return 0;
if(t->l>=l && t->r<=r){
return t->sum;
}int mid=t->l+t->r>>1;
int sum=0;
if(l<=mid){
sum+=query(t->left,l,r);
}if(r>mid){
sum+=query(t->right,l,r);
}return sum;
}int query(tree1 *t,int l,int r,int _l,int _r){
if(!t)return 0;
if(t->l>=l && t->r<=r){
return query(t->next,_l,_r);
}int mid=t->l+t->r>>1;
int sum=0;
if(l<=mid){
sum+=query(t->left,l,r,_l,_r);
}if(r>mid){
sum+=query(t->right,l,r,_l,_r);
}return sum;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>k;
top->r=k;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y>>a[i].z;
}sort(a+1,a+n+1);
int j=1;
for(int i=1;i<=n;i++){
for(;j<=n && a[i]==a[j];j++){
add(top,a[j].y,a[j].z);
}p[query(top,1,a[i].y,1,a[i].z)-1]++;
}for(int i=0;i<n;i++){
cout<<p[i]<<"\n";
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...