Description

给定 \(n\) 条边,第 \(i\) 条边的长度为 \(i\),每条边都有 \(50\%\) 的概率被选择,求如果选出的边能组成一个平面凸多边形,则方案的权值是方案中边的数量,否则权值为 \(0\)。求权值的期望对大质数取模的值。

有 \(T\) 组数据。

Limitations

\(1 \leq n \leq T \leq 5000\)

Solution

因为 \(\mathsf {\color{black} d}\mathsf{\color{red} {isangan233}}\)yLOI 的时候用倒数第二档子任务的做法过了C题,所以我也要在 MtOI 用倒数第二档子任务的做法过掉他的 C题

注意到因为所有情况的概率是相同的,因此只需要求出所有情况的总边数,除以 \(2^n\) 即为期望。

考虑 DP。

根据平面几何的某定理,对于 \(n\) 条线段,它们能组成一个平面凸多边形的充要条件是任意 \((n-1)\) 条线段的长度之和大于剩下一条线段的长度。

证明上必要性可以通过两点之间线段最短的公理证得,充分性可以对选择的线段数进行数学归纳。

得到推论:对于本题,选出的边能组成平面凸多边形的充要条件是最长的边的长度小于其他边长度之和。

证明上,考虑将最长的边换成其它的边,该边长度变小,剩余边长度之和变大,不等号方向不会改变。

设 \(f_i\) 是所有边的长度都不超过 \(i\) 时的所有能构成凸多边形情况的边数和。

考虑这些情况一共分两类,第一类是不包括长度为 \(i\) 的边的情况,第二类是包括长度为 \(i\) 的边的情况。

对于第一类情况,边数和就是 \(f_{i - 1}\)。

对于第二类情况,考虑剩下的边长度之和只要大于 \(i\) 即可。

设 \(g_j\) 是选至少两条边且边的长度和为 \(j\) 时(不要求构成凸多边形)所有情况的边数和,\(h_j\) 是选至少两条边且边的长度和为 \(j\) 时(不要求构成凸多边形)的总情况数。这两个值均要求所选的边的长度不超过 \(i\),实际上是省略了这两个值的第一维。

因此有

\[f_{i} = f_{i - 1} + \sum_{j = i + 1}^{i^2} (g_j + h_j)
\]

这里加 \(h_j\) 是因为对于每种情况都可以加一条长度为 \(i\) 的边来构成一个凸多边形,对于所有情况,每种情况可以加一条边,一共可以加 \(h_j\) 条边,而 \(g_j\) 是这种情况原有的边数。

考虑递推 \(g\) 和 \(h\)。

考虑从小到大枚举 \(i\),即边长上限增加时,\(g\) 和 \(h\) 的变化。

对于 \(g_j\),所有任选两条边且边权和为 \((j - i)\) 的情况,都可以加入这条边来达到边权和为 \(j\),同时还有不选择加入长度为 \(i\) 的边这种情况,因此有

\[g_j = g_j + g_{j - i} + h_{j - i}~~~~~(j > i)
\]

当然,对于选 \(i\) 和另一条边的情况,也能对 \(g\) 产生贡献,因此有

\[g_{j + i} = g_{j + i} + 2~~~~~~(j < i)
\]

对 \(h\) 的递推同理:

\[h_j = h_j + h_{j - i}~~~~~(j > i)
\]

\[h_{j + i} = h_{j + i} + 1~~~~~(j < i)
\]

然后用得到的 \(g\) 和 \(h\) 递推 \(f\) 即可。

考虑复杂度:所有边之和是 \(O(n^2)\) 级别的,因此每次更新 \(g\) 和 \(h\) 都是 \(O(n^2)\) 的,一共更新 \(O(n)\) 次,因此更新 \(g\) 和 \(h\) 的总复杂度 \(O(n^3)\)。而递推 \(f\) 时每次也是 \(O(n^2)\) 的,一共更新 \(O(n)\) 次,所以复杂度也是 \(O(n^3)\)。因此总时间复杂度 \(O(n^3)\),可以通过前 \(4\) 个子任务。

但是注意到我们的空间复杂度是 \(O(n^2)\) 的,因此对于第 \(5\) 个子任务,我们的空间完全能够承受,同时时间复杂度仍然是多项式级,因此 本地挂机打表 即可通过子任务 \(5\),表的长度是 \(48k\),甚至不需要用字符加密来缩短代码长度,直接存明文即可。

Code

