7.27XYD比赛

听说很坐牢

T1:
n<=15

假如1得了流感,那么2就有\(1-\frac{1}{2}^{m}\)概率得流感
如果1是初始得流感的,那么2概率就是\(1-\frac{1}{2}^{m}\)
如果1不是,那么1 2都是1

\(1 , 1-\frac{1}{2}^{m+1}\)


好好好,这题其实不是特别难。

算概率,如果这题要输出分数,这题就不用取模了,那么答案也可以很轻松存。所以我们考虑计算总的方案数和感染的方案数,那么我们就可以算出概率了。考虑怎么把这个\(\frac{1}{2}\)的概率体现在里面。我们每次往下,那么情况数翻倍,有一些情况不变,有一些情况变成2倍。

观察数据范围,考虑一点指数的做法,考虑状压。\(dp[i][S]\)为第i天S集合中的人感染的方案数,那么我们一开始每一个人感染的情况都是1,然后我们最终S包含i的情况数是tot,那么我们也就可以算出其它的情况数了。

考虑怎么转移,首先初始状态已经好了

我们枚举S,无论如何,我们情况数过一天会翻倍,那么如果S中x,y都是1,那么*2,否则平均分配情况,这就好了?

T2:
最大化最长上升子序列长度+最长下降子序列长度(开头必须是1)

很容易想到一个dp,这题不是dp我持

dp[i][j][k]代表做到i,然后两边的最后是j和k

考虑优化状态,第一维去掉

dp[j][k]为j,k的最大答案

  • 如果向第一个填,那么第一维 \(<j\) 的max+1就会转移到dp[a[i]][k]
  • 如果向第二个填,那么第二维 \(>k\) 的max+1就会转移到dp[j][a[i]]

利用前缀和优化,容易做到n^2

这边想到了S的T3

如果我们只有一维呢?那么我们另一维的贡献怎么计算呢?或者我们固定一维,看看另外的维单调性。如果另一维大,那么说明另一维填的数比较大,也就没有贡献到第一维,所以如果j固定,答案随着k增大应该是个不知道啥的函数。先写n^2看看决策单调性?但是这题的两个是不等价的。我们考虑答案怎么确定

dp[i][2]为第i个数填到0/1的最大答案,如果这个状态确定了,那么前面的答案自然可以确定。考虑怎么转移,显然很难计算贡献,考虑用数据结构优化,继承上面思路

我们每加入一个数 \(dp[a[i]][k]=\max_{p=0}^{a[i]-1} dp[p][k]+1\)
\(dp[j][a[i]]=\max_{p=a[i]+1} dp[j][p]+1\)
第一个应该是把一个下边矩形整体往一条线上压
第二个应该是把一个右边矩形整体往一条线上压

S的T3是一维下标一维值域才可以转移的,但是这个真的太奇怪了。
考虑啥不合法的不优啥的。

首先我们的dp方程只有一维,这个可以从数据范围看出。或者就是数据结构优化

首先我们这样压,我们限制我们的dp方程必须要取第i个数,dp[i][j][2]为做到i了,另一个序列是j,i填在0/1的最大答案。思考方程

填0
\(dp[i][j][0]=max_{a[p]<a[i]} dp[p][j][0]+1\)
\(dp[i][j][0]=max_{p<a[i],j=a[q]} dp[q][p][1]+1\)
填1
\(dp[i][j][1]=max_{a[p]>a[i]} dp[p][j][1]+1\)
\(dp[i][j][1]=max_{p>a[i],j=a[q]} dp[q][p][0]+1\)

使用数据结构,我们发现这题比较特殊,也就是它的j有限制,所以我们不能单单考虑i,既有下标,又有值域,这真的不是人啊,放弃了,想不到有什么数据结构维护了

看部分分,然后有个新思路。既然长度很小,我们把长度压到dp里面,我们长度越大,答案肯定越大的,因为我们往一个序列里乱扔东西是不会让答案变劣的。这启示我们这样做,我们一个序列只取下降序列,然后另一个随便扔,然后在其中统计答案。假如我们这样做

dp[i][k]从j转移过来,那么[i+1,j-1]都会对另一维产生贡献,

哦哦哦哦哦!!!

dp[i][p]=dp[j][q]+solve(q,a[])

我们确定了另一个的上一个的开头,然后拼上这个是不是就好了,然后这个solve是随着q减小增大的。从 \(a[j]<a[i]\) 转移,然后计算中间的东西,然后不会转移了。

这个部分分怎么拿。考虑我们从最长上升子序列的角度考虑,我们这个一般就是用树状数组做的,感觉有点难做。考虑枚举最长下降子序列,如何枚举?

我们考虑挑出一个最长上升子序列,看看剩下的,如果没有剩下,那么这个答案已经最优,如果有剩下的且只有1个,如果我们要拓展最长下降的长度,那么就会有一种方案从最长上升子序列里面挑出一个数和这个交换使得最长上升子序列不变并且挑出的那个数可以和后面形成最长下降。

考虑我们只有下降长度为1就代表这个序列是两个最长上升子序列拼起来的

考虑这种红蓝交替染色的情况,红为主要的最长上升,由于最长上升的性质,我们两个红中间夹的肯定是 \(<=\) 第一个红的的东西,我们交换就是把一个红的和它右边的红的左边的第一个蓝的交换,这个贪心很显然,哦哦哦!也就是如果一个红的的右边的最右蓝大于这个红的左边的红的,并且这个红的的右边至少有两个蓝,那么就可以更新答案,判断是好判断的

56pts,招笑

写完部分分了,但是感觉样例不强,到时候看看能不能造出来。

好好好,这个前缀和优化因为max太多了,所以还要用ds维护一下,直接树状数组

哥们暴力挂了

思考一下

我们把一个序列变成最长上升子序列一定是不劣的,那么我们另一个不就是最长下降吗?这个不全都是道理

三千越甲可吞吴!假了!

假的地方是我们有一些是必须要转移的,也就是两个序列必须完全转移

那么所有部分分都挂了啊


P11106

首先这个3维肯定做不了。发现有些状态是无效的。首先我们能轻松处理出以i开头结尾的子序列数量。那么对于dp[i][j][k],如果j>k那么我们上升和下降肯定不交,那么我们以j,k开头加到这里面就好了那么我们考虑有多少状态。我们固定i,枚举j,我们发现一个j只会对应一个k,那么我们这种状态也只会有 \(O(n^{2})\) 种了,考虑上一次的状态,

3维状态的dp,你要log做,搞笑吧!

抛弃dp

我们发现这个有一个类似交点的东西,这个交点的数量显然是O(n)的,枚举交点,考虑答案是什么样。

首先考虑a[i]后面,我们挑出一个最长上升和最长下降,那么这两个是不交的,那么剩下的数乱扔即可,不会让答案更优。对于前面,我们最长下降会取走所有>a[i]的最长上升会取走所有 < a[i]的,那么我们就是要询问。>a[i]的所有数构成的最长下降。我们设up[i]为以i结尾的上升,down[i]为以i结尾的最长下降。那么我们的答案并非 \(max(down[>a[i]])+max(up[<a[i]])\)因为我们会取完所有数,其实也就暗暗确定了最低位了。设前面a[i]的前驱/后继为pre/suf,那么答案就是up[pre]+down[up]+以i开头的最长上升+以i开头的最长下降-1乱搞即可

幽默

我们假了。我们强制选交点其实是不优的。为什么啊?其实是对的,因为这里我们枚举了所有情况。但是假如我们a[i]分给了上面,那么下面其实就是从suf开始了,仔细实现

幽默,我们前面并不是什么以pre结尾的最长上升啥的,而是我们所有数构成的一个东西,然后求其前缀最小值这么搞一下

T3:
n<=100

暴力

posted @ 2025-07-27 18:50  wuhupai  阅读(11)  评论(0)    收藏  举报