中位数的和

(number.pas/c/cpp)

【题目描述】

flower 有 N-1 个朋友,他们要一起玩一个游戏:首先确定三个非负整数 a,b,c,然后每个人依次在纸上写一个数,设第 i 个人写下的数字为 f[i],flower 先写下数字 f[1]=1,对于第 i 个写数字的人(i>1)有: f[i]=(a*m[i-1]+b*i+c)mod1,000,000,007;其中 m[i-1]为前 i-1 个写下的数字的中位数,如果 i-1 为偶数,那么取靠前的那个数。flower 想要知道,所有人写下的数字的和。

【输入格式】

输入仅一行,包含四个非负整数 a,b,c,N;意义如上;

【输出格式】

输出只有一行一个整数,表示数字和。

【输入样例】

3 1 2 6

【输出样例】

103

【数据规模】

对于 30%的数据: N≤1,000;

对于 100%的数据: N≤200,000; a,b,c≤1,000,000,007。

第一次拿到这道题,给我的感觉是F[1~i-1]一定比F[i]小,所以中位数一定是F[i>>1](CJJDs也是这样想的),但马上被我否认了,因为我注意到有一个mod,所以值可能会变小。于是立马换一种思路,既然叫我们求中位数,即中间的数,那么我们将已存的有序数列掰成两半,中间的即为中位数。那么这里就需要用到一个大根堆,用于存储前半段数,一个小根堆,用于存储后半段数。每次将生成的数放入小根堆,如果当前是第i次操作且i为奇数,那么将小根堆顶放入大根堆。注意mod后如果小于大根堆顶就交换。

code

#include <cstdio>
#include <cctype>
#include <queue>
#define mod 1000000007
#define C c = tc ( )
using namespace std; inline char tc(){
static char fl[],*A,*B;
return A==B&&(B=(A=fl)+fread(fl,,,stdin),A==B)?EOF:*A++;
} inline void read(long long &x){
static char c;
while(!isdigit(C));x=c-'';
while(isdigit(C))x=x*+c-'';
} long long a,b,c,n;
long long f[];
priority_queue<long long>w1;
priority_queue<long long,vector<long long>,greater<long long> >w2; int main(){ freopen("number.in","r",stdin);
freopen("number.out","w",stdout); read(a),read(b),read(c),read(n);
w1.push(f[]=);
for(int i=;i<=n;i++){
long long val=w1.top(),ve;
f[i]=(val*a+b*i+c)%mod;ve=f[i];
if(ve<val)w1.pop(),w1.push(ve),ve=val;
w2.push(ve);
if(i&)val=w2.top(),w2.pop(),w1.push(val);
}
long long ans=;
for(int i=;i<=n;i++)ans+=f[i];
printf("%lld",ans); fclose(stdin),fclose(stdout);
return ;
}

最后引用CJJ的话。

如果是Pascal的话我也可以,用Pascal打堆!

中位数的和_KEY的更多相关文章

  1. BZOJ1303_中位数图_KEY

    题目传送门 较水,开两个桶即可. 题目可以理解为,将大于B的数看为1,小于B的数看为-1,将以B这个数为中位数的序列左右分为两半,加起来为0. code: #include <cstdio> ...

  2. [LeetCode] Find Median from Data Stream 找出数据流的中位数

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  3. [LeetCode] Median of Two Sorted Arrays 两个有序数组的中位数

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  4. BZOJ1303 [CQOI2009]中位数图

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  5. 在MySQL中,如何计算一组数据的中位数?

    要得到一组数据的中位数(例如某个地区或某家公司的收入中位数),我们首先要将这一任务细分为3个小任务: 将数据排序,并给每一行数据给出其在所有数据中的排名. 找出中位数的排名数字. 找出中间排名对应的值 ...

  6. AC日记——中位数 洛谷 P1168

    题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[2], …, A[2k - 1]的中位数.[color=red]即[/color] ...

  7. [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)

    题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ...

  8. LeetCode 4 Median of Two Sorted Arrays 查找中位数,排除法,问题拓展 难度:1

    思路:设现在可用区间在nums1是[s1,t1),nums2:[s2,t2) 1.当一个数组可用区间为0的时候,由于另一个数组是已经排过序的,所以直接可得 当要取的是最小值或最大值时,也直接可得 2. ...

  9. BZOJ 1303 CQOI2009 中位数图 水题

    1303: [CQOI2009]中位数图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2340  Solved: 1464[Submit][Statu ...

随机推荐

  1. [2012-06-29]sed根据行号范围执行替换

    测试数据: personball@vostro:SHELL$cat aaa <instrumentation android:name="aaa" android:name= ...

  2. linux(十四)之linux NFS服务管理

    学到这里差不多就结束了linux的基础学习了,其实linux的内容并不难,我们要经常的反复的去操作它,多多和它去联络感情才能很好的掌握这个linux. 加油!今天是星期二.没有什么比努力让人更加热血沸 ...

  3. 文档API生成神器SandCastle使用心得

    一.功能描述 关于Sandcastle网上的参考资料相对较少,Google出来很多资料都是全英文的,相对于我这种英语渣渣看起来还是很费劲的. 言简意赅,Sandcastle主要功能是能够将C#类生成类 ...

  4. sql in 和 exist的区别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp41 select * from A where id in(select ...

  5. ROS学习记录(三)————创建一个简单的发布节点和订阅节点

    暑假在家有些懈怠,不,非常懈怠- -||!良心已经发痛了,想快些补回原来的进度,但忽然发现,中断了一段时间再重新去学习,有的地方连最基本的符号都忘记了 ,这次特意弄个最最基础的,恢复一下,以前的进度. ...

  6. 使用XmlWriter创建XML文件

    using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Xml ...

  7. Eslint配置

    //ESLint 4.5.0,参考了eslint官方以及alloyteam团队配置 module.exports = { parser: 'babel-eslint', parserOptions: ...

  8. 配置VNC SERVER 远程访问

    1.安装软件包 # yum install tigervnc-server -y 2. 配置VNC用户 # vim /etc/sysconfig/vncservers VNCSERVERS=" ...

  9. centos6.6配置rsync+sersync实现实时同步分布式多客户端分发同步

    1.sersync项目: sersync项目利用inotify与rsync技术实现对服务器数据实时同步到解决方案,其中inotify用于监控sersync所在服务器上文件系统的事件变化,rsync是目 ...

  10. 《Java程序设计》第5周学习总结

    1. 本章学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 2. 书面作业 1. 代码阅读:Child压缩包内源代码 1.1 com.par ...