当前位置: 首页 > news >正文

[CF494C]Helping People

题意:有$n$个穷人,每个穷人有$a_i$的钱,有一个富人决定做$q$次捐赠$(l_i,r_i,p_i)$,表示他有$p_i$的概率给$[l_i,r_i]$的人捐$1$的钱,捐赠的价值为捐赠后最富的人拥有的钱数,问捐赠的价值的期望,保证给出的$[l_i,r_i]$要么相离要么一个包含另一个

捐赠区间是树的结构,先把树建出来,把区间按$l$从小到大排序,若$l$相同则按$r$从大到小,那么一个区间的父亲就是它前面离它最近的包含它的区间,为了方便我们加一个$(1,n,0)$,它可以作为树根而不影响答案

考虑树D,令$mx_i$表示区间$i$中$a$的最大值,$f_{i,j}$表示捐完子树$i$后区间$i$的最大值$\leq mx_i+j$的概率,若$1$为根,那么答案为$f_{1,0}\cdot mx_1+\sum\limits_{i=1}^q(f_{1,i}-f_{1,i-1})(mx_1+i)$

我们有转移$f_{i,j}=p_i\prod\limits_{u\in son(i)}f_{u,mx_i-mx_u+j-1}+(1-p_i)\prod\limits_{u\in son(i)}f_{u,mx_i-mx_u+j}$,捐/不捐有$1$的区别

然后就做完了...目测这场有点毒...?

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef double du;
struct don{
	int l,r,mx;
	du p;
	don(int a=0,int b=0,du c=0){l=a;r=b;p=c;}
}d[5010];
bool operator<(don a,don b){return(a.l==b.l)?(a.r>b.r):(a.l<b.l);}
int t[100010][17],lg[100010];
int query(int l,int r){
	int k=lg[r-l+1];
	return max(t[l][k],t[r-(1<<k)+1][k]);
}
int h[5010],nex[5010],to[5010],M;
du f[5010][5010];
void add(int a,int b){
	M++;
	to[M]=b;
	nex[M]=h[a];
	h[a]=M;
}
int m;
void dfs(int x){
	int i,j;
	du t1,t2;
	for(i=h[x];i;i=nex[i])dfs(to[i]);
	t2=1;
	for(i=h[x];i;i=nex[i])t2*=f[to[i]][d[x].mx-d[to[i]].mx];
	f[x][0]=(1-d[x].p)*t2;
	for(j=1;j<=m;j++){
		t1=t2=1;
		for(i=h[x];i;i=nex[i]){
			t1*=f[to[i]][min(d[x].mx+j-d[to[i]].mx-1,m)];
			t2*=f[to[i]][min(d[x].mx+j-d[to[i]].mx,m)];
		}
		f[x][j]=d[x].p*t1+(1-d[x].p)*t2;
	}
}
int main(){
	int n,i,j;
	du ans;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)scanf("%d",t[i]);
	for(i=2;i<=n;i++)lg[i]=lg[i>>1]+1;
	for(j=1;j<17;j++){
		for(i=1;i+(1<<j)-1<=n;i++)t[i][j]=max(t[i][j-1],t[i+(1<<(j-1))][j-1]);
	}
	for(i=1;i<=m;i++){
		scanf("%d%d%lf",&d[i].l,&d[i].r,&d[i].p);
		d[i].mx=query(d[i].l,d[i].r);
	}
	m++;
	d[m]=don(1,n,0);
	d[m].mx=query(1,n);
	sort(d+1,d+m+1);
	for(i=2;i<=m;i++){
		for(j=i-1;j>0;j--){
			if(d[j].l<=d[i].l&&d[i].r<=d[j].r)break;
		}
		add(j,i);
	}
	dfs(1);
	ans=f[1][0]*d[1].mx;
	for(i=1;i<=m;i++)ans+=(f[1][i]-f[1][i-1])*(d[1].mx+i);
	printf("%.8lf",ans);
}

转载于:https://www.cnblogs.com/jefflyy/p/9152997.html

相关文章:

  • oracle自带函数
  • 菜鸟要投120亿港币,在香港建超级eHub
  • 装修设计解剖书
  • BZOJ2434[Noi2011]阿狸的打字机——AC自动机+dfs序+树状数组
  • JQuery实现聊天对话框
  • 神级python程序员只需要一个公众号,再也不会错过重要资讯
  • E盘可用空间0字节,要怎样找到文件
  • jenkins详解(一)
  • C# API中的模型和它们的接口设计
  • [日常] 算法-单链表的创建-尾插法
  • 苹果发布Core ML 2
  • es6 入坑笔记(三)---数组,对象扩展
  • 从MySQL临时表谈到filesort
  • 在JPEG图片中嵌入HTML
  • Spring Bean生命周期详解
  • Consul Config 使用Git做版本控制的实现
  • es6--symbol
  • IP路由与转发
  • React as a UI Runtime(五、列表)
  • springMvc学习笔记(2)
  • Vue2.0 实现互斥
  • Yii源码解读-服务定位器(Service Locator)
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 基于webpack 的 vue 多页架构
  • 记一次删除Git记录中的大文件的过程
  • 聚类分析——Kmeans
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 前端_面试
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 学习HTTP相关知识笔记
  • linux 淘宝开源监控工具tsar
  • 大数据全解:定义、价值及挑战
  • #android不同版本废弃api,新api。
  • #includecmath
  • (C语言)共用体union的用法举例
  • (差分)胡桃爱原石
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (五)Python 垃圾回收机制
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .a文件和.so文件
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net 提取注释生成API文档 帮助文档
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .NET与 java通用的3DES加密解密方法
  • @Autowired 与@Resource的区别
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @JSONField或@JsonProperty注解使用
  • @Transactional类内部访问失效原因详解
  • []使用 Tortoise SVN 创建 Externals 外部引用目录