Submission
Status:
(PPPPPPPPPPPPPP)(PPPPPPPPPPP)(PPPPPPPPP)(PPPPPPPPPP)(PPPPPPPPPP)(PPPPPPPPPPPPPP)(xSSSSSSSSSSSSSSSSSSSSS)
Subtask/Task Score:
{5/5}{7/7}{8/8}{12/12}{16/16}{28/28}{0/24}
Score: 76
User: sukritp5
Problemset: แคง (Kang)
Language: cpp
Time: 1.216 second
Submitted On: 2026-04-15 17:59:50
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MXN=1e6+7;
pair<ll,int> tree[4*MXN];
void update(int idx,ll val,int dl,int dr,int v){
if(dl==dr)tree[v]={val,idx};
else{
int mid=(dl+dr)/2;
if(idx<=mid){
update(idx,val,dl,mid,2*v);
}
else update(idx,val,mid+1,dr,2*v+1);
tree[v]=max(tree[2*v],tree[2*v+1]);
}
}
bool mark[2*MXN];
unordered_map<int,pair<int,int>> mp;//idx,cnt
std::vector<long long> capsize(std::vector<int> A, std::vector<int> B) {
vector<ll> ans;
int N=A.size(),K=B.size();
int now=1;
ll sum=0;
for(auto x:A){
if(mp[x].second==0)mp[x]={now++,1};
else mp[x].second++;
update(mp[x].first,(ll)x*mp[x].second,1,N+K,1);
sum+=x;
}
//sum = 27
for(auto x:B){
pair<int,int> tmp=mp[x];
if(mark[tmp.first]){
sum-=tree[1].first;
// cout<<tree[1].first<<' ';
mark[tree[1].second]=1;
update(tree[1].second,0,1,N+K,1);
// cout<<tree[1].first<<' ';
//cout<<"!1 ";
}
else if(tmp.first==0){
update(now,x,1,N+K,1);
mp[x]={now++,1};
sum+=(ll)x-tree[1].first;
mark[tree[1].second]=1;
update(tree[1].second,0,1,N+K,1);
//cout<<"!2 ";
}
else if((ll)x*(tmp.second+1)>=tree[1].first){
update(tmp.first,0,1,N+K,1);
mark[tmp.first]=1;
sum-=(ll)x*tmp.second;
//cout<<"!3 ";
}
else{
mp[x].second++;
update(tmp.first,(ll)x*(tmp.second+1),1,N+K,1);
sum+=(ll)x-tree[1].first;
mark[tree[1].second]=1;
update(tree[1].second,0,1,N+K,1);
//cout<<"!4 ";
}
//cout<<tree[1].first<<' ';
ans.emplace_back(sum);
}
return ans;
}