题面

给一棵带权有根树,$m$ 次询问两个点之间的路径,要求将一条树边置 $0$ 后,最小化所有询问路径长度的最大值。

分析

显然二分答案。

考虑 $check(x)$ 函数,判断是否能构造出最大值为 $x$,我们可以考虑所有长度大于 $x$ 的路径,记录下来,然后记录下来的重合路径是否有满足条件方案。

关键是如何获取重合的边,考虑在树上差分,在询问点打上 $+1$ 的标记,在 lca 上打上 $-2$ 的标记,然后将标记从叶子推上去即可。

由此我们获取每条边在多少条路径之内,容易判断是否能够构造出来。

阅读全文 »

这场题怎么这多锅?题面看起来怎么这么麻烦啊,自闭 T^T。

A Minimizing the String

字符串删掉至多一个字符时得到的串中,输出字典序最小的那个。

显然必须删一个,从左往右必须单调不减,找到第一个断开的位置或者删除最后一个位置即可。

B Divisor Subtraction

日常 B 翻车?

一开始觉得找到最小素因子,输出 n / 最小素因子 即可,实际上最小素因子会改变。

在第一次删除最小素因子后,n 变成了一个偶数,这时最小素因子不会再次改变。

$ans=1+\frac{(n-mindivsor)}{2}$。

C Meme Problem

解一元二次方程,这 BC 位置是不是该换一换啊?

D Edge Deletion

给一个无向带权联通图,记 $d_i$ 表示 1 到 i 的最短路长度,将图上的边删到至多 $k$ 条,最大化最短路长度不变的点的数量。

感觉上跑一个 dijkstra,然后把出现次数最多的扣出来?挂了,直接在最短路图上 dfs 输出 k 条边就行了?

E Vasya and a Tree

给一棵树,每个节点初始值为 $0$。

定义 $k-subtree(i)$ 表示 $i$ 的子树中深度不超过 $dep[i] + k$ 的顶点构成的树。

$m$ 次询问将 $d-subtree(v)$ 内所有顶点加上 $x$,输出所有点权。

离线询问,注意到每个顶点的权值只与其祖先有关,所以可以用树状数组,对深度维护的前缀和。

阅读全文 »

A Extract Numbers

字符串处理。

B Queries about less or equal elements

二分。

C Make Palindrome

特判一下奇数个数字符,对应修改。

D Area of Two Circles’ Intersection

两个圆的面积交。

卡double,毒瘤。

E Lomsat gelral

树上启发式合并。

阅读全文 »

A Elections

仔细读题。

B Simple Game

给定一个区间 $[1,n]$,两个人分别选定一个数 $a,m$,在范围内随机生成一个数 $x$,距离这个数近的胜利,距离相等对方胜利。

已知区间长度和对方的选择,问自己选择什么获胜概率最大。

计算一下可以得到:$2(a-m)x>(a-m)(a+m)$,对 $a,m$ 大小关系讨论后,发现 $a$ 只会取 $m+1$ 和 $m-1$,分类算一下即可。

注意特判 $n=1$。

C Replacement

给一个字符串,每次将最前面的 “..” 合并为 “.”,询问将某个位置永久修改成另外一个字符时的操作次数。

分类之后进行修改,讨论一下可以 $O(1)$ 更新答案。

D Tree Requests

树上启发式合并。

阅读全文 »

树上启发式合并是用于解决一类树上无修改的子树信息离线查询问题的一种有力工具。

其时间复杂度由轻重链剖分来保证,轻儿子的大小会小于父亲大小的一半,也就是一条链上最多有 $\log$ 数量级的轻儿子。

树上启发式合并,优化自一个 $O(n^2)$ 的想法,对于一个节点,递归计算这棵子树,更新答案,然后消除其所有子树的贡献,防止儿子之间相互影响。

但是,这样做实际上有些答案的贡献是多删除的,应该保留一些贡献不删除,根据树链剖分选择保留重儿子的信息回溯到父亲节点。

之后我们得到了这样的过程,递归进入一个节点,先计算其轻儿子的答案,最后计算重儿子,之后将重儿子的信息上传到父亲,结合这些信息再递归计算这棵子树的轻儿子位置,得到该节点的答案,最后根据递归参数调整是否要上传子树信息。

