太蠢了……$noip$ 后第一次模拟赛竟然是这样的……完全就是打击自信 / 降智……

1. 假面

一道神仙概率 $dp$!第一次写……

拿到题就发现血量 $m_i$ 的上限只有 $100$!

然后 $0$ 操作就可以用 $rate(i,j)$ 动态维护第 $i$ 个人血量为 $j$ 的概率啦。

$1$ 操作比较麻烦(但是它故意弄得很少)。

设 $live_i$ 和 $dead_i$ 分别为 $1$ 操作范围内的第 $i$ 个人活着和死了的概率,$g_{i,j}$ 是除 $i$ 以外有 $j$ 个人活着的概率。

第 $i$ 个人的答案就是 $live_i\times \sum_{j=0}^{k-1} \frac{1}{j+1}\times g_{i,j}$,其中 $\times \sum_{j=0}^{k-1}$ 是因为等概率攻击自己和其它 $j$ 个人(自己必定活着,因为自己的答案是命中自己的概率)。

但是 $g_{i,j}$ 怎么求?我们发现它的原型是这样一个 $dp$:设 $f_{i,j}$ 表示前 $i$ 个人有 $j$ 个活着的概率。

不难看出它是能递推出来的:$ f_{i,j} = f_{i-1,j-1} \times alive_i + f_{i-1,j} \times dead_i$

而且它最终转移出的总共 $k$ 个人的概率 与转移顺序无关,所以把当前求答案的这个人放到最后,然后不算他,推出的前 $k-1$ 个人的概率 $f_{k-1}$ 就是 $g_i$ 了。

每次最多有 $k$ 个人要求答案,套上述 $O(n^2)$ $dp$,时间复杂度是 $O(C\times n^3)$,能得 $70$ 分。

然后怎么优化?

$XJR$:我会 $FFT$!

不过他现场被卡成 $80$,事实证明 $200$ 个数的卷积算上常数 甚至比暴力还慢,$O(n^2\times log(n))$ 容易被卡成 $70$ 分。

$100$ 分就是(我)没弄过的一个操作了——倒推 $dp$。

什么意思?我们观察递推式 $ f_{i,j} = f_{i-1,j-1} \times alive_i + f_{i-1,j} \times dead_i$

它是可以简单反推的,即移项得到 $$f_{i-1, j} = \frac{f_{i, j} - f_{i -1, j - 1} \times live_i}{dead_i}$$

又因为答案与转移顺序无关,所以对于每个放到最后的要求答案的人,$f_{k-1}$ 可能会变,但 $f_k$ 一定不变。我们只需要从所有人的概率情况 $f_k$ 去掉当前求答案的人即可得到 $g_k$,而把这个人像上面一样放到第 $k$ 位时,由于上式可以从 $f_k$ 转移一次就得到 $f_{k-1}$,我们就可以一次求得 $g_i$。这样就不用像之前那样对于每个求答案的人重新从第 $1$ 到 $k-1$ 位递推一遍 $f$ 数组了(所以程序中的 $f$ 数组是一维的,最终存的是 $f_n$)。

$$f_{k-1, j} = \frac{f_{k, j} - f_{k -1, j - 1} \times live_k}{dead_k}$$

因为第 $k$ 个数是我们当前要求答案的第 $i$ 个人,所以 $live$ 和 $dead$ 的下标可以直接替换成 $i$,这样就省去了实际交换。

每次只是反推了一位,之前被各种博客无限误导为要整体反推一遍,然后无限瞎**理解,然后极其暴躁

2. 暴力写挂

我像是会边分治吗?

45pts:

$noip$ 难度,会写 欧拉序+RMQ 的 $O(1)$ 求 $lca$ 就行了。

100pts:

一个比较叼的线段树合并,作为一个初学者,别人的题解都好难看懂哦……杠了不少时间。

首先要知道这么一个不常用的计算链并长的方法:树上两点 $x,y$ 到根的链并长 = $[depth(x)+depth(y)+(depth(x)-depth(lca))+(depth(y)-depth(lca))] / 2$。

画个图就是

容易发现,四种颜色的边加起来之后,每条边都被算了两次,因此除以 $2$ 后每条边就只被算 $1$ 次了。

这里定义一个点 $x$ 的权值为 $depth(x)+(depth(x)-depth(lca))$。其中 $lca$ 会在之后枚举。

为什么要用这个?最后会提。

开始正题。

观察题目式子,发现前 $3$ 项是第一棵树上的,最后一项是第二棵树上的,好像不支持同时维护跨树的信息,所以我们枚举第二棵树的 $lca$。

也就是说,从第二棵树的根节点开始深搜遍历第二棵树。

那怎么解决第一棵子树?

我们注意到这样一个事情:一个点只对它的所有祖先节点有影响。

(这不是废话吗)

但正是这一点,让这个树上问题可以套个板子。

考虑一下不套板子的时候,直接做,怎么做?

如果我们固定了第一棵树的某个点为 $lca$,那我们只需要找这个点的所有子树中,子树中最大点权最大的两个,相加即可得到答案。

