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 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)