Codeforces Round #623 (Div. 1, based on VK Cup 2019-2020 - Elimination Round, Engine)A(模拟,并查集)

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 pair<int,int>a[200007];
 5 bool cmp(pair<int,int>a,pair<int,int>b){
 6     if(a.second!=b.second)
 7         return a.second>b.second;//按照时间从大到小排序
 8     return a.first<b.first;
 9 }
10 map<int,int>fa;
11 int find_(int x){
12     if(!fa[x])
13         return x;
14     return fa[x]=find_(fa[x]);
15 }
16 int main(){
17     ios::sync_with_stdio(false);
18     cin.tie(NULL);
19     cout.tie(NULL);
20     int n;
21     cin>>n;
22     for(int i=1;i<=n;++i)
23         cin>>a[i].first;
24     for(int i=1;i<=n;++i)
25         cin>>a[i].second;
26     sort(a+1,a+1+n,cmp);
27     long long ans=0;
28     for(int i=1;i<=n;++i){//按照个数从小到大排序,可能会让个数小而时间多的不停++,而原本个数多时间少的却加的不多,导致答案不对,先搞时间多的代价大的才是正解
29         int x=find_(a[i].first);
30         if(a[i].first==x){//当前个数唯一
31             int y=find_(a[i].first+1);//把它合并到+1的位置
32             fa[x]=y;
33         }
34         else{//当前已有,放到最近一个比它大且没别选中的位置
35             ans+=1ll*(x-a[i].first)*a[i].second;//更新贡献
36             int y=find_(x+1);//合并到+1的位置(原本的位置更新后被占了)
37             fa[x]=y;
38         }
39     }
40     cout<<ans;
41     return 0;
42 }

 

posted @ 2020-02-26 09:46  sewage  阅读(272)  评论(0编辑  收藏  举报