经典套路。

题意

你将随机生成一个长度为 \(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. AcWing刷题记录 - 2022

    AcWing 1813. 方块游戏 思路 枚举,题目说明不管哪一面向上都可以,所以就两面加起来取各个字母的最大值,最后N对字母的最大值相加就是答案 代码 #include<bits/stdc++ ...

  2. ArcGIS Pro处理发布并在前端调用bim数据全过程-rvt转slpk

    记录ArcGIS处理三维bim模型全纪录,从原始的rvt格式开始,到最后web前端js api调用的整个过程,并记录部分中间操作过程中出现的问题和解决办法. 本文示例使用: 软件:ArcGIS Pro ...

  3. 准确率、召回率及AUC概念分析

    准确率&&召回率 信息检索.分类.识别.翻译等领域两个最基本指标是准确率(precision rate)和召回率(recall rate),准确率也叫查准率,召回率也叫查全率.这些概念 ...

  4. Java------常用类(二)

    import org.junit.Test; import java.io.UnsupportedEncodingException; import java.util.Arrays; /** * 涉 ...

  5. 包和正则表达式 re模块的使用

    包的使用: import.sys print(sys.path) #查看执行文件的环境 环境变量是以执行文件为准的,所有被导入的模块或者后续的其他文件引用的sys.path都是参照执行文件的sys.p ...

  6. Java设计模式 —— 适配器模式

    9 适配器模式 9.1 结构型模式 结构型模式(Structural Pattern) 关注如何将现有类或对象组织在一起形成更强大的结构.结构型模式根据描述目标不同可以分为两种: 类结构型模式:关心类 ...

  7. Redis读书笔记(一)

    Redis数据结构 1 简单动态字符串 Simple dynamic string 的实现 // sds.h/sdshdr struct sdshdr { int len; //记录buf数组中已使用 ...

  8. Active Record 活动记录

    ActiveRecord活动记录类 一.声明AR类(模型层) namespaceapp\models; useyii\db\ActiveRecord; classCustomer extends Ac ...

  9. Redis分布式锁这样用,有坑?

    背景 在微服务项目中,大家都会去使用到分布式锁,一般也是使用Redis去实现,使用RedisTemplate.Redisson.RedisLockRegistry都行,公司的项目中,使用的是Redis ...

  10. Yolov8离谱报错

    YoloV8离谱报错 ​ 今天下午给一个研究生小姐姐跑数据集,用的是yolov8在恒源云上租的4070的GPU服务器,跑垃圾分类数据集(https://blog.csdn.net/m0_5488250 ...