社区讨论
关于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);
}
其中
CPPfr[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);
如果写成
CPPfr[x].erase(*fr[x].begin()),fr[x].insert(u/2);
fr[y].erase(*fr[y].begin()),fr[y].insert(v/2);
是错的,why?
回复
共 1 条回复,欢迎继续交流。
正在加载回复...