CodeForces - 1253D(并查集)

微笑、不失礼 提交于 2019-12-06 06:56:11

题意

https://vjudge.net/problem/CodeForces-1253D

一个无向图,对于任意l,r,如果l到r有路径,那么l到m也有路径(l<m<r),问最少加多少条边,使得上述条件成立。

思路

先用并查集缩成若干个连通块,顺带把每个连通块的最大值求出来,然后我们从1到n开始遍历每个点,记录当前点所在连通块的最大值,然后如果i小于最大值而且和i-1不在一个连通块内,就合并这两个连通块。计算需要合并的次数即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
ll a[N],ans[N];
int main()
{
    std::ios::sync_with_stdio(false);
    ll n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++)
    {
        a[i]+=a[i-1];
    }
    for(int i=1;i<=m;i++)
        ans[i]=a[i];
    for(int i=m+1;i<=n;i++)
    {
        ans[i]=ans[i-m]+a[i];
    }
    for(int i=1;i<=n;i++)
    {
        cout<<ans[i]<<" ";
    }
    cout<<endl;
    return 0;
}

  

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!