# Weekly Contest 409 日期 2024/08/04 只有寫出第一與第二題。這次太晚起床去撰寫題目,來不及改完 - [Design Neighbor Sum Service](https://leetcode.com/contest/weekly-contest-409/problems/design-neighbor-sum-service/) - [Shortest Distance After Road Addition Queries I](https://leetcode.com/contest/weekly-contest-409/problems/shortest-distance-after-road-addition-queries-i/) - [Shortest Distance After Road Addition Queries II](https://leetcode.com/contest/weekly-contest-409/problems/shortest-distance-after-road-addition-queries-ii/) - [Alternating Groups III](https://leetcode.com/contest/weekly-contest-409/problems/alternating-groups-iii/) ### 第一題 ```cpp vector<vector<int>> grid; neighborSum(vector<vector<int>>& grid) { this->grid = grid; } int adjacentSum(int value) { const int m = grid.size(); const int n = grid[0].size(); int i = 0; int j = 0; for(i = 0; i < m; i++) { for(j = 0; j < n; j++) { if(grid[i][j] == value) goto xx; } } xx: int dir[4][2] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}}; int ret = 0; for(int k = 0; k < 4; k++) { int x = dir[k][0] + i; int y = dir[k][1] + j; if(x < 0 || x >= m || y < 0 || y >= n) continue; ret += grid[x][y]; } return ret; } int diagonalSum(int value) { const int m = grid.size(); const int n = grid[0].size(); int i = 0; int j = 0; for(i = 0; i < m; i++) { for(j = 0; j < n; j++) { if(grid[i][j] == value) goto xx; } } xx: int dir[4][2] = {{1, -1}, {1, 1}, {-1, 1}, {-1, -1}}; int ret = 0; for(int k = 0; k < 4; k++) { int x = dir[k][0] + i; int y = dir[k][1] + j; if(x < 0 || x >= m || y < 0 || y >= n) continue; ret += grid[x][y]; } return ret; } ``` ### 第二題 ```cpp vector<int> shortestDistanceAfterQueries(int n, vector<vector<int>>& queries) { vector<int> ret; vector<vector<int>> indegree(n), outdegree(n); for(int i = 1; i < n; i++) { // indegree[n - i].push_back(n - i - 2); // cout << n - i - 1 << " " << n - i << endl; outdegree[n - i - 1].push_back(n - i); } for(vector<int> &q: queries) { vector<int> dp(n, -1); outdegree[q[0]].push_back(q[1]); int x = dfs(0, outdegree, dp); ret.push_back(x); } return ret; } int dfs(int start, vector<vector<int>> &outdegree, vector<int> &dp) { const int n = outdegree.size(); if(start == n - 1) return 0; if(dp[start] != -1) return dp[start]; int ret = n - 1; for(int x: outdegree[start]) { ret = min(ret, dfs(x, outdegree, dp) + 1); } dp[start] = ret; return ret; } ``` ### 第三題 稍微修改程式碼也是依然超時 #### TLE ```cpp vector<int> shortestDistanceAfterQueries(int n, vector<vector<int>>& queries) { vector<int> ret; vector<vector<int>> indegree(n), outdegree(n); for (int i = 1; i < n; i++) { // indegree[n - i].push_back(n - i - 2); // cout << n - i - 1 << " " << n - i << endl; outdegree[n - i - 1].push_back(n - i); } vector<int> dp(n, -1); for (vector<int>& q : queries) { outdegree[q[0]].push_back(q[1]); fill(dp.begin(), dp.begin() + q[0] + 1, -1); int x = dfs(0, outdegree, dp); ret.push_back(x); } return ret; } int dfs(int start, vector<vector<int>>& outdegree, vector<int>& dp) { const int n = outdegree.size(); if (start == n - 1) return 0; if (dp[start] != -1) return dp[start]; int ret = n - 1; for (int x : outdegree[start]) { ret = min(ret, dfs(x, outdegree, dp) + 1); } dp[start] = ret; return ret; } ``` #### 討論區解答 ```cpp vector<int> shortestDistanceAfterQueries(int n, vector<vector<int>>& queries) { vector<int> rr(n); iota(rr.begin(), rr.end(), 0); set<int> ss(rr.begin(), rr.end()); vector<int> ret; for(vector<int> &q: queries) { auto x = ss.lower_bound(q[0] + 1); auto y = ss.upper_bound(q[1] - 1); ss.erase(x, y); ret.push_back(ss.size() - 1); } return ret; } ``` ### 第四題