经典套路。

题意

你将随机生成一个长度为 \(k\) 的数组 \(a\),其中 \(a_i\) 有 \(p_i\) 概率为 \(1\),否则为 \(-1\)。定义其前缀和数组 \(s_i = \sum\limits_{j = 1}^{i}a_j, i \in [0, k]\)。如果前缀和数组的最大值为 \(t(t \in [0, k])\) 那么你将获得 \(h_t\) 的权值。给定数组 \(p_{1 \dots n}, h_{1 \dots n}\),对于所有 \(k = 1 \dots n\),请输出你获得权值的数学期望。对 \(10^9+7\) 取模。

数据范围:\(1 \le n \le 5000, 0\le h_i \le 10^9\)。

做法

考虑直接 DP,那么你必须记录当前值和先前的最大值两个信息,状态是 \(\Theta(n^3)\) 的,埋了。接下来考虑容斥,考虑了一年,没做出来。怎么办呢?

首先将问题抽象为一个二维平面上随机生成一串线段,要么向上斜要么向下斜,然后头尾接起来形成的形状的最高点是要考虑的东西。你可以联想到那种一排矩形的问题可以竖过来一层一层 DP。这里同理。不要考虑当前这一步在先前积累下的影响下要怎么走,而是去考虑在开头添加一步对后面的影响。那么我只关心后面的最高高度,它会被平移一下;而当前位置的高度是确定的——\(0\)。这样就好办了,直接倒过来 DP 就行了。

但是很不幸你必须枚举 \(f_{k, 0} = 1\) 作为转移起点再 DP,这样还是三方。但是没关系,我们发现最终状态是确定且唯一的。所以直接把 DP 转移的方向也全部倒过来,把系数 \(h_i\) 填到 \(f_{0, i}\) 作为初始状态,然后对于每个 \(k\) 统计 \(f_{k, 0}\) 的值即可。

代码

// Author: kyEEcccccc

#include <bits/stdc++.h>

using namespace std;

using LL = long long;
using ULL = unsigned long long; #define F(i, l, r) for (int i = (l); i <= (r); ++i)
#define FF(i, r, l) for (int i = (r); i >= (l); --i)
#define MAX(a, b) ((a) = max(a, b))
#define MIN(a, b) ((a) = min(a, b))
#define SZ(a) ((int)((a).size()) - 1) constexpr int N = 5005, MOD = 1000000007; LL kpow(LL x, LL k = MOD - 2)
{
x = x % MOD;
LL r = 1;
while (k)
{
if (k & 1) r = r * x % MOD;
x = x * x % MOD;
k >>= 1;
}
return r;
} int n, po[N];
int f[2][N]; void work(void)
{
cin >> n;
F(i, 1, n)
{
int x, y; cin >> x >> y;
po[i] = x * kpow(y) % MOD;
}
F(i, 0, n) cin >> f[0][i]; int ci = 1, pi = 0;
F(i, 1, n)
{
F(j, 1, n - i)
{
f[ci][j] = ((LL)f[pi][j + 1] * po[i]
+ (LL)f[pi][j - 1] * (1 - po[i] + MOD)) % MOD;
}
f[ci][0] = ((LL)f[pi][1] * po[i]
+ (LL)f[pi][0] * (1 - po[i] + MOD)) % MOD;
cout << f[ci][0] << " \n"[i == n];
swap(ci, pi);
}
} signed main(void)
{
// freopen("test.in", "r", stdin);
// freopen("test.out", "w", stdout);
ios::sync_with_stdio(0), cin.tie(nullptr); int _; cin >> _;
while (_--) work(); return 0;
}

CF1810G The Maximum Prefix的更多相关文章

  1. uva 11488 Hyper Prefix Sets(狂水)

    题意: 获得集合中最长前缀长度*有该前缀个数的最大值 Prefix goodness of a set string is length of longest common prefix*number ...

  2. HDU 11488 Hyper Prefix Sets (字符串-Trie树)

    H Hyper Prefix Sets Prefix goodness of a set string is length of longest common prefix*number of str ...

  3. UVa11488-Hyper Prefix Sets(trie树)

    H Hyper Prefix Sets Prefix goodness of a set string is length of longest common prefix*number of str ...

  4. uva 11488 - Hyper Prefix Sets(字典树)

    H Hyper Prefix Sets Prefix goodness of a set string is length of longest common prefix*number of str ...

  5. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  6. maximum subarray problem

    In computer science, the maximum subarray problem is the task of finding the contiguous subarray wit ...

  7. Leetcode: Maximum XOR of Two Numbers in an Array

    Given a non-empty array of numbers, a0, a1, a2, - , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  8. Maximum Subarray Sum

    Maximum Subarray Sum 题意 给你一个大小为N的数组和另外一个整数M.你的目标是找到每个子数组的和对M取余数的最大值.子数组是指原数组的任意连续元素的子集. 分析 参考 求出前缀和, ...

  9. LightOJ DNA Prefix(字典树+dfs)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=121897#problem/F F - DNA Prefix Time Limit:200 ...

  10. [LeetCode] Prefix and Suffix Search 前后缀搜索

    Given many words, words[i] has weight i. Design a class WordFilter that supports one function, WordF ...

随机推荐

  1. 刷爆 LeetCode 周赛 339,贪心 / 排序 / 拓扑排序 / 平衡二叉树

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 上周末是 LeetCode 第 339 场周赛,你参加了吗?这场周赛覆盖的知识点比较少, ...

  2. 逍遥自在学C语言 | 位运算符&的高级用法

    前言 在上一篇文章中,我们介绍了&运算符的基础用法,本篇文章,我们将介绍& 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位 ...

  3. LeeCode 动态规划(四)

    LeeCode 动态规划(四) LeeCode 198:打家劫舍 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系 ...

  4. 密码学与网安——intro

    Terminology primitive: 原语 (一种不可分割的最基础操作,跟具体的视角和情形有关) 两个时间节点 1949年(1945年):Shannon 提出完全安全性,开始现代密码学 197 ...

  5. Object-Advanced笔记

    JavaScript对象进阶 数据劫持 1. 概念 一旦访问或者修改对象的属性时 拦截这个行为(访问/修改) 并对其添加除这个行为外的操作 最后返回结果 2. 实现 2.1 getter和setter ...

  6. 教练!我不想遍历了!——用bool运算有效减少dataframe的时间复杂度

    方法参考:python - 降低python for循环的时间复杂度 - 堆栈内存溢出 (stackoom.com) 朋友们,朋友们,事情是这样的. 这几天博主在处理数据的时候遇到了这样的标注数据: ...

  7. CVE-2015-5254漏洞复现

    1.漏洞介绍. Apache ActiveMQ 是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持 Java 消息服务,集群,Spring Framework 等.Apache ...

  8. [OpenCV-Python] 9 图像的基础操作

    文章目录 OpenCV-Python: 核心操作 9 图像的基础操作 9.1 获取并修改像素值 9.2 获取图像属性 9.3 图像 ROI 9.4 拆分及合并图像通道 9.5 为图像扩边(填充) Op ...

  9. java镜子之反射篇

    文章目录 注解 内置注解 元注解 反射 类的初始化 类加载器 双亲委派机制 反射方法的使用 调用类的方法.成员变量.构造器等 总结 注解和反射是Java中非常重要的知识,一些优秀开源的框架都是大量运用 ...

  10. dataX源码学习

    文章目录 前言 开始准备 运行配置 开始运行 JobContainer 1.进入init prepare schedule post阶段 this.invokeHooks(); 总结 前言 在用dat ...