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)/~

  • 版权声明:文章来源于网络采集,版权归原创者所有,均已注明来源,如未注明可能来源未知,如有侵权请联系管理员删除。

发表回复

后才能评论