VK news recommendation system daily selects interesting publications of one of n disjoint categories for each user. Each publication belongs to exactly one category. For each category i batch algorithm selects ai publications.
The latest A/B test suggests that users are reading recommended publications more actively if each category has a different number of publications within daily recommendations. The targeted algorithm can find a single interesting publication of i-th category within ti seconds.
What is the minimum total time necessary to add publications to the result of batch algorithm execution, so all categories have a different number of publications? You can’t remove publications recommended by the batch algorithm.
Input
The first line of input consists of single integer n — the number of news categories (1≤n≤200000).
The second line of input consists of n integers ai — the number of publications of i-th category selected by the batch algorithm (1≤ai≤109).
The third line of input consists of n integers ti — time it takes for targeted algorithm to find one new publication of category i (1≤ti≤105).
Output
Print one integer — the minimal required time for the targeted algorithm to get rid of categories with the same size.
Examples
Input
5
3 7 9 7 8
5 2 5 7 5
Output
6
Input
5
1 2 3 4 5
1 1 1 1 1
Output
0
Note
In the first example, it is possible to find three publications of the second type, which will take 6 seconds.
In the second example, all news categories contain a different number of publications.
思路:一开始用的离散化+线段树,但是离散化应该是有点错误,结果不对。而线段树无法承担高额的空间,所以只好作罢。对于数量相同的,我们应该怎样排序,才能使得最终结果最小呢?我们可以比较一下,按照时间由大到小的顺序排序是最优的。拍完序之后,我们利用并查集去查找符合这个数量的最小值,然后与当前的数量差值乘以时间作为答案贡献。
代码如下:
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxx=2e5+100; const int maxn=4e5+100; struct node{ ll num,v; bool operator<(const node &a)const{ if(v!=a.v) return v>a.v; else return num<a.num; } }pp[maxx]; map<ll,ll> f; int n; inline ll getf(ll u) { if(!f[u]) return u; else return f[u]=getf(f[u]); } inline void merge(ll u,ll v) { ll t1=getf(u); ll t2=getf(v); if(t1!=t2) f[t1]=t2; } int main() { scanf("%d",&n); ll tmp; f.clear(); for(int i=1;i<=n;i++) scanf("%lld",&pp[i].num); for(int i=1;i<=n;i++) scanf("%lld",&pp[i].v); sort(pp+1,pp+1+n); ll ans=0; for(int i=1;i<=n;i++) { tmp=getf(pp[i].num); ans+=pp[i].v*(tmp-pp[i].num); merge(tmp,tmp+1); } cout<<ans<<endl; return 0; }
努力加油a啊,(o)/~
- 版权声明:文章来源于网络采集,版权归原创者所有,均已注明来源,如未注明可能来源未知,如有侵权请联系管理员删除。