C. Sweets Eating(递推,贪心,思维)


题意:给出n个糖果,每天最多可以吃m颗,分别求出吃1-n颗糖果获得的最小甜度值。甜度值等于第i颗的a[i]*第几天吃它。

根据贪心思想,每颗糖果的甜度越小应该越晚吃,需要吃i颗糖果时,将所有糖果甜度值排序取最小的前i个,甜度越大吃的越早。
因为每天可以吃m颗糖果,所有吃i颗时的甜度值等于i-1颗时加上排序后取余m等于i%m的糖果。
这里画一下就很清楚了/、
(还有,关流可真香啊快读得不到我宠幸了vector也好好用)

int main()
{
    fast;
    int n,m;
    cin>>n>>m;
    vi v(n);cin>>v;
    sort(all(v));
    vector<ll >sum(m+1,0),ans(n,0);
    rep(i,n)
    {
        sum[i%m]+=v[i];
        if(i==0) ans[i]=sum[i%m]; 
        else ans[i]=ans[i-1]+sum[i%m];
    }
    cout<<ans;
    //stop;
    return 0;
}

D. Harmonious Graph(好久没写过的并茶几)

题意:
无向图,要求使图中,如果x点可以到达y,那么x可以到达所有 x ~ y 中任意一点,问加多少边能使原图符合要求。

并茶几,思路比C题好想(我认为),好久没写过并茶几再写居然一发就A了,还是挺好写的。
为了减少博客长度省掉开头宏定义惹(●ˇ∀ˇ●))
int n,m,fa[MAXN];
int find (int x){return x==fa[x]? x : fa[x]=find(fa[x]);}
int main()
{
    fast;
    cin>>n>>m;
    for(int i=0;i<=n;++i) fa[i]=i;
    rep(i,m)
    {
        int x,y;cin>>x>>y;
        if(x>y) swap(x,y);
        fa[find(y)] =find(x);
    }
    int pre=find(n),sum=0;
    for(int i=n;i>=1;--i)
    {
        if(find(i)>pre) ++sum,fa[find(i)]=pre;
        pre=min(pre,find(i));
    }
    cout<<sum<<'\n';
    return 0;
}