题意:有一个栈,随机插入 $n$ 次 $0$/$1$ 如果栈顶是 $1$,然后插入 $0$,则将这两个元素都弹出,否则,插入栈顶. 求:$n$ 次操作后栈中期望的元素个数. 我们发现,按照上述弹栈方式进行,栈中元素一定是由若干个连续 $0$ 加上若干个连续 $1$ 组成. 而 $1$ 所在的联通块还在栈顶,所以我们只需考虑 $1$ 的个数即可. 令 $f[i][j]$ 表示 $i$ 次操作过后,栈中有 $j$ 个 $1$ 时期望的元素个数. 由于期望在任何时候都有可加性,所以 $f[i+1][]…
二次联通门 : LibreOJ #6191. 「美团 CodeM 复赛」配对游戏 /* LibreOJ #6191. 「美团 CodeM 复赛」配对游戏 概率dp */ #include <cstdio> #include <iostream> ; char Buf[BUF], *buf = Buf; inline void read (int &now) { ; !isdigit (*buf); ++ buf); + *buf - ', ++ buf); } #defin…
题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数,四舍五入保留三位小数. 样例输入 10 样例输出 4.168 题解 概率期望dp 显然任何时刻栈中的元素自底至顶一定是若干个0+若干个1. 但是如果设状态$p[i][j][k]$表示前$i$次操作,栈中$j$个0,$k$个1的概率,复杂度是$O(n^3)$的,显然会TLE. 注意到$0$的个数对状态…
题目 显然期望dp. 简单想法: f[i][j]表示前i个人中向右看并且没有被消除的人数的概率 如果第i+1个人是向右,$f[i+1][j+1]=f[i][j]/2$ 如果第i+1个人是向左,$f[i+1][j-1]=f[i][j]/2$ 最后期望总和是$\sum_{i=0}^{n} i*f[n][i]$ 转移没有问题,但容易发现这样算出来的期望剩余人数没有算上向左看的. 什么意思呢?我们都知道期望=数量(人数)*概率,但这里dp只设了向右看的人数状态,虽然也包括了所有向左看的情况,但最后算期望…
#6192. 「美团 CodeM 复赛」城市网络 内存限制:64 MiB 时间限制:500 ms 标准输入输出   题目描述 有一个树状的城市网络(即 nnn 个城市由 n−1n-1n−1 条道路连接的连通图),首都为 111 号城市,每个城市售卖价值为 aia_ia​i​​ 的珠宝. 你是一个珠宝商,现在安排有 qqq 次行程,每次行程为从 uuu 号城市前往 vvv 号城市(走最短路径),保证 vvv 在 uuu 前往首都的最短路径上. 在每次行程开始时,你手上有价值为 ccc 的珠宝(每次…
#6192. 「美团 CodeM 复赛」城市网络 内存限制:64 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: sqc 提交提交记录统计讨论测试数据   题目描述 有一个树状的城市网络(即 nnn 个城市由 n−1n-1n−1 条道路连接的连通图),首都为 111 号城市,每个城市售卖价值为 aia_ia​i​​ 的珠宝. 你是一个珠宝商,现在安排有 qqq 次行程,每次行程为从 uuu 号城市前往 vvv 号城市(走最短路径),保证 vvv 在 uuu …
[LOJ 6213]「美团 CodeM 决赛」radar 题意 给定 \(n\) 个横坐标 \(x_i\) , 为它们选择一个不超过 \(y_i\) 的纵坐标 \(h_i\), 产生 \(c_ih_i\) 的花费. 选择之后产生的总价值是所有以 \((x_i,h_i)\) 到 \(x\) 轴的垂线段为斜边上的高的等腰直角三角形的并的面积. 最大化总价值与总花费之间的差并输出这个差. \(n\le 1\times 10^5\). 题解 首先有一个比较显然的沙雕性质, 就是某个三角形的高要么是 \(…
题意 题目链接 Sol 考虑不合法的情况只有两种: 进去了 再次进去 没进去 但是出来了 显然可以用未知记录抵消掉 直接开个set维护一下所有未知记录的位置 最优策略一定是最后一次操作位置的后继 同时我们需要记录一下每个人是否在里面 #include<bits/stdc++.h> using namespace std; const int MAXN = 1e6 + 10; inline int read() { char c = getchar(); int x = 0, f = 1; wh…
题目链接 题意分析 首先 \([u,v]\)在树上是一条深度递增的链 那么我们可以使用倍增找 \(x\)的祖先当中深度最大的值大于\(x\)的点 然后维护一个\(pre\) 重新建树 这样从\(x\)到根节点 权值严格递增 我们在这个新树上维护好深度以及倍增数组 然后再去倍增找到最近的权值>z的点 如果不存在或者深度\(<y\) 那么输出\(0\) 然后再倍增找到找到深度大于\(y\)的最浅的节点 然后用深度就可以计算出节点的个数 CODE: #include<iostream>…
题目: 一个有门禁的大楼,初始时里面没有人. 现在有一些人在进出大楼,每个人都有一个唯一的编号.现在有他们进出大楼的记录,但是有些被污染了,只能知道这里有一条记录,具体并不能知道. 一个人只有进大楼,才能出大楼,如果在大楼内,他必须先出去,才能再进来. 现在想知道这个记录是否错误,如果错误,请求出最早的错误在哪一行. 注释:人有无穷多个,记录中没有提到的人也可以进出大楼. 题解: SB 题 #include <set> #include <cstdio> #include <…