社区讨论

关于multiset

P1456Monkey King参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mlhrevht
此快照首次捕获于
2026/02/11 16:20
上周
此快照最后确认于
2026/02/11 18:00
上周
查看原帖
CPP
#include <bits/stdc++.h>
//#pragma GCC optimize(2)
using namespace std;
void Ios(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}
#define REP(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define fir first
#define sec second
#define pb push_back
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define ll long long
#define int long long
const int maxn=1e5+10;
int a[maxn];
multiset<int,greater<int>> fr[maxn];
int f[maxn];
int find(int x)
{
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
}
void solve(int n)
{
	REP(i,1,n) cin>>a[i],fr[i].clear(),fr[i].insert(a[i]),f[i]=i;
	int m;
	cin>>m;
	while(m--)
	{
		int x,y;
		cin>>x>>y;
		x=find(x),y=find(y);
		if(x==y)
		{
			cout<<-1<<"\n";
			continue;
		}
		int u=*fr[x].begin(),v=*fr[y].begin();
		fr[x].erase(fr[x].lower_bound(u)),fr[x].insert(u/2);
		fr[y].erase(fr[y].lower_bound(v)),fr[y].insert(v/2);
		if(fr[x].size()>fr[y].size()) swap(x,y);
		for(auto it:fr[x]) fr[y].insert(it);
		f[x]=y;
		fr[x].clear();
		cout<<*fr[y].begin()<<"\n";
	}
}
signed main()
{
	Ios();
	int n;
	while(cin>>n) solve(n);
}
其中
CPP
fr[x].erase(fr[x].lower_bound(u)),fr[x].insert(u/2);
		fr[y].erase(fr[y].lower_bound(v)),fr[y].insert(v/2);
如果写成
CPP
fr[x].erase(*fr[x].begin()),fr[x].insert(u/2);
		fr[y].erase(*fr[y].begin()),fr[y].insert(v/2);
是错的,why?

回复

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

正在加载回复...