$bootpuss$切不掉的「水题」
UPD:2019-11-13
角度都为60度的六边行可以做到六条边都不一样
UPD:2019-11-08
$Solution$:
因为数据过水,假贪心和随机化基本能$A$掉的这个
主要暴露一些问题吧,有点刚一个能一遍贪心的思路,这个思路显然是挂掉的。
稍解释一下:
每次判最大的$A$,判断能不能跳出去是正确的。难点是怎么在剩下的能使在不淹死的里选择。
1>选择向上走最大的,有相同的选$A$小的,但这样可能造成选择了一个较大的$B$,使答案变为$-1$
2>考虑了上一条,你可能会把$B$加入到选择的判断中,但这只能保证最优情况下能不能活着出去而不是最优天数
既然一遍贪心不可行,可以考虑在判定中加一些必要的枚举的限制,并且能快速统计每个限制下的答案取最优,这样就能考虑全面。
此题可枚举最后吃的药丸。
先按$A-B$排序,用$st$表维护一个前缀和为$\sum A[i]-B[i]-C[i]$,每次二分找到位置,找最小值判断是否在登顶之前触到水。
得解。
UPD:2019-11-02
$Solution$:
看着很像记忆化,$n<=16$的数据范围十分可做,然而出现了一片$WA50$,仔细思考发现题意理解有些问题。发现抵消传递这个东西是必须在同一时刻某个点的多次触动。所以记忆化还要多开一维表示是否向上传递,转移不太好写。
而正解很巧妙地处理掉了上面说的这个有后效性的抵消。
如果把过程倒着考虑,那么倒数第$i$秒的操作,要产生一个$f[j][i]$的影响。它的定义是$j$点触动了$i$秒能影响到的祖先的一个二进制状态。
因为倒序,那么异或上就是对的。因为二进制某位上如果有一定发生在倒数$i$秒后,有效的解决了正推无法确定传递的影响具体能到何种地步的问题。
UPD:2019-10-29
$Description$:
给出一个无向带权图,给出一些特殊点,求每个特殊点到其他特殊点最短距离的最小值
$Solution$:
看题解,还是挺水的。
初始将每个特殊点做源点塞入堆中,和单源最短路一样来更新每个点距离最近的特殊点的距离并维护来源,是有正确性的。
然后枚举每条边,判断两个端点来源并更新。
并不用在意距离相同的特殊点,因为一条可以成为答案的最短路径上,路径的中间位置的两个点的来源一定分别是是这条路径两端的特殊点。
$Description$:
有$n$个数对$(a_i,b_i)$,第$i$个数对的权值为$w_i$。你需要选出一些数对并以任意顺序排列它们,满足对于所有$i<j$,都有$a_i$<=$b_j$,最大化你选出的数对的权值和。
$Solution$:
首先是原题没看出来,其次当时还想出正解了,最后是尝试了排序方法却没有试出来是因为暴力$DP$打错了。
考虑为什么按$a+b$排序:
1>$a_i>b_j\&\&b_i>a_j$,把$j$放前面
2>$a_i>b_j\&\&b_i<a_j$,相对位置没贡献
上述两种情况及两个对立面的贪心均可以在$a+b$的排序下符合条件
UPD:2019-10-19
$Description$:
给$root=1$并且初始化为白点的树,给两种操作,将白点变黑点,询问某点与所有黑点的$w[lca]$。
$Solution$:
$dfs$序的裸题,尽管没看出来。
主要思路是把询问的答案来源拆成两部分:
1>黑点为询问点的父亲
2>反之
所以考虑一个白点$u$变成黑点的影响,以$u$为根的子树的点的答案要与$w[u]$取$max$。
然后往根的方向跳,设跳到的点为$g$,那么$fat[g]$的子树去掉$g$的子树的点都要与$w[fat[g]]$取$max$。
在$dfs$序上区间修改,单点查询即可。
UPD:2019-10-16
$Description$:
给出$N$个权值,一个正整数$K$满足有一个选择方案的权值和在$[K,2*K]$中,即视为合法,问合法的$K$的个数。
$Solution$:
没有静下心去看大样例,即使没有自己推出规律,如果能看透大样例,那估计也是能$A$的。
对于一个数$x$,考虑单独他能作出的贡献,即$K\in [\left \lceil \frac{x}{2} \right \rceil,x]$都能取到
先给$a[i]$排序,考虑从小到大枚举,维护一个$qsm$,当$qsm<\left \lceil \frac{a[i]}{2} \right \rceil$,可以得到$[qsm_{i-1}+1,\left \lceil \frac{a[i]}{2} \right \rceil]$的K都不合法。
简单证明:单独$a[i]$的贡献是$[\left \lceil \frac{a[i]}{2} \right \rceil,a[i]]$,可以在此权值上加一些$a[s]$,但这个左区间一直是最小的,所以给出的区间的$K$,不合法。
最大的$K$为$sum$,减去不合法的即可。
得解。
UPD:2019-10-15
$Description$:
给出一些区间和一些点,只有点被包含在区间时可以唯一配对,为最大配对
$Solution$:
简单贪心思路正确,维护又麻烦了。
先把点排序,然后枚举每个点找到
我的做法是先把区间全放进去,然后把右端点不合法的堆顶去掉,如果左端点不合法,那么放到vector,结束后还要放回来。
正解是排序区间,每次枚举到一个点,把刚好左端点合法的放进堆去。
通过时间限制解决了不合法限制。这是我非常不擅长的。
UPD:2019-10-14
$Description$:
给出一个序列,求一个子序列的平均值。平均值定义为:把序列分成升降交替的形式,其中第一段必须为增。平均值等于序列权值和段数做比。
$Solution$:
考场$dp$又转移炸了。。。
$T60$:
定义$dp[i][j][0|1]$为$i$个数为第几个块,为降序还是升序。
两种转移:
像我一样sb的T40:
$dp[i][j][opt]=\max dp[k][j][opt\ xor\ 1]+f[opt][k+1][i]$,
$f[opt][i][j]$为从$i$设界限,以$j$为结尾的上升/下降的最大权值和
简单的T60:
$dp[i][j][0]=\max\{dp[k][j-1][1],^{[a[k]<a[i]]}dp[k][j][0]\}+a[i]$
$dp[i][j][1]=\max\{dp[k][j-1][0],^{[a[k]>a[i]]}dp[k][j][1]\}+a[i]$
数据结构优化成$O(n^2)$
$AC100$:
正解很简单,是一道很套路的找规律简单$dp$。
初始一定有一个单增序列,此时有一个平均值,如果后面有一个可以接上的单减序列,并且平均值要大,贪心地接上。
接上后,考虑又有一个单增序列,那么如果这个的平均值要大,那么只要这个,否则,不选择接上
所以最优解只有两个情况:
1>一段单增序列
2>一段单增和一段单减
得解。
UPD:2019-10-13
$Description$:
从前有个括号序列 $s$,满足 $|s| = m$。你需要统计括号序列对 $(p, q)$ 的数量。
其中 $(p, q)$ 满足 $|p| + |s| + |q| = n$,且$ p + s + q $是一个合法的括号序列。
$Solution$:
简单$dp$或卡特兰数。括号序列匹配把左右括号分别看作$+1$,$-1$就很方便了。
$dp[i][j]$定义为放了$i$个括号,前缀和为$j$的方案数,注意转移是把括号往后放,不然会算重。
$$dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1]$$
实际上这个$dp$数组可以有卡特兰数求解。
卡特兰原式子:$C_{n+m}^{m}-C_{n+m}^{m-1}$($n>m$)
在这里相当于$j+2*x=n+m$,得到$n=j+x,m=x$即可
然后$O((n-m)^2)$枚举$p$串长度和留下的括号个数