题目连接
代码连接
题解
A. Journey Planning
题意:输入 n n n个数 b i b_i bi,要求找到一个 b b b的一个子序列 b c 1 , b c 2 . . . b c k b_{c_1},b_{c_2}...b_{c_k} bc1,bc2...bck,使得 c i + 1 − c i = b c i + 1 − b c i c_{i+1}-c_i=b_{c_{i+1}}-b_{c_i} ci+1−ci=bci+1−bci的同时,子序列的综合最大,输出最大值
数据范围: n ≤ 2 × 1 0 5 , b i ≤ 4 × 1 0 5 n \leq 2 \times10^5, b_i \leq 4 \times10^5 n≤2×105,bi≤4×105
题解:对于每个 i i i, s [ b i − i ] + = b i s[b_i-i]+=b_i s[bi−i]+=bi,之后s中的最大值便为答案
B. Navigation System
题意:给一个有向图,每条边长度为1。开始给定一条从 s s s到 t t t的路径。有一个导航仪,每次从一个点到另一个点,如果走的路径是导航仪给的路径,则导航仪导航线路不变,否则导航仪会重新从新的节点出发找一条到达 t t t的最短路径。问从 s s s到 t t t的过程中,导航仪最少/最多修改多少次路径。
数据范围: 2 ≤ n , m ≤ 2 × 1 0 5 2\leq n,m \leq 2 \times 10^5 2≤n,m≤2×105,给定的 s s s到 t t t的路径保证没有重点
题解:从终点开始沿向边bfs,找到所有点到终点的最短路径长度 d [ i ] d[i] d[i]。对于路径上的每一小段 u → v u \rightarrow v u→v
如果
d
[
v
]
!
=
d
[
u
]
+
1
d[v]!=d[u]+1
d[v]!=d[u]+1,则最小次数++
如果存在超过一个
w
w
w,使得
d
[
w
]
=
=
d
[
u
]
+
1
d[w]==d[u]+1
d[w]==d[u]+1或者只有一个
w
w
w使得
d
[
w
]
=
=
d
[
u
]
+
1
d[w]==d[u]+1
d[w]==d[u]+1但
w
!
=
v
w!=v
w!=v,则最大次数++
C. World of Darkraft: Battle for Azathoth
题意:有 n n n种武器和 m m m种防具,每种武器攻击力为 a i a_i ai,花费为 c a i ca_i cai,每种防具防御力为 b i b_i bi,花费为 c b i cb_i cbi。有 p p p种怪物,每种怪物的防御力为 x i x_i xi,攻击力为 y i y_i yi,获得的收益为 z i z_i zi。现在要挑一个武器和一个防具去打怪物。能打过的怪物为
问最大能获得的利润(总收益-总花费)
数据范围: 1 ≤ n , m , p ≤ 2 × 1 0 5 , 1 ≤ a i , b i , x i , y i ≤ 1 0 6 , 1 ≤ c a i , c b i ≤ 1 0 9 , 1 ≤ z i ≤ 1 0 3 1 \leq n,m,p \leq 2 \times 10^5,1 \leq a_i, b_i, x_i, y_i \leq 10^6,1 \leq ca_i, cb_i \leq 10^9, 1 \leq z_i \leq 10^3 1≤n,m,p≤2×105,1≤ai,bi,xi,yi≤106,1≤cai,cbi≤109,1≤zi≤103
题解:按武器的攻击力从小到大枚举,将防御力小于当前枚举武器攻击力的怪物加入集合。那么现在只需要考虑选择哪个防具利润最高。每个防具的利润为集合中所有攻击力小于该防具防御力的怪物的收益之和减去防具的花费。使用线段树维护防御力。每加入一个怪物,相当于对线段树上1到该怪物攻击力量的点增加收益。询问就是问整个区间最大值。防具的花费在建立线段树的时候初始化进去,收益相当于附负数。有些防御力的值没有对应防具,收益为负无穷。
PS:初始化的时候注意,对于防御力相同的防具,选择花费较低的防具。
D. Reachable Strings
题意:给定一个长度为 n n n的 01 01 01字符串,一次操作可以将一段连续的‘011’翻转成‘110’或者将‘110‘翻转成’011‘。之后 q q q个询问,每次询问给定字符串中两个相同长度的子串。问是否可以通过一系列操作,将其中一个子串转化为另一个子串。
数据范围: 1 ≤ n ≤ 2 × 1 0 5 , 1 ≤ q ≤ 2 × 1 0 5 1 \leq n \leq 2 \times 10^5,1 \leq q \leq 2 \times 10^5 1≤n≤2×105,1≤q≤2×105
题解:通过观察我们发现,如果某一段连续的1的个数为偶数个,那么这段1可以两两一组被移动到任意位置,如果某一段中含有奇数个1,那么不论怎么移动。这一段中的1的个数永远是奇数。猜测结论:首先两个串01个数需要相同,其次,对于每个0来说,统计其前面1的个数的奇偶性。如果两个串的每个0奇偶性都相同,则可以相互变化,否则不行。
具体做法,可以使用hash判断两个奇偶串是否相同,hash使用三进制双hash即可
PS:如果两个串前面的1的个数奇偶性不同,需要翻转就行求hash
E. Treeland and Viruses
题意:给定一棵 n n n个节点的树,以及q个询问,每个询问给出 k i k_i ki个病毒和 m i m_i mi个重要城市。开始的时候每种病毒会在某些城市,并且每中病毒拥有自己的传播速度。在每轮传播中,从1号病毒开始到 k i k_i ki号病毒轮流传播。每次传播,如果某个城市 y y y与一个已被该病毒感染的城市距离小于等于该病毒的传播速度,并且中间没有被其他病毒感染的城市,那么这个城市 y y y就会感染该病毒。问最后这些重要城市分别被几号病毒感染。
数据范围: 1 ≤ n , q ≤ 2 × 1 0 5 , ∑ i = 1 q k i , ∑ i = 1 q m i ≤ 2 × 1 0 5 1 \leq n, q \leq 2\times10^5,\sum_{i=1}^q k_i,\sum_{i=1}^q m_i \leq 2\times10^5 1≤n,q≤2×105,∑i=1qki,∑i=1qmi≤2×105
题解:因为多组询问,不能每次都遍历整棵树。所以建立压缩树,压缩树就是把所有关键点和关键点两两的LCA加入早树中。做法为首先遍历树,得到所有点的dfs序,之后把所有关键点按dfs序排序。之后把相邻dfs序的两点的LCA加入关键点集合,去重,再按dfs序排序。之后每个点向离自己最近的祖先节点建边得到压缩树。
得到压缩树之后我通过树形dp寻找最优解,每个节点染上的病毒只可能是自己原本的或者从孩子节点的某一个传上来或者从父节点传下来。树形dp解决自下而上的传播,再dfs一次解决自上而下的传播即可。
F. Blocks and Sensors
题意:给定一个 n × m × k n \times m \times k n×m×k的三位空间,给定从6个方向看到的视图,视图中包含每个块的颜色情况。问是否存在一种在空间中放置有色 1 × 1 × 1 1\times1\times1 1×1×1小方块的方法,使得6个方向的视图为给定的视图
数据范围: 1 ≤ n × m × k ≤ 2 × 1 0 5 1 \leq n \times m \times k \leq 2\times10^5 1≤n×m×k≤2×105
题解:先假设所有方块都在表面上,然后向各自方向推。需要讨论每个方块放的位置是否可行,多个方块被推到同一位置,是合并成一个方块还是否继续往后退还是保留一个其余继续往后退。讨论清楚即可。(写的时候情况挺多挺晕的。。。)