阅读全文 »

题面

给定 $n$ 个人的位置和目标位置坐标的 y 值。

每天所有人朝目标位置上下左右移动一格,优先上下移动。

如果两个或三个人到同一个位置,则两个人都死亡。

目标坐标的 x 在整数范围内取值,要求最多和最少多少人到达目的地。

分析

几个人肯定只能在轴线上撞到,对所有人按 x 轴排序。

分别计算出在轴线上往左走和往右走时,每个位置能够剩余多少人。

搞出前缀和,即表示有多少人人向这个方向走,能够到达当前位置。

答案为当前位置上下的人数加上到左右两格的总人数的最大最小值。

注意要特殊处理 3 人同时相遇的情况,当且仅当轴线上下各有一个距离相同的人,之前也剩余了人没撞到。

阅读全文 »

A Treasure Hunt

格点 $(x_1,y_1)$ 是否能走到 $(x_2,y_2)$ ,模 $2$ 是否相等。

B Makes And The Product

给一个序列 $a_i$,求多少对 $(i,j,k)$ 使得 $a_i \cdot a_j \cdot a_k$ 最小。

排序之后特判 $a_0=a_1=a_2$和 $a_1=a_2$,组合数数一下。

C Really Big Numbers

求有多小于等于 $n$ 的数,其值和各位数和之差大于等于已知常数 $s$ 。

首先注意到,如果 $n$ 满足以上性质,若其个位数改为其本身一直到 9,差值不变,若发生进位,差值不增,所以 $\forall x \ge n$ 也满足上性质,因此可以二分。

D Imbalanced Array

定义一个序列的最大值最小值之差,求一个序列的所有连续子序列的差值之和。

可以分开计算最大值和最小值,通过类似单调队列的数据结构维护出一个位置左右能够掌管的长度即可。

时间复杂度:$O(n)$。

阅读全文 »

传送门:http://codeforces.com/gym/101933/problem/E

题面

奥术飞弹!

自己和对方场地分别有 $n,m$ 只随从($1 \le n,m \le 5$),已知每个随从的血量($1 \le hp \le 6$)。

求 $d$ 个奥术飞弹将对面场地清空的概率。

分析

概率状压 $dp$ 。

显然要状压 $dp$ 一下,但是状态数有 $7^{10}$ 好像不大可做?

但是注意到有类似于 $2,1,4$ 和 $2,4,1$ 之类的重复状态,因此对于所有状态压成一个字典序最小的 5 位数。

跑一下 dp 转移即可。

阅读全文 »

传送门:http://codeforces.com/gym/101933/problem/A

题面

井底之蛙想要跳出井底,已知井的深度 $d$。

给出 $n$ 个三元组 $(l_i,w_i,h_i)$ ,表示一只青蛙的跳跃高度,重量和高度。

每次青蛙可以一层一层叠成一个塔,那么最顶层的青蛙跳跃高度为 $ {l}_{i} + \sum h$,其中塔必须满足每层的青蛙重量必须大于上面所有青蛙的重量之和。每次叠成塔送顶层跳出去之后,可以立马重新堆一个新的塔送顶层青蛙跳出去。

问最多能送多少只青蛙出去。

分析

可以感觉到限制青蛙能否堆在一起跳出去的条件是重量限制。

先对三元组按照重量排序,倒着做,重量越大肯定越往后跳出去,最重的那个肯定最后一个跳出去。

然后处理倒数第二重的那个,他肯定至多倒数第二个跳出去,此时只剩最重的那个作为跳板跳出去,因此可以得出 $dp$ 状态。

令 $dp[i]$ 表示可以在放一个 $重量 < i$ 的青蛙在上面时,塔的最大高度。

转移方程:$dp[j]=max(dp[j+1],dp[j],dp[j+w_i]+h_i)$ ,其中 $1 \le j \le w_i$。

转移时更新答案,当且仅当 $dp[w_i+1] + l_i > d$ 。

边界条件:$dp[j]=h_0$,其中 $1 \le j \le w_0$。

这样时间复杂度显然是 $O(n \log n + n \max(w))$ ,好像不大可做啊?但是注意到题面 $\sum w \le 10^8$ ,那么实际上时间复杂度是 $O(n \log n + \sum w)$。

阅读全文 »