# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1211502 | user736482 | Nile (IOI24_nile) | C++20 | 0 ms | 0 KiB |
#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define ff first
#define ss second
#define MOD 1000000009
#define INF 1000000019
#define POT (1<<20)
#define INFL 1000000000000000099
ll bst[1000007];
multiset<ll>st[1000007];
multiset<pair<ll,ll>>st2[1000007];
ll moj[1000007],moj2[1000007];
void akt(ll x,ll d){
while(st2[x].size() && (*st2[x].begin()).ff<=d){
st[x].insert((*st2[x].begin()).ss);
st2[x].erase(st2[x].begin());
}
}
ll pol(ll x,ll d){
if((moj2[x]-moj[x])%2)return bst[x];
return bst[x]+*st[x].begin();
}
vector<ll>calculate_costs(vector<ll>w,vector<ll>a,vector<ll>b,vector<ll>e){
multiset<pair<ll,ll>>s;
ll n=w.size();
vector<pair<ll,ll>>q;
for(ll i=0;i<e.size();i++){
q.pb({e[i],i});
}
vector<pair<ll,pair<ll,ll>>>bts;
for(ll i=0;i<w.size();i++){
bts.pb({w[i],{a[i],b[i]}});
}
sort(bts.begin(),bts.end());
vector<pair<ll,ll>>zm;
for(ll i=0;i<w.size()-1;i++){
q.pb({bts[i+1].ff-bts[i].ff,-i-1});
}
sort(q.begin(),q.end());
ll akm=0;
for(ll i=0;i<n+7;i++){moj[i]=i;moj2[i]=i;}
for(ll i=0;i<w.size();i++){
st[i].insert(bts[i].ss.ff-bts[i].ss.ss);
st[i].insert(bts[i].ss.ff-bts[i].ss.ss);
bst[i]=bts[i].ss.ss;
akm+=bts[i].ss.ff;
}
vector<ll>ret;
vector<pair<ll,ll>>pm;
for(pair<ll,ll>i : q){
while(s.size() && (*s.begin()).ff<=i.ff){
auto pom=*s.begin();
s.erase(s.begin());
akm-=pol(pom.ss,pom.ff);
akt(pom.ss,pom.ff);
akm+=pol(pom.ss,pom.ff);
if(st2[pom.ss].size()) s.insert({(*st2[pom.ss].begin()).ff,pom.ss});
}
if(i.ss>=0){
pm.pb({i.ss,akm});
}
else{
ll a=-i.ss-1;
cout<<a<<" ";
ll p1=moj[a];
ll p2=moj[a+1];
akm-=pol(p1,i.ff);
akm-=pol(p2,i.ff);
cout<<akm<<" ";
akt(p1,i.ff);
akt(p2,i.ff);
if(st[p1].size()<st[p2].size())swap(st[p1],st[p2]);
if(st2[p1].size()<st2[p2].size())swap(st2[p1],st2[p2]);
for(auto it : st[p2])st[p1].insert(it);
for(auto it : st2[p2])st2[p1].insert(it);
st[p1].erase(st[p1].lower_bound(bts[a+1].ss.ff-bts[a+1].ss.ss));
st[p1].erase(st[p1].lower_bound(bts[a].ss.ff-bts[a].ss.ss));
if(moj2[a+1]!=a+1)
st2[p1].insert({bts[a+2].ff-bts[a].ff,bts[a+1].ss.ff-bts[a+1].ss.ss});
if(moj[a]!=a)
st2[p1].insert({bts[a+1].ff-bts[a-1].ff,bts[a].ss.ff-bts[a].ss.ss});
if(st2[p1].size())
s.insert({(*st2[p1].begin()).ff,p1});
bst[moj[p1]]+=bst[moj[p2]];
//cout<<bst[moj[p1]];
moj[moj2[p2]]=moj[p1];
moj2[moj[p1]]=moj2[p2];
akt(moj[p1],i.ff);
akm+=pol(moj[p1],i.ff);
cout<<akm<<"\n";
}
}
sort(pm.begin(),pm.end());
for(auto i : pm)ret.pb(i.ss);
return ret;
}