1. 程式人生 > >Codeforces Round 542 (Div. 2)

Codeforces Round 542 (Div. 2)

layout while tar clu tdi 。。 相差 ORC int


layout: post
title: Codeforces Round 542 (Div. 2)
author: "luowentaoaa"
catalog: true
tags:
mathjax: true
- codeforces
- 並查集
---

傳送門

前三題太簡單不寫

D.Toy Train (貪心)

題意

有n個車站,按照環前進,有m條要求從x送到y,每次從x最多能拿一個糖,輸出在第i個車站出發最少需要多少時間完成所有要求 (註意車的容量無窮)

思路

所以我們直接枚舉每個點就行了啊。。。找到一個花費最多的點 把他送完答案就出來了 當然在送他的時候順便把其它的都送了所以貪心的策略就是最後送少的。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=5e4+50;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
ll num[maxn],len[maxn];
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    ll n,m;
    cin>>n>>m;
    fill(len,len+maxn,inf);
    while(m--){
        ll a,b;
        cin>>a>>b;
        num[a]++;
        if(a<b)len[a]=min(len[a],b-a);
        else len[a]=min(len[a],n-a+b);
    }
    for(int i=1;i<=n;i++){
        if(num[i]==0)len[i]=0;
    }
    for(int i=1;i<=n;i++){
        ll ans=0;
        for(int j=1;j<=n;j++){
            ll dis=(j>=i)?j-i:n-i+j;
            dis+=(num[j]-1ll)*n+len[j];
            ans=max(ans,dis);
        }
        cout<<ans<<" ";
    }
    return 0;
}

E.Wrong Answer

題意

構造題,這裏有一段代碼:它只會記錄和為非負數的一段數乘以其區間長度的最大值,但我們現在要求的是sum{ai}*(r-l+1),l<=i<=r,很明顯這段代碼是有錯誤的。

然後會輸入一個k,你構造一組數據,使得正解和這段代碼給出的答案相差k。最後輸出你給出的數據。

思路

假設前面1998個a[i]的值為0,倒二的值為-p,最後一個的值為d+p;然後正解的答案是2000*d
題目的答案的d+p 相差為2000d-(d+p)=K;
1999d=k+p;
d=(k+p)/1999
令d=1999-k%19;

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+50;

int main()
{
    int k;
    cin>>k;
    int p=1999-k%1999;;
    cout<<2000<<endl;
    for(int i=1;i<=1998;i++)cout<<0<<" ";
    cout<<-p<<" "<<((k+p)/1999+p)<<endl;
    return 0;
}

Codeforces Round 542 (Div. 2)