D. Recommendations
简单的想法就是,如果有多个标号相同的,保留权值最高的那个,其余的加一处理,实现的时候出了一些问题,最开始用优先队列把全部数据放进去处理,T了,想想发现复杂度变O(N^2)了,后来看了一下大神的博客,其实只需要按照递增的顺序把标号相同的权值放入优先队列处理就好了,每次pop()出头元素,答案增加队列元素之和。
#include<bits/stdc++.h>
#define ll long long
#define lnode node*2,start,mid
#define rnode node*2+1,mid+1,end
#define rep(i,a,b) for(ll i=a;i<=(b);i+=1)
#define input freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
#define To_string(num,str) {stringstream ss;ss<<num;ss>>str;}
#define To_num(str,num) {stringstream ss;ss<<str;ss>>num;}
const double pi=acos(-1.0);
const int maxn=(5e2+10);
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
using namespace std;
struct node
{
int id;
int value;
}a[200010];
bool cmp(node a,node b)
{
if(a.id==b.id)
return a.value>b.value;
return a.id<b.id;
}
priority_queue<int> q;
int main()
{ cin.tie(0);
ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
a[i].id=x;
}
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
a[i].value=x;
}
sort(a+1,a+1+n,cmp);
int nowid=0,xb=0;
ll ans=0,s=0;
while(!q.empty()||xb<n)
{
nowid+=1;
if(q.empty())
{
nowid=a[xb+1].id;
//cout<<nowid<<endl;
while(nowid==a[xb+1].id&&xb<n)
{
xb+=1;
s+=a[xb].value;
q.push(a[xb].value);
}
}
else
{
//cout<<nowid<<endl;
while(nowid==a[xb+1].id&&xb<n)
{
xb+=1;
s+=a[xb].value;
q.push(a[xb].value);
}
}
s-=q.top();
q.pop();
ans+=s;
}
cout<<ans;
return 0;
}
848

被折叠的 条评论
为什么被折叠?



