会员专享
请先
登录,登录后可使用今日免费解锁;
开通会员后可解锁完整内容。
解题思路
本题考查按边下标顺序的图上 DP,并用树状数组维护前缀最大值。p,q≤2×105,需要接近线性的做法。
- 下标必须递增,因此只需按输入顺序处理每条衔接,不会形成可用的环。
- 设当前衔接为 x→y、分值 s。它单独成链时长度为 1;若存在一条已处理、终点为 x、最后分值小于 s 的链,则可接在后面,长度为「该链边数 +1」。
- 对每个节点维护「以该点为终点、最后分值为某值」的最大边数。询问的是分值严格小于 s 的最大值,插入的是当前链的 (s, 边数)。
- 把每个节点入边分值离散化后,用树状数组维护前缀 max。整张图上树状数组长度之和为 O(q)。
- 自环、重边按同样规则处理;分值相等时不能相接。
题目内容
助手技能编排时,系统里有 p 个技能节点(编号 1 到 p)和 q 条有向衔接。衔接按记录顺序给出:第 i 条从节点 xi 指向 yi,分值为 si。图中可以有自环和重边。
需要选一条由衔接组成的技能执行链,使包含的边数尽量多。链必须同时满足:
- 记录下标严格递增:若先用第 i 条衔接,下一条必须是某个 j>i。
- 分值严格递增:后一条的 s 必须大于前一条的 s。
请给出这样一条链最多能包含多少条边。
输入描述
首先一行两个整型 p 和 q(1≤p,q≤200000),表示节点数与衔接数。
随后 q 行,第 i 行三个整型 xi,yi,si(1≤xi,yi≤p,0≤si≤200000),表示一条 xi→yi、分值为 si 的有向衔接。
输出描述
写出一个非负整型,即最长合法执行链的边数。
样例1
输入
2 3
1 2 4
2 1 5
1 2 6
输出
3
说明
三条衔接分值 4<5<6,且终点接起点:1→2→1→2,下标也递增,故边数为 3。
样例2
输入
4 4
2 1 3
1 3 1
3 4 2
4 2 4
输出
3
说明
链 1→3→4→2 使用第 2、3、4 条衔接,分值 1<2<4。不能再接第 1 条 2→1,因为它在输入中更早出现。