当前位置:   article > 正文

Educational Codeforces Round 133 (Rated for Div. 2) C. Robot in a Hallway

Educational Codeforces Round 133 (Rated for Div. 2) C. Robot in a Hallway

题目

思路:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define pb push_back
  5. #define fi first
  6. #define se second
  7. #define lson p << 1
  8. #define rson p << 1 | 1
  9. const int maxn = 1e6 + 5, inf = 1e18, maxm = 4e4 + 5;
  10. const int N = sqrt(1e9) + 1;
  11. const int mod = 1e9 + 7;
  12. // const int mod = 998244353;
  13. //const __int128 mod = 212370440130137957LL;
  14. // int a[505][5005];
  15. // bool vis[505][505];
  16. int a[2][maxn], b[maxn];
  17. bool vis[maxn];
  18. string s;
  19. int n, m;
  20. struct Node{
  21. int val, id;
  22. bool operator<(const Node &u)const{
  23. return val < u.val;
  24. }
  25. };
  26. // Node c[maxn];
  27. int ans[maxn];
  28. int pre[maxn];
  29. int f[maxn][2]; //f[j][i]为从起点开始,蛇皮走位到第j列,第i行的最长等待时间
  30. int g[maxn][2];//g[j][i]为从(i,j)向右开始钩子走位,最后回到(i ^ 1, j)的最长等待时间
  31. //long long ? maxn ? n? m?
  32. void solve(){
  33. int res = 0;
  34. int q, k;
  35. cin >> m;
  36. // int mx = 0, mn = inf;
  37. for(int i = 0; i < 2; i++){
  38. for(int j = 1; j <= m; j++){
  39. cin >> a[i][j];
  40. }
  41. }
  42. //设在起点等待时间为t,到达(i, j)是第k个到达的格子,那么若t + k >= a[i][j] + 2 - k,
  43. //(题解为t + k >= a[i][j] + 1, 是因为最后题解答案 + 2 * m,实际是2 * m - 1)
  44. //则在起点等待t秒后,不考虑其他格子的话,可以顺利到达格子(i, j)
  45. f[0][0] = f[0][1] = -inf;
  46. f[1][0] = 0;//起点比较特殊,不适用 t + k >= a[i][j] + 2 - k, 单独更新
  47. f[1][1] = a[1][1] + 2 - 2;//顺便更新掉
  48. g[m + 1][0] = g[m + 1][1] = -inf;
  49. for(int j = 2; j <= m; j++){
  50. f[j][j % 2] = max({f[j - 1][(j - 1) % 2], a[j % 2][j] + 2 - 2 * j, a[j % 2 ^ 1][j] + 2 - (2 * j - 1)});
  51. // cout << j << ' ' << j % 2 << ' ' << f[j][j % 2] << '\n';
  52. }
  53. for(int i = 0; i < 2; i++){
  54. for(int j = m; j >= 2; j--){//注意j >= 2, 因为当j == 1时,整个路径为钩子,就牵扯到起点,得单独更新
  55. g[j][i] = max({g[j + 1][i] - 1, a[i][j] + 2 - 1, a[i ^ 1][j] + 2 - 2 * (m - j + 1)});
  56. // cout << j << ' ' << i << ' ' << g[j][i] << '\n';
  57. }
  58. }
  59. res = inf;
  60. for(int j = 1; j <= m; j++){
  61. int tmp = max({0LL, f[j][j % 2], g[j + 1][j % 2] - 2 * j});//拼接 蛇和钩子
  62. res = min(res, tmp);
  63. }
  64. res = min(res, max({0LL, g[2][0] - 1, a[1][1] + 2 - (2 * m)}));//考虑整个路径为钩子的情况
  65. cout << res + 2 * m - 1 << '\n';
  66. }
  67. signed main(){
  68. ios::sync_with_stdio(0);
  69. cin.tie(0);
  70. int T = 1;
  71. cin >> T;
  72. while (T--)
  73. {
  74. solve();
  75. }
  76. return 0;
  77. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/365859?site=
推荐阅读
相关标签
  

闽ICP备14008679号