社区讨论

求优化常数

P11266【模板】可并堆 2参与者 12已保存回复 11

讨论操作

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

当前回复
11 条
当前快照
1 份
快照标识符
@mks4qxuw
此快照首次捕获于
2026/01/24 17:51
4 周前
此快照最后确认于
2026/01/24 18:11
4 周前
查看原帖
最慢的点跑了 351ms,好慢啊。。
有人帮忙优化一下常数吗?
还有,你们这帮人,给我好好的卡常帖子举报了是何意味?
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
const int inf=(int)1e18+10;
struct left_heap{
	#define ls(x) f[x].ls
	#define rs(x) f[x].rs
	struct nd{
		int ls,rs,d;
		int val;
		int fa;
	}f[N];
	int rt[N];
	void det(){
		cerr<<"----------------\n";
		for(int i=1;i<=5;i++){
			cerr<<rt[i]<<" ";
		}
		cerr<<"\n";
		for(int i=1;i<=5;i++){
			cerr<<i<<" "<<ls(i)<<" "<<rs(i)<<" "<<f[i].d<<" "<<f[i].val<<" "<<f[i].fa<<"\n";
		}
		
	}
	void init(int n,int a[]){
		for(int i=1;i<=n;i++){
			f[i].fa=rt[i]=i;
			f[i].val=a[i];
		}
	}
	int mer(int x,int y){
		if(!x||!y) return x+y;
		if(f[x].val>f[y].val) swap(x,y);
		rs(x)=mer(rs(x),y);
		if(f[ls(x)].d<f[rs(x)].d) swap(ls(x),rs(x));
		f[x].d=f[rs(x)].d+1;
		if(ls(x)) f[ls(x)].fa=x;
		if(rs(x)) f[rs(x)].fa=x;
		return x;
	}
	void push_up(int x){
		if(!x) return;
		if(f[ls(x)].d<f[rs(x)].d) swap(ls(x),rs(x));
		if(f[x].d!=f[rs(x)].d+1){
			f[x].d=f[rs(x)].d+1;
			push_up(f[x].fa);
		}
	}
	void era(int x,int pos){
		int y=mer(ls(x),rs(x));
		if(f[x].fa!=x){
			f[y].fa=f[x].fa;
			if(ls(f[y].fa)==x) ls(f[y].fa)=y;
			if(rs(f[y].fa)==x) rs(f[y].fa)=y;
			push_up(f[y].fa);
		}
		else rt[pos]=f[y].fa=y;
	}
	int que(int pos){
		return f[rt[pos]].val;
	}
	void mer_f(int x,int y){
		rt[x]=mer(rt[x],rt[y]);
	}
	void upd(int pos,int y,int z){
		era(y,pos);
		f[y]={0,0,1,z,y};
		rt[pos]=mer(rt[pos],y);
	}
}t;
int n,q,a[N];
signed main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	t.init(n,a);
	while(q--){
		int op,x,y,z;
		cin>>op;
		if(op==0){
			cin>>x>>y;
			t.era(y,x);
		}
		if(op==1){
			cin>>x;
			cout<<t.que(x)<<"\n";
		}
		if(op==2){
			cin>>x>>y;
			t.mer_f(x,y);
		}
		if(op==3){
			cin>>x>>y>>z;
			t.upd(x,y,z);
		}
	//	t.det();
	}
}

回复

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

正在加载回复...