算法总结--数学{ ∑ 公式}
feizhu_QWQ · · 个人记录
(。・∀・)ノ゙嗨飞竹小课堂第
咳咳,今天我们又讲数学~
(全是偏蓝的题目
排名
这这这,太难了吧!
这道题题意有点复杂,飞竹慢慢解释
每个
这道题让我们满足每一个
我们就需要从后面的数中选择较大的几个数变为
那么代价就是:
如果为了计算后面的数达到
-
i==k
这要想吗?什么都不会发生,因为
-
i > k 我们就需要把比
a_i 小的数拉到a_i 代价就是a_k -a_i 了~ 最终代码如下:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int c,n,k,sum[1000005],ans[1000005];
struct node
{
int x,id;
}s[1000005];
bool cmp(node q,node h)
{
return q.x>h.x;
}
signed main()
{
cin>>c>>n>>k;
for(int i=1;i<=n;i++) cin>>s[i].x,s[i].id=i;
sort(s+1,s+1+n,cmp);
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+s[i].x;
}
for(int i=1;i<k;i++)
{
ans[s[i].id]=(k-i)*s[i].x-(sum[k]-sum[i+1-1]);
}
for(int i=k;i<=n;i++)
{
ans[s[i].id]=s[k].x-s[i].x;
}
for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
return 0;
}
这道题很恨很难
这道题有两大大大大大大大难点:
- 公式
- 模
mod
这道题的贪心思想就是把复数放在第一段或最后一段,把整数全部放在最后一段,中间全是空段,就可以使答案最大
可这道题的时间复杂度够不了一点,难受~
那么我们就把这个过程推公式,开始!
假设
\=
\=
\=
\=
接下来进行前缀和优化:
终终终终于写完了,(
对了,因为
接着,我们将
这道题的加减乘都要
加法:
减法:
乘法:
我们把他们放进函数里就可以啦!
终于讲完这道题了,什么?绿题?
家人们,轰炸讨论区,必须升蓝!!!
ヾ( ̄▽ ̄)Bye~Bye~