社区讨论
求优化常数
P11266【模板】可并堆 2参与者 18已保存回复 17
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 17 条
- 当前快照
- 1 份
- 快照标识符
- @mks0st47
- 此快照首次捕获于
- 2026/01/24 16:00 4 周前
- 此快照最后确认于
- 2026/01/24 16:14 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 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);
}
}
}
回复
共 17 条回复,欢迎继续交流。
正在加载回复...