ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF457B. Distributed Join

2019-09-26 19:02:47  阅读:224  来源: 互联网

标签:CF457B Join int res LL Distributed pos 数组 define


题目链接
大意:有两个数组a,b,你可以把任何一个数组的任何一个位置的元素复制到任何一个数组的任何一个位置,你需要使得两个数组中的任意两个位置(分别来自两个数组)都存在于一个相同的位置,复制的代价是元素值,问最小代价?
思路:显然我们有两种策略:
1.把一些位置都复制到一个位置上,那么这些位置就都满足
2.对于一个数组的一个位置来说,每次选择把自己复制到另一个数组的某个位置,或者把另一个数组的某个位置复制到当前位置上(根据大小来定)。
先对两个数组按元素值从小到大排序。
那么我们枚举这两种操作的分界点来统计最小答案即可。
细节见代码:

#include<bits/stdc++.h>

#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define LL long long
#define SZ(X) X.size()
#define pii pair<int,int>
#define ALL(X) X.begin(),X.end()

using namespace std;

LL gcd(LL a, LL b) {return b ? gcd(b, a % b) : a;}
LL lcm(LL a, LL b) {return a / gcd(a, b) * b;}
LL powmod(LL a, LL b, LL MOD) {LL ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
const int N = 1e5 + 11;
int n,m;
LL a[N],b[N];
LL A[N],B[N];
int main() {
	ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=m;i++)cin>>b[i];
    sort(a+1,a+1+n);
    sort(b+1,b+1+m);
    for(int i=1;i<=n;i++)A[i]=A[i-1]+a[i];
    for(int i=1;i<=m;i++)B[i]=B[i-1]+b[i];
    LL ans=LLONG_MAX,pre=0;
    for(int i=n;i>=1;i--){
        int pos=upper_bound(b+1,b+1+m,a[i])-b;
        LL res=B[pos-1];
        res+=1ll*(m-pos+1)*a[i];
        pre+=res;
        if(ans<=pre+(i>1?(B[m]+A[i-1]-max(a[i-1],1ll*b[m])):0))break;
        ans=pre+(i>1?(B[m]+A[i-1]-max(a[i-1],1ll*b[m])):0);
    }
    pre=0;
    for(int i=m;i>=1;i--){
        int pos=upper_bound(a+1,a+1+n,b[i])-a;
        LL res=A[pos-1];
        res+=1ll*(n-pos+1)*b[i];
        pre+=res;
        if(ans<=pre+(i>1?(A[n]+B[i-1]-max(b[i-1],1ll*a[n])):0))break;
        ans=pre+(i>1?(A[n]+B[i-1]-max(b[i-1],1ll*a[n])):0);
    }
    cout<<min({ans,A[n]+B[m-1],A[n-1]+B[m]})<<endl;
	return 0;
}

标签:CF457B,Join,int,res,LL,Distributed,pos,数组,define
来源: https://blog.csdn.net/qq_40655981/article/details/101462332

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有