社区讨论

树套树代码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 条回复,欢迎继续交流。

正在加载回复...