Problems: [TLX](https://tlx.toki.id/problems/osnp-2023)
# B1
```cpp
#include <bits/stdc++.h>
#define vec vector
#define pb push_back
#define ll long long
#define fs first
#define sc second
#define pll pair<ll,ll>
using namespace std;
int main() {
ll n,m,x;cin>>n>>m;
vec<ll> B(m);
pll a = {0,n};
pll b = {0,m};
for (ll i=0;i<n;i++) cin>>x,a.fs+=x;
for (ll i=0;i<m;i++) cin>>B[i],b.fs+=B[i];
sort(B.rbegin(), B.rend());
auto avg = [&](pll x) {
return x.fs/((double)x.sc);
};
ll ans=0;
ll i=0;
while (i+1<m && avg(a)<=avg(b)) {
do {
a.fs+=B[i];a.sc++;
b.fs-=B[i];b.sc--;
ans+=B[i];
i++;
} while (i<m && B[i]==B[i-1]);
}
if (avg(a)<=avg(b)) ans=-1;
cout<<ans<<endl;
}
```
---
# B2
```cpp
#include <bits/stdc++.h>
#define vec vector
#define pb push_back
#define ll long long
#define fs first
#define sc second
#define pll pair<ll,ll>
using namespace std;
int main() {
ll n,m,k;cin>>n>>m>>k;
vec<ll> a(n);
for (int i=0;i<n;i++) {
cin>>a[i];
}
sort(a.begin(), a.end());
ll cnt=0;
for (int i=0;i<n;i++) {
m+=k;
auto ptr = upper_bound(a.begin(), a.end(), m);
if (ptr==a.end()) break;
m=*ptr;
cnt++;
}
cout<<cnt<<endl;
}
```
---
# B3
```cpp
#include <bits/stdc++.h>
#define vec vector
#define pb push_back
#define ll long long
#define fs first
#define sc second
#define pll pair<ll,ll>
using namespace std;
const int MXN = (int)1e5+5;
int par[MXN];
int sz[MXN];
ll df[MXN];
void initdsu() {
for(int i=0;i<MXN;i++) {
par[i]=i;
sz[i]=1;
df[i]=1e9;
}
}
int gpar(int x) {
if (par[x]!=x) par[x] = gpar(par[x]);
return par[x];
}
bool chk(int u, int v) {
return gpar(u)==gpar(v);
}
void join(int u, int v) {
if (chk(u,v)) return;
// cout<<"bf join "<<u<<' '<<v<<endl;
int pu=gpar(u),pv=gpar(v);
if (sz[pv]>sz[pu])swap(pu,pv);
par[pv]=pu;
sz[pu]+=sz[pv];
df[pu]=min(df[pu], df[pv]);
}
int main() {
initdsu();
ll n,m,k;cin>>n>>m>>k;
for (int i=0;i<n;i++) {
cin>>df[i];
}
vec<ll> trfs(m);
for (int i=0;i<m;i++) {
cin>>trfs[i];
}
sort(trfs.begin(), trfs.end());
for (int i=0;i<k;i++) {
int u,v;
cin>>u>>v;
join(u-1,v-1);
}
vec<ll> islands;
for (int i=0;i<n;i++) {
if (gpar(i)==i) {
islands.pb(df[i]);
// cout<<"i="<<i<<"cst="<<df[i]<<endl;
}
}
if (islands.size()>trfs.size()) {cout<<-1<<endl; return 0;}
sort(islands.begin(), islands.end());
int icnt = islands.size();
ll res=0;
for (int i=0;i<icnt;i++) {
// cout<<"df="<<islands[i]<<" trf="<<trfs[icnt-i-1]<<endl;
res+=islands[i]*trfs[icnt-i-1];
}
cout<<res<<endl;
}
```
---
# B4
```cpp
#include <bits/stdc++.h>
#define vec vector
#define pb push_back
#define ll long long
#define fs first
#define sc second
#define pll pair<ll,ll>
using namespace std;
int main() {
ll n,k,x;cin>>n>>k>>x;
vec<pll> c(n+1);
for (int i=1;i<=n;i++) cin>>c[i].fs;
for (int i=1;i<=n;i++) cin>>c[i].sc;
sort(c.begin(), c.end());
ll pref[n+1];
pref[0]=0;
for (int i=1;i<=n;i++) {
pref[i]=pref[i-1]+c[i].sc;
}
ll ans=0;
for (int i=1;i<=n;i++) {
if (abs(x-c[i].fs)>k) continue;
int lpos=c[i].fs;
ll trgt;
if (c[i].fs>=x) trgt = x+k;
else trgt=x+k-2*abs(lpos-x);
int ridx = upper_bound(c.begin(), c.end(),make_pair(trgt, (ll)2e9))-c.begin()-1;
if (ridx<0) continue;
ans=max(ans, pref[ridx]-pref[i-1]);
}
for (int i=n;i>0;i--) {
if (abs(x-c[i].fs)>k) continue;
int rpos=c[i].fs;
ll trgt;
if (c[i].fs<=x) trgt = x-k;
else trgt=x-(k-2*abs(rpos-x));
int lidx = lower_bound(c.begin(), c.end(),make_pair(trgt, (ll)-1))-c.begin();
ans=max(ans, pref[i]-pref[lidx-1]);
}
cout<<ans<<endl;
}
```
---
# B5
Check [My Submission](https://tlx.toki.id/submissions/1478026)
---