【DP】【P5615】 [MtOI2019] 时间跳跃
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\),实际上是省略了这两个值的第一维。
因此有
\]
这里加 \(h_j\) 是因为对于每种情况都可以加一条长度为 \(i\) 的边来构成一个凸多边形,对于所有情况,每种情况可以加一条边,一共可以加 \(h_j\) 条边,而 \(g_j\) 是这种情况原有的边数。
考虑递推 \(g\) 和 \(h\)。
考虑从小到大枚举 \(i\),即边长上限增加时,\(g\) 和 \(h\) 的变化。
对于 \(g_j\),所有任选两条边且边权和为 \((j - i)\) 的情况,都可以加入这条边来达到边权和为 \(j\),同时还有不选择加入长度为 \(i\) 的边这种情况,因此有
\]
当然,对于选 \(i\) 和另一条边的情况,也能对 \(g\) 产生贡献,因此有
\]
对 \(h\) 的递推同理:
\]
\]
然后用得到的 \(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] 时间跳跃的更多相关文章
- 【LGR-063】洛谷11月月赛 I & MtOI2019 Ex Div.2
		
[MtOI2019]黑蚊子多: 送分向水题,直接模拟即可. #include<iostream> #include<cstdio> #define N 1505 using n ...
 - 【LGR-063】洛谷11月月赛 I & MtOI2019 Ex Div.2 (A-C)
		
[MtOI2019]黑蚊子多 : 按题意模拟 #include<iostream> #include<cstdio> #include<cstring> using ...
 - [HDU 4842]--过河(dp+状态压缩)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4842 过河 Time Limit: 3000/1000 MS (Java/Others) Mem ...
 - 4817 江哥的dp题d
		
4817 江哥的dp题d 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 已知1-N的排列P的LIS(最长上 ...
 - 4809 江哥的dp题c
		
4809 江哥的dp题c 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有两个数x,y,一开始x=1,y= ...
 - 4816 江哥的dp题b
		
4816 江哥的dp题b 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 给出两个1-N的随机排列A,B.若 ...
 - 4815 江哥的dp题a
		
4815 江哥的dp题a 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 给出一个长度为N的序列A(A1,A ...
 - A 浪哥的烦恼  完全背包dp
		
https://biancheng.love/contest-ng/index.html#/131/problems 首先,去到n点的最小时间是所有数加起来. 然后,如果我1 --- 2,然后再2-- ...
 - 二分+DP  HDU 3433 A Task Process
		
HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
 
随机推荐
- 哪个版本的gcc才支持c11
			
而知,低版本的gcc不支持c11. (而我此处的eglibc 2.17,和那人的glibc-2.16.0,都是需要支持c11的gcc的) 所以此处想要去搞清楚,什么版本的,哪个版本的,gcc,才支持c ...
 - Android ADB 实用总结
			
一.背景 从系统架构上来说,Android是基于Linux系统基础上,做了进一步的定制与修改,并融入了自身的特有功能,且向应用层提供应用程序接口,供开发者使用.系统内核层面,主体依然是Linux内核. ...
 - WPF DataGrid 使用CellTemplateSelector 时SelectTemplate方法Item参数为NULL
			
首先说明 在SelectTemplate中并Item参数并不是真的一直为Null.而是先执行空参数,之后再会执行有参数的. 至于原因 我也不知道... 具体验证过程是 也就说 做好非空检测即可
 - IdentityService4学习笔记之Client Credentials
			
IdentityService4简介 一套为应用程序构建身份认证和访问控制解决方案/框架,包括单点登录,身份认证,授权和API访问控制. 前文 今天介绍ClientCredentials认证类型,适用 ...
 - 用友U9执行JS代码。
			
UFSoft.UBF.UI.AtlasHelper.RegisterAtlasStartupScript(part.Page, part.Page.GetType(), "JavaScr ...
 - 微信小程序主要开发语言
			
小程序的主要开发语言是 JavaScript ,开发者使用 JavaScript 来开发业务逻辑以及调用小程序的 API 来完成业务需求. 在大部分开发者看来,ECMAScript和JavaScrip ...
 - ASP.NET Core中使用MialKit实现邮件发送
			
# 导包 首先我们需要导入 MailKit NuGet包,NuGet安装包命令在下方拓展介绍中. # 引用命名空间 using MailKit.Net.Smtp; using MimeKit; # 邮 ...
 - 定时调度之Quartz
			
工作中我们经常碰到定时或者固定时间点去做一些事情,然后每天到时间点就会去做这样的事情,如果理解这样的场景,我们就要引入今天我们的主角Quartz,其实这个跟数据库的作业类似,但是不仅仅局限于数据库. ...
 - React源码 ReactDOM.render
			
在 react 当中,主要创建更新的有三种方式 1.ReactDOM.render || hydrate 这两个api都是要把这个应用第一次渲染到我们页面上面,展现出来整个应用的样子的过程,这就是初 ...
 - PacMan 01——地图的搭建
			
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...