• Codeforces Round #787 (Div. 3) F. Vlad and Unfinished Business


    翻译:

    Vlad和Nastya住在一个由𝑛房子和𝑛−1路组成的城市。从每一个房子,你只需要沿着路走就可以到达另一个。也就是说,城市是一棵树。

    弗拉德住在索引为𝑥的房子里,娜斯提亚住在索引为𝑦的房子里。弗拉德决定去拜访娜斯提亚。然而,他想起他已经推迟了𝑘他必须在来纳斯提亚之前做的事情。要做𝑖-th的事情,他需要来𝑎𝑖-th的房子,事情可以按任何顺序进行。在1分钟内,他可以从一个房子走到另一个房子,如果他们有道路相连。

    弗拉德不太喜欢走路,所以他很感兴趣的是他最少要在路上花多少分钟才能完成所有的事情,然后才能到达纳斯提亚。房子𝑎1,𝑎2,…,𝑎𝑘他可以按任何顺序访问。他可以多次访问任何房子(如果他想)。

    输入
    第一行输入包含一个整数𝑡(1≤𝑡≤104)—输入测试用例的数量。在每个测试用例之前都有一个空行。

    每个测试用例的第一行分别包含两个整数𝑛和𝑘(1≤𝑘≤𝑛≤2⋅105)——房子和东西的数量。

    每个测试用例的第二行包含两个整数𝑥和𝑦(1≤𝑥,𝑦≤𝑛)——分别是Vlad和Nastya居住的房子的指数。

    每个测试用例的第三行包含𝑘整数𝑎1,𝑎2,…,𝑎𝑘(1≤𝑎𝑖≤𝑛)-房子Vlad需要来做的事情的指数。

    以下的𝑛−1行包含城市的描述,每一行包含两个整数𝑣𝑗和𝑢𝑗(1≤𝑢𝑗,𝑣𝑗≤𝑛)——通过道路𝑗连接的房屋的指数。

    保证所有案例𝑛的总和不超过2⋅105。

    输出
    输出𝑡行,每一行都包含输入的相应测试用例的答案。作为一个答案输出单个整数- Vlad在路上做所有事情和到达Nastya所需的最小分钟数。

    例子
    inputCopy
    3.

    3个1
    1 3
    2
    1 3
    1 2

    6 4
    3个5
    1 6 2 1
    1 3
    3 4
    3个5
    5个6
    5个2

    6 - 2
    3 - 2
    5个3
    1 3
    3 4
    3个5
    5个6
    5个2
    outputCopy
    3.
    7
    2
    请注意
    树和第一个测试用例的最佳路径:

    1→2→1→3
    树和第二个测试用例的最佳路径:

    3→1→3→5→2→5→6→5
    树和第三个测试用例的最佳路径:

    3→5→2

    思路:x——>y,要先经过k个点。是道结论题,如果k中有点在x——>y的路径上,就只需要跑一次,不需要回头,如果点不在x——>y的路径上,就需要回头跑两次。画下图,大概就可以理解了。然后我们直接建树+标记+dfs,最后根据每个路径跑一次还是两次,进行加和即可。

    代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. using namespace::std;
    15. typedef long long ll;
    16. int n,t;
    17. inline __int128 read(){
    18. __int128 x = 0, f = 1;
    19. char ch = getchar();
    20. while(ch < '0' || ch > '9'){
    21. if(ch == '-')
    22. f = -1;
    23. ch = getchar();
    24. }
    25. while(ch >= '0' && ch <= '9'){
    26. x = x * 10 + ch - '0';
    27. ch = getchar();
    28. }
    29. return x * f;
    30. }
    31. inline void print(__int128 x){
    32. if(x < 0){
    33. putchar('-');
    34. x = -x;
    35. }
    36. if(x > 9)
    37. print(x / 10);
    38. putchar(x % 10 + '0');
    39. }
    40. vector<int>q[200005];
    41. //int a[200005];
    42. bool fir[200005];
    43. bool sec[200005];
    44. int k,cx,cy,ww,qq;
    45. void dfs(int now,int fa){
    46. for (int i =0; isize(); i++) {
    47. if (q[now][i]==fa) {
    48. continue;
    49. }
    50. dfs(q[now][i], now);
    51. if (fir[q[now][i]]) {
    52. fir[now]=true;
    53. }else if (sec[q[now][i]]){
    54. sec[now]=true;
    55. }
    56. }
    57. }
    58. void solv(){
    59. cin>>n>>k>>cx>>cy;
    60. for (int i =0; i<=n; i++) {
    61. fir[i]=sec[i]=false;
    62. q[i].clear();
    63. }
    64. fir[cy]=true;
    65. for (int i =1; i<=k; i++) {
    66. cin>>ww;
    67. sec[ww]=true;
    68. }
    69. ll ans=0;
    70. for (int i =1; i
    71. cin>>qq>>ww;
    72. q[qq].push_back(ww);
    73. q[ww].push_back(qq);
    74. }
    75. dfs(cx, cx);
    76. // for (int i =1; i<=n; i++) {
    77. // if (fir[i]) {
    78. // printf("%d ",i);
    79. // }
    80. //
    81. // }
    82. for (int i =1; i<=n; i++) {
    83. if (i==cx) {
    84. continue;
    85. }
    86. if (fir[i]) {
    87. ans++;
    88. }
    89. else if(sec[i])
    90. ans+=2;
    91. }
    92. printf("%lld\n",ans);
    93. }
    94. int main(){
    95. ios::sync_with_stdio(false);
    96. cin.tie(); cout.tie();
    97. cin>>t;
    98. while (t--) {
    99. solv();
    100. }
    101. return 0;
    102. }

  • 相关阅读:
    【python毕业设计源码】汽车销售系统
    介绍分布式锁
    SpringBoot+Redis BitMap 实现签到与统计功能
    【vue2+avue】实现文件上传 技术栈用的是kkfileview
    脑影像独立成分分析(ICA)的自动化流程
    亚马逊un38.3报告电池检测,un38.3认证是什么?
    java-net-php-python-jspm广西壮家缘食府餐饮计算机毕业设计程序
    Clickhouse冷热配置
    * 论文笔记 【OffDQ: An Offline Deep Learning Framework for QoS Prediction】
    R语言绘制时间序列的自相关函数图:使用acf函数可视化时间序列数据的自相关系数图
  • 原文地址:https://blog.csdn.net/weixin_63555280/article/details/128195037