小SY的梦

前言

本题最大的特点就是要写几万年没写过的高精!

卡常卡一万年也过不了,淦。

题目

题目背景

有一天,SY想变\(_{_{\tiny{大}}}\)(大家都知道这不可能),一天他在梦里找到了一棵可以让他变大的树,这棵树有 \(n\) 个节点,每个节点有两个权值 \(a_i,b_i\),根节点为 \(1\) 号节点, SY最开始值为 \(1\),起点为根节点,他需要找到一条从根节点出发到叶子结点的路径,使得他的值变得最\(\tiny{大}\)。若SY现在的值为 \(x\),每经过一个节点,他的值会变为 \(a_ix+b_i\),你从未来得知他在两秒之后就会醒来,并且忘掉了这个最大值是多少,醒来时他会询问你,如果你不能回答这个问题,那么他就会非常生气,后果不堪设想。由于SY认为取模后他会变,所以他不允许你取模,请老老实实回答。

题目描述

通俗点来讲是这样的:

有一棵 \(n\) 个点的树,每个节点有 \(a_i,b_i\) 两个权值,每经过一个节点你的得分就会先乘上 \(a_i\) 再加上 \(b_i\),你的初始分数为 \(1\),你需要找到一条最大化你得分的从根节点到一个叶子节点的路径,然后输出最大得分。根节点为 \(1\) 号节点。无取模。

数据范围

对于所有数据,保证 \(a,b\)\([1,9]\) 内均匀随机,\(1≤n≤5×10^5\)

\(\text{subtask}1(20pts):n≤50\)

\(\text{subtask}2(20pts):n≤5000\)

\(\text{subtask}3(20pts):\)保证 \(∀0<i<n\)\(i\)\(i+1\) 都有一条边。

\(\text{subtask}4(40pts):\) 无特殊限制。

时空限制

时间限制:\(2s\)

空间限制:\(512M\)

讲解

part1 \(n\le 5000\)

对于前 \(\tt 40pts\),只要写一个像样的压位高精(普通高精没试过,不推荐),而且只需要满足高精乘低精、加低精,高精之间比较大小即可,写得不算特别特别特别丑应该都能过。高精竟然出乎意料地好写,直接过掉。

part2 链

由于有且仅有一条路径,我们可以考虑分治。

对于先后两个操作 \((a_i,b_i)\)\((a_j,b_j)\) ,显然可以合并成一个操作:\((a_ia_j,a_jb_i+b_j)\),分治\(\tt FFT\)优化高精乘即可。

时间复杂度 \(O(n\log^2n)\)

part3 正解

\(\tt part2\) 已经可以得知计算的方法,只需要找到一条最大的路径即可。利用随机性质,我们让比较的精度在 \(\tt double\) 范围内,具体怎么做呢?

乱搞。

根据数据随机,我们可以采用 科学计数法!我们可以写成 \(o*10^p,(o\in[1,10),p\in Z)\) 的形式,\(o\) 的精度不会爆的

搞定!

代码

作为聪明的读者,你一定可以自己写出来的!がんばって!파이팅!加油!come on!
posted @ 2021-02-26 17:13  皮皮刘  阅读(68)  评论(0编辑  收藏  举报