| 题目 | 难度 | 知识点 |
|---|---|---|
| A 小红的陡峭值(一) | ★ | 签到 |
| B 小红的陡峭值(二) | ★ | 签到 |
| C 小红的陡峭值(三)(easy) | ★ | 签到 |
| D 小红的陡峭值(三)(hard) | ★ | 思维 |
| E 小红的陡峭值(四) | ★ | 树 |
| F 小红的陡峭值(五)(easy) | ★★ | 思维/贡献 |
| G 小红的陡峭值(五)(hard) | ★★ | 思维/贡献 |
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;
}
小红的陡峭值(四)
#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)
计算每一对的贡献,把一对当成一个数,那么排列是(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)
#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;
}