#include <cstdio>
#include <algorithm> const int maxn = 100005;
const int MOD = 1000000007;
const int MODP = 1000000005; int T, N;
int query[maxn];
ll frog[maxn], gorf[maxn], h[maxn]; ll mpow(const ll x, int y); int main() {
freopen("1.in", "r", stdin);
qr(T);
for (int i = 1; i <= T; ++i) {
qr(query[i]);
N = std::max(N, query[i]);
}
gorf[3] = 2; h[3] = 1;
for (int i = 3, upceil = 3; i <= N; ++i) {
for (int j = i + 1; j <= upceil; ++j) {
(frog[i] += gorf[j] + h[j]) %= MOD;
}
(frog[i] += frog[i - 1]) %= MOD;
upceil += i;
for (int j = upceil; j >= i; --j) {
(gorf[j] += gorf[j - i] + h[j - i]) %= MOD;
(h[j] += h[j - i]) %= MOD;
}
for (int j = 1; j < i; ++j) {
(gorf[j + i] += 2) %= MOD;
(h[j + i] += 1) %= MOD;
}
}
for (int i = 1; i <= T; ++i) {
qw(frog[query[i]] * (mpow(mpow(2, query[i]), MODP)) % MOD, '\n', true);
}
return 0;
} ll mpow(const ll x, int y) {
ll _ret = 1, _tmp = x;
while (y) {
if (y & 1) (_ret *= _tmp) %= MOD;
(_tmp *= _tmp) %= MOD;
y >>= 1;
}
return _ret;
}

【DP】【P5615】 [MtOI2019] 时间跳跃的更多相关文章

  1. 【LGR-063】洛谷11月月赛 I & MtOI2019 Ex Div.2

    [MtOI2019]黑蚊子多: 送分向水题,直接模拟即可. #include<iostream> #include<cstdio> #define N 1505 using n ...

  2. 【LGR-063】洛谷11月月赛 I & MtOI2019 Ex Div.2 (A-C)

    [MtOI2019]黑蚊子多 : 按题意模拟 #include<iostream> #include<cstdio> #include<cstring> using ...

  3. [HDU 4842]--过河(dp+状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4842 过河 Time Limit: 3000/1000 MS (Java/Others)    Mem ...

  4. 4817 江哥的dp题d

    4817 江哥的dp题d  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 已知1-N的排列P的LIS(最长上 ...

  5. 4809 江哥的dp题c

    4809 江哥的dp题c  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 有两个数x,y,一开始x=1,y= ...

  6. 4816 江哥的dp题b

    4816 江哥的dp题b  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给出两个1-N的随机排列A,B.若 ...

  7. 4815 江哥的dp题a

    4815 江哥的dp题a  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给出一个长度为N的序列A(A1,A ...

  8. A 浪哥的烦恼 完全背包dp

    https://biancheng.love/contest-ng/index.html#/131/problems 首先,去到n点的最小时间是所有数加起来. 然后,如果我1 --- 2,然后再2-- ...

  9. 二分+DP HDU 3433 A Task Process

    HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

随机推荐

  1. MongoDB学习笔记(五)

    MongoDB 查看执行计划 MongoDB 中的 explain() 函数可以帮助我们查看查询相关的信息,这有助于我们快速查找到搜索瓶颈进而解决它,本文我们就来看看 explain() 的一些用法及 ...

  2. 百度前端技术学院task1.10

    任务十:Flexbox 布局练习 面向人群: 有一定HTML及CSS基础的同学 难度: 中 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容 ...

  3. jQuery浮窗图片到页面中间的代码

    jQuery浮窗图片到页面中间的代码 <!doctype html> <html> <head> <meta charset="utf-8" ...

  4. 虚拟机Ubuntu18.04 root下 连接 windows 中 winScp

    先查看自己虚拟机中是否有 ssh服务 如果没有的话先安装 apt-get install openssh-server 安装完之后 先手动开启一下服务 /etc/init.d/ssh restart ...

  5. PYTHON的ASCII码转换

    首先,我们要知道ASCII的ord 这个变值,附上代码: c=input("请输入一个字符:") print (c+"的ASCII码为 ".ord(c)) #用 ...

  6. C# 调用打印机打印文件

    C# 调用打印机打印文件,通常情况下,例如Word.Excel.PDF等可以使用一些对应的组件进行打印,另一个通用的方式是直接启用一个打印的进程进行打印.示例代码如下: using System.Di ...

  7. c# 项目nuget不自动安装dll

    问题 创建的项目提交到服务器上,其他人下载项目后无法生成解决方案成功,无法自动生成dll,无法自动下载安装相应的插件 解决方案 删除packages文件夹即可,nuget就可以自动安装相关的dll了

  8. Markdown温故知新(1):Markdown面面观

    1.什么是 Markdown? 2.有哪些人在用 Markdown? 3.用 Markdown 的优势是什么? 4.Markdown 的语法标准简介 5.怎么用 Markdown? 6.如何选择 Ma ...

  9. MySQL难点语法——连接

    本篇涉及的数据表格可以自行查阅上篇<MySQL难点语法——子查询> MySQL的数据表格之间有三种连接方式:等值连接.外连接.自连接.以下是通过举例介绍这三种连接方式 1.等值连接 等值连 ...

  10. EHLIB 安装方法

    Ehlib安装方法  路人甲 2010-05-05 23:01:37 安装文件自带的Readme.txt中的安装过程如下: 1. Delphi 5.x - 7.x, Delphi 9.X Win32, ...