93分TLE求大佬调QAQ
查看原帖
93分TLE求大佬调QAQ
1130543
wadexin楼主2024/10/8 13:58
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N = 1e5+9;
struct Node
{
	ll son[2];//两个子结点
	ll dist;
	ll val;
}t[N];
ll pre[N],a[N];
bitset<N> vis;//来判断是否被删除
ll find(ll x){return (pre[x] == x?x:pre[x] = find(pre[x]));}//路径压缩的并查集
ll &rs(ll x)//以dist较小的作为右儿子
{
	return t[x].son[(t[t[x].son[1]].dist>t[t[x].son[0]].dist)];
}
ll merge(ll x,ll y)
{
	if(!x||!y) return x|y;//返回不为空的部分
	if(t[x].val>t[y].val) swap(x,y);//以较小的为根
	ll &rson = rs(x);
	rson = merge(rson,y);
	t[x].dist = t[rson].dist+1;
	return x;
}
void erase(ll x)
{
	ll y = merge(t[x].son[0],t[x].son[1]);
	pre[t[x].son[0]] = y;
	pre[t[x].son[1]] = y;
	pre[x] = y;
	t[t[x].son[0]].dist = 0;
	t[t[x].son[1]].dist = 0;
	t[x].dist = 0;
}
void solve()
{
	ll n,m;cin>>n>>m;
	for(int i = 1;i<=n;i++)
	{
		cin>>t[i].val;
		pre[i] = i;
	}
	while(m--)
	{
		ll op,x,y;cin>>op>>x;
		if(op == 1)
		{
			cin>>y;
			if(vis[x]||vis[y]) continue;
			x = find(x);y = find(y);
			if(x!=y) pre[x] = pre[y] = merge(x,y);
		}
		else
		{
			if(vis[x])//x已经被删除
			{
				cout<<-1<<"\n";
				continue;
			}
			x = find(x);
			cout<<t[x].val<<"\n";
			vis[x] = 1;
			erase(find(x));
		}
	}
}

int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _ = 1;//cin>>_;
	while(_--){solve();}
	return 0;
}

2024/10/8 13:58
加载中...