不正常序列
思路:
直接维护两个堆,一个是所有大于中位数的数的集合,一个是小于中位数的数的集合。
#include <stdio.h>
#include <queue>
#include <iostream>
#include <algorithm>
#define LL long long
using namespace std;
const int mod = 1e9 + 7;
priority_queue <LL> q1;
priority_queue < LL , vector<LL> , greater<LL> > q2;
LL a,b,c,n;
LL f[2000010];
void insert(LL x){
if(x<=q1.top()) q1.push(x);
else q2.push(x);
if(q1.size()>q2.size()){
if(q1.size()-q2.size()>1){
LL tmp=q1.top();
q1.pop(),q2.push(tmp);
}
}
else if(q1.size()<q2.size()){
LL tmp=q2.top();
q2.pop(),q1.push(tmp);
}
}
int main(){
freopen("unnormal.in","r",stdin);
freopen("unnormal.out","w",stdout);
cin >> a >> b >> c >> n;
f[1] = 1, q1.push(1);
for(int i=2; i<=n; i++){
int mi = q1.top();
f[i] = (a*mi + b*i + c) % mod;
insert(f[i]);
}
LL ans = 0;
for(int i=1; i<=n; i++)
ans += f[i];
cout << ans << endl ;
return 0;
}