牛客周赛 Round 84【题解完成】

132 阅读3分钟
题目难度知识点
A 小红的陡峭值(一)签到
B 小红的陡峭值(二)签到
C 小红的陡峭值(三)(easy)签到
D 小红的陡峭值(三)(hard)思维
E 小红的陡峭值(四)
F 小红的陡峭值(五)(easy)★★思维/贡献
G 小红的陡峭值(五)(hard)★★思维/贡献

image.png

image.png dirt率太高了,而且最后一题的优化依靠了chat,怎么人均会数数,感觉后面的题写的巨烂。

小红的陡峭值(一)

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
int a[N],n,t;
int main(void)
{
    cin>>a[0]>>a[1]>>a[2];
    if(abs(a[1]-a[0])+abs(a[2]-a[1])==0) puts("Yes");
    else puts("No");
    return 0;
}

小红的陡峭值(二)

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],n;
int main(void)
{
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
    int ans=0;
    for(int i=1;i<n;i++) ans+=(a[i]-a[i-1]);
    if(a[0]==a[n-1]) cout<<1<<" "<<0;
    else cout<<2<<" "<<ans;
    return 0;
}

小红的陡峭值(三)(easy)

#include<bits/stdc++.h>
using namespace std;
int n,k,sum;
string s;
int main(void)
{
    cin>>n>>k>>s;
    for(int i=0;i<n;i++)
    {
        int l=i,r=i+k-1;
        if(r>=n) break;
        for(int j=l+1;j<=r;j++) sum+=abs(s[j]-s[j-1]);
    }
    cout<<sum;
    return 0;
}

小红的陡峭值(三)(hard)

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long int LL;
int a[N],n,k;
string s;
int main(void)
{
    cin>>n>>k>>s;
    for(int i=0;i<s.size();i++) a[i]=s[i]-'a';
    LL ans=0,sum=0;
    for(int i=1;i<k;i++) sum+=abs(a[i]-a[i-1]);
    ans+=sum;
    for(int i=k,j=0;i<n;i++,j++)
    {
        sum-=abs(a[j+1]-a[j]);
        sum+=abs(a[i]-a[i-1]);
        ans+=sum;
    }
    cout<<ans;
    return 0;
}

小红的陡峭值(四)

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
typedef long long int LL;
LL n,sum,dp[N],ans=1e12;
vector<int>ve[N];
void dfs(int u,int fa)
{
    dp[u]=0;
    for(int i=0;i<ve[u].size();i++)
    {
        int j=ve[u][i];
        if(j==fa) continue;
        dfs(j,u);
        dp[u]+=dp[j]+abs(u-j);
    }
    for(int i=0;i<ve[u].size();i++)
    {
        int j=ve[u][i];
        if(j==fa) continue;
        ans=min(ans,abs( (sum-dp[j]-abs(j-u)) -dp[j] ));
    }
}
int main(void)
{
    cin>>n;
    for(int i=1;i<=n-1;i++)
    {
        int a,b; cin>>a>>b;
        ve[a].push_back(b);
        ve[b].push_back(a);
        sum+=abs(a-b);
    }
    dfs(1,-1);
    cout<<ans;
    return 0;
}

小红的陡峭值(五)(easy)

image.png 计算每一对的贡献,把一对当成一个数,那么排列是(n-1)! 然后对于一对的排列组合进行计算。

for(int i=0;i<n;i++)
    for(int j=0;j<n;j++) sum+=abs(a[j]-a[i]);
优化为:
    LL sum=0;
    for(int i=1;i<=n;i++)
    {
        LL temp=(a[i]*(i-1)-s[i-1]+mod)%mod;
        sum=(sum+temp)%mod;
    }
    sum=(sum*2)%mod;
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
const int mod=1e9+7;
typedef long long int LL;
LL s[N],a[N],n;
LL qsm(LL a,LL b,LL p)
{
    LL sum=1;
    while(b)
    {
        if(b&1) sum=sum*a%p;
        a=a*a%p;
        b>>=1;
    }
    return sum%p;
}
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++) s[i]=(s[i-1]+a[i])%mod;
    LL sum=0;
    for(int i=1;i<=n;i++)
    {
        LL temp=(a[i]*(i-1)-s[i-1]+mod)%mod;
        sum=(sum+temp)%mod;
    }
    sum=(sum*2)%mod;
    cout<<sum*qsm(n,mod-2,mod)%mod;
}

小红的陡峭值(五)(hard)

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
const int mod=1e9+7;
typedef long long int LL;
LL s[N],a[N],n;
LL qsm(LL a,LL b,LL p)
{
    LL sum=1;
    while(b)
    {
        if(b&1) sum=sum*a%p;
        a=a*a%p;
        b>>=1;
    }
    return sum%p;
}
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++) s[i]=(s[i-1]+a[i])%mod;
    LL sum=0;
    for(int i=1;i<=n;i++)
    {
        LL temp=(a[i]*(i-1)-s[i-1]+mod)%mod;
        sum=(sum+temp)%mod;
    }
    sum=(sum*2)%mod;
    cout<<sum*qsm(n,mod-2,mod)%mod;
}