但我们只固定了第二棵树的 $lca$,所以我们可以反过来做,用第一个树中的点的权值更新其所有祖先节点。这样当之后祖先节点作为 $lca$ 时,只要取它被更新到的最大值和次大值,相加即可得到答案。

然而这样做复杂度并不对,因为树的深度一大,就有很多点有很多祖先节点,暴力更新的时间就炸了。

这时就可以套树分治板子了。我这用的是边分治(也可以用点分治做)。

众所周知,树分治就是通过重构树来让它尽量平衡一些,至少控制在 $log(n)$ 级别(二叉树)。然后我们就可以暴力枚举祖先什么的了。

而枚举第二棵树的 $lca$ 时,我们在之后对第一棵树做线段树合并时,只能枚举所有不能确定第一棵树的 $lca$

【2018.11.22】CTSC2018(模拟赛!)的更多相关文章

  1. 2018.9.22 NOIP模拟赛

    *注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 妹子 Problem B 旅程 Problem C 老大 因为业务水平下滑太严重,去和高一考NOIP模拟,sad... P ...

  2. 2018.11.7 PION 模拟赛

    期望:100 + 80 + 75 = 255 实际:0 + 80 + 60 = 140 唉~一天比一天犯的错误智障,感觉noip要凉啊... 吓得我赶紧吃几颗药补补脑子. 奶一下大佬: lgj AK ...

  3. 2018.11.6 PION 模拟赛

    期望:100 + 40 + 50 = 190 实际:60 + 10 + 50 = 120 考得好炸啊!!T1数组开小了炸掉40,T2用 int 读入 long long ,int存储 long lon ...

  4. 2018.11.5 PION模拟赛

    期望:30 + 40 + 50 = 120 实际:30 + 50 + 40 = 120 ‘’ 思路:最重要的是发现 是完全没有用的,然后这个题目就可以转成DP来做. /* 期望的分:30 */ #in ...

  5. 2018.11.3 PION模拟赛

    期望:100    实际:100 #include<cstdio> #include<cstring> #include<iostream> #include< ...

  6. 2018 11.2 PION模拟赛

    期望:100 + 50 + 30 = 180 实际:0 + 50 + 30 =80 期望:100   实际:0 数值有负数,边界应该设为-0x7f       此处 gg /* 期望的分:50+ */ ...

  7. 2018 11.1 PION 模拟赛

    期望:250  100+100+50 实际:210   80+100+30 期望:100   实际:80 最后:两个点T了.可能是求逆元的方法太慢了,也可能是闲的又加了一个快速乘的原因. #inclu ...

  8. 11.7 NOIP模拟赛

    目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...

  9. 11/1 NOIP 模拟赛

    11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...

随机推荐

  1. codevs 2915 期末考试

    时间限制: 1 s  空间限制: 16000 KB  题目等级 : 黄金 Gold 题目描述 Description 期末考试要来了,某同学正在努力复习. 他要复习N个知识点,每个知识点需要一定的知识 ...

  2. ubuntu 14.04 离线部署docker

    hett@hett-virtual-machine:~$ lsb_release -aNo LSB modules are available.Distributor ID:    UbuntuDes ...

  3. ubuntu 14.04 配置java 1.8环境变量

    从官网上下载jdk 源文件,并解压 root@hett-PowerEdge-T30:/usr/local/src# tar -xzvf jdk-8u151-linux-x64.tar.gz 解压完成之 ...

  4. JSON数组不用字符串转换的写法

    var organization = []; //机构组织 //初始化用户数据列表中用户机构列的数据源 admin.ajax("GetOrganizationInfo", null ...

  5. UVA - 1658 Admiral (最小费用最大流)

    最短路对应费用,路径数量对应流量.为限制点经过次数,拆点为边.跑一次流量为2的最小费用最大流. 最小费用最大流和最大流EK算法是十分相似的,只是把找增广路的部分换成了求费用的最短路. #include ...

  6. dubbo 分布式治理

    1. dubbo 仅支持java语言之间的通讯. 2. dubbo 产生的背景是因为分布式的情况下产生的. 3. 解决服务治理的问题,通过注册中心进行管理 4.SOA 治理方案 tcp 协议传输,只需 ...

  7. WPF中引入外部资源

    有时候需要在WPF中引入外部资源,比如图片.音频.视频等,所以这个常见的技能还是需要GET到. 第一步:在VS中创建一个WPF窗口程序 第二步:从外部引入资源,这里以引入图片资源为例 1)新建Reso ...

  8. Swift 编程思想 Part 4:map all the things!

    Swift 编程思想 Part 4:map all the things! 2015-10-22  837 文章目录 1. 数组 vs. 可选类型 2. 作用在可选类型上的 map() 3. 回到我们 ...

  9. Python可变与不可变类型及垃圾回收机制

    1. 可变与不可变类型 1.1  可变类型 在id不变的情况下,value可以改变,则称之为可变类型.列表.字典与集合是可变的. l1 = [,,,,] print(id(l1)) l1[] = #改 ...

  10. perl学习之裸字

    use strict包含3个部分.其中之一(use strict "subs")负责禁止乱用的裸字. 这是什么意思呢? 如果没有这个限制,下面的代码也可以打印出"hell ...