【HDOJ 5419】 Victor and Toys

n个玩具 m个区间

每一个玩具有一个beauty值 问任选三个区间 三区间的MINleft~MAXright的和的期望值

预处理一个数组 存放每一个位置被几个区间囊括 这样该位置被选择的概率为c(x,3)/c(m,3)

若beauty数组为w 预处理数组a

期望值即为 w[i]*c(a[i],3)/c(m,3) i∈[1,n]

注意防止乘法爆long long

代码例如以下:

#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long using namespace std; int w[50001];
int ad[50002]; ll C(ll n)//c(n,3)
{
if(n < 3) return 0;
ll ans = 1;
for(int i = 2; i >= 0; --i)//防爆long long
ans = ans*(n-i)/(3-i); return ans;
} ll gcd(ll a,ll b)//约分
{
ll tmp;
while(b)
{
tmp = b;
b = a%b;
a = tmp;
}
return a;
} int main()
{
int t,n,m,i,l,r;
ll fz,fm,gd,lst; scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
for(i = 1; i <= n; ++i)
scanf("%d",&w[i]);
memset(ad,0,sizeof(ad));
for(i = 0; i < m; ++i)
{
scanf("%d %d",&l,&r);
ad[l]++;
ad[r+1]--;
}
if(m < 3)//不这样做会越界。 。血的教训
{
puts("0");
continue;
} fm = C(m); fz = lst = 0;
for(i = 1; i <= n; ++i)//预处理被选次数顺带把期望求了。。
{
lst += ad[i];
fz += w[i]*C(lst);
} gd = gcd(fz,fm);
fz /= gd;
fm /= gd;
if(fm == 1) printf("%I64d\n",fz);
else printf("%I64d/%I64d\n",fz,fm);
} return 0;
}

最新文章

  1. Linux学习之让进程在后台可靠运行的方法详解
  2. Chrome开发者工具详解
  3. [转]MongoDB学习 C#驱动操作MongoDB
  4. mq_send
  5. CSS入门学习(转)
  6. 【Eclipse】代码格式化 快捷键无效
  7. QQ群友在线/离线,如何测试?
  8. Android ui 透明度设置
  9. IP欺骗
  10. python-支付宝支付示例
  11. Django_创建项目
  12. Linux学习笔记:【004】Linux内核代码风格
  13. python3+selenium入门07-元素等待
  14. HttpWebRequest 高效并发问题
  15. mysql 查看正在执行的语句
  16. 雷林鹏分享:jQuery EasyUI 窗口 - 自定义窗口工具栏
  17. Markdown中怎么上传图片
  18. R绘图 第八篇:绘制饼图(ggplot2)
  19. Celery最佳实践(转)
  20. MySQL高级函数case的使用技巧----与sum结合实现分段统计

热门文章

  1. Linq学习(零)-错误汇总
  2. 记Spring下autowire为name时的一个现象
  3. linux设置库文件加载包含路径
  4. Singleton.java.ft not found 相关错误的解决办法
  5. Recyclerview点击事件,更新item的UI+更新Recyclerview外的控件
  6. [Windows Server 2012] Tomcat安全加固方法
  7. 【译】x86程序员手册08 -2.6中断和异常
  8. url取值乱码问题,url加中文导致页面不能加载问题 js unicode转码,以及解码
  9. $.extend 合并对象(处理可传入0个或多个参数)
  10. CAD得到自定义实体拖放夹点(com接口VB语言)