1+ /*
2+ * @Author: LetMeFly
3+ * @Date: 2024-11-20 12:11:48
4+ * @LastEditors: LetMeFly.xyz
5+ * @LastEditTime: 2024-11-20 12:56:12
6+ */
7+ #ifdef _WIN32
8+ #include " _[1,2]toVector.h"
9+ #endif
10+
11+ /*
12+ 每个点记录“自己跃迁到的点”
13+ 初始值每个点能跃迁到的点都是自己的下一个节点
14+
15+ 新来一条“跃迁通道”有两种可能:
16+ + 被一条更长(或等长)的跃迁通道覆盖
17+ + 覆盖n条跃迁通道
18+ 反正不可能和其他跃迁通道有交叉
19+ 两种情况的判断方式是“跃迁起点”指向的“能跃迁到的点”是否大于(等于)自己的“跃迁终点”
20+ + 对于第一种情况:直接continue
21+ + 对于第二种情况:修改所有“最大被覆盖子跃迁通道”的起点的“能跃迁到的点”
22+ */
23+ #ifdef TirstTry // WA
24+ class Solution {
25+ public:
26+ vector<int > shortestDistanceAfterQueries (int n, vector<vector<int >>& queries) {
27+ vector<int > transitionTo (n);
28+ for (int i = 0 ; i < n; i++) {
29+ transitionTo[i] = i + 1 ;
30+ }
31+ int transitionToEndTimes = n - 1 ;
32+ vector<int > ans (queries.size ());
33+ for (int i = 0 ; i < queries.size (); i++) {
34+ int from = queries[i][0 ], to = queries[i][1 ];
35+ while (transitionTo[from] < to) {
36+ int originalTo = transitionTo[from];
37+ transitionToEndTimes -= originalTo - from;
38+ transitionTo[from] = to;
39+ from = originalTo;
40+ }
41+ ans[i] = transitionToEndTimes;
42+ }
43+ return ans;
44+ }
45+ };
46+ #else // TirstTry
47+ #ifdef SecondTry // WA
48+ class Solution {
49+ public:
50+ vector<int > shortestDistanceAfterQueries (int n, vector<vector<int >>& queries) {
51+ vector<int > transitionTo (n);
52+ for (int i = 0 ; i < n; i++) {
53+ transitionTo[i] = i + 1 ;
54+ }
55+ int transitionToEndTimes = n - 1 ;
56+ vector<int > ans (queries.size ());
57+ for (int i = 0 ; i < queries.size (); i++) {
58+ int from = queries[i][0 ], to = queries[i][1 ];
59+ int originalJumpTimes = 0 ;
60+ while (transitionTo[from] <= to) {
61+ originalJumpTimes++;
62+ int originalTo = transitionTo[from];
63+ transitionTo[from] = to;
64+ from = originalTo;
65+ }
66+ transitionToEndTimes -= originalJumpTimes - 1 ;
67+ ans[i] = transitionToEndTimes;
68+ }
69+ return ans;
70+ }
71+ };
72+ #else // SecondTry
73+ #ifdef ThirdTry // AC
74+ class Solution {
75+ public:
76+ vector<int > shortestDistanceAfterQueries (int n, vector<vector<int >>& queries) {
77+ vector<int > transitionTo (n);
78+ for (int i = 0 ; i < n; i++) {
79+ transitionTo[i] = i + 1 ;
80+ }
81+ int transitionToEndTimes = n - 1 ;
82+ vector<int > ans (queries.size ());
83+ for (int i = 0 ; i < queries.size (); i++) {
84+ int from = queries[i][0 ], to = queries[i][1 ];
85+ int originalJumpTimes = 0 ;
86+ while (transitionTo[from] <= to) {
87+ originalJumpTimes++;
88+ int originalTo = transitionTo[from];
89+ transitionTo[from] = to;
90+ from = originalTo;
91+ }
92+ transitionToEndTimes -= max (0 , originalJumpTimes - 1 );
93+ ans[i] = transitionToEndTimes;
94+ }
95+ return ans;
96+ }
97+ };
98+ #else // ThirdTry
99+ // FourthTry // 简化版 // 执行用时分布:2ms,击败98.51%;消耗内存分布:108.84MB,击败83.86%.
100+ class Solution {
101+ public:
102+ vector<int > shortestDistanceAfterQueries (int n, vector<vector<int >>& queries) {
103+ vector<int > transitionTo (n), ans (queries.size ());
104+ for (int i = 0 ; i < n; i++) {
105+ transitionTo[i] = i + 1 ;
106+ }
107+ int transitionToEndTimes = n - 1 ;
108+ for (int i = 0 ; i < queries.size (); i++) {
109+ int from = queries[i][0 ], to = queries[i][1 ], now = from;
110+ while (transitionTo[now] < to) {
111+ transitionToEndTimes--;
112+ int originalTo = transitionTo[now];
113+ transitionTo[now] = to;
114+ now = originalTo;
115+ }
116+ ans[i] = transitionToEndTimes;
117+ }
118+ return ans;
119+ }
120+ };
121+ #endif // ThirdTry
122+ #endif // SecondTry
123+ #endif // TirstTry
0 commit comments