• 刷题记录(NC16884 食物链,NC51097 Parity game,NC235745 拆路)


    NC16884 食物链

    题目链接

    关键点:

    1、对于每个动物只有ABC三种可能,我们可以将三种可能情况都列出

    2、如果两个为同类,那么就可以直接连接(A-A,B-B,C-C),为吃的关系(A-B,B-C,C-A)

    3、判断是否有误,则看想反的情况是否有出现,比如对于同类的判断,如果(A-B||A-C)那么就为有误的判断,同理如果为吃,但是(A-A||A-C)那么就为有误的判断

    4、对于吃与被吃,同类都是可以传递的关系,因此用并查集

    完整代码

    1. # include
    2. using namespace std;
    3. int fa[50010*3];
    4. int n, k, cnt;
    5. int find(int x){
    6. return (fa[x]==x)? x: fa[x] = find(fa[x]);
    7. }
    8. void merge(int x, int y)
    9. {
    10. fa[find(x)] = find(y);
    11. }
    12. int main()
    13. {
    14. cin>>n>>k;
    15. for (int i=1; i<=n*3; i++)
    16. fa[i] = i;
    17. for (int i=1; i<=k; i++)
    18. {
    19. int d, x, y;
    20. cin>>d>>x>>y;
    21. if (x>n || y>n)
    22. {
    23. cnt++;
    24. continue;
    25. }
    26. if (d==1)
    27. {
    28. if (find(x)==find(y+n)||find(x)==find(y+2*n))
    29. cnt++;
    30. else
    31. {
    32. merge(x, y);
    33. merge(x+n, y+n);
    34. merge(x+2*n, y+2*n);
    35. }
    36. }
    37. else
    38. {
    39. if (find(x)==find(y)||find(x)==find(y+2*n))
    40. cnt++;
    41. else
    42. {
    43. merge(x, y+n);
    44. merge(x+n, y+n*2);
    45. merge(x+2*n, y);
    46. }
    47. }
    48. }
    49. cout<
    50. return 0;
    51. }

    NC51097 Parity game

    题目链接

    关键点:

    1、同样的,对于一个区间的奇偶性,比如区间(i,j)我们可以分为(0,i-1),(i,j)中的奇偶性,如果(i,j)奇偶性为偶,那么说明(0,i-1),(i,j)奇偶性相同,如果(i,j)奇偶性为奇,那么说明(0,i-1),(i,j)奇偶性不同,因此我们可以采取和食物链同样的做法,将是奇和偶都算一次

    2、对于如何维护前缀和,我们可以用undered_map来维护i-1和j,表示从开始到结束的奇偶性

    完整代码

    1. # include
    2. using namespace std;
    3. unordered_map<int, int>fa;
    4. int k, n;
    5. int find(int x)
    6. {
    7. return (fa[x]==x)? x: fa[x] = find(fa[x]);
    8. }
    9. void merge(int x, int y)
    10. {
    11. fa[find(x)] = find(y);
    12. }
    13. int main()
    14. {
    15. cin>>n>>k;
    16. int cnt = k;
    17. n++;
    18. for (int i=0; i
    19. {
    20. int x, y;
    21. string s;
    22. cin>>x>>y>>s;
    23. if (!fa.count(y)) fa[y]=y, fa[y+n]=y+n;
    24. if (!fa.count(x-1)) fa[x-1] = x-1, fa[x-1+n] = x-1+n;
    25. if (s[0] == 'e')
    26. {
    27. if (find(x-1) == find(y+n)||find(x+n-1)==find(y))
    28. {
    29. cnt = i;
    30. break;
    31. }
    32. else
    33. {
    34. merge(x-1, y);
    35. merge(x+n-1, y+n);
    36. }
    37. }
    38. else
    39. {
    40. if (find(x-1)==find(y)||find(x+n-1)==find(y+n))
    41. {
    42. cnt = i;
    43. break;
    44. }
    45. else
    46. {
    47. merge(x-1, y+n);
    48. merge(x+n-1, y);
    49. }
    50. }
    51. }
    52. cout<
    53. return 0;
    54. }

    NC235745 拆路

    题目链接

    关键点:

    1、对于要拆除的路,我们可以在一开始就将其不要建成,然后将所有的操作倒着来,碰到拆除的操作就为连边操作

    完整代码:

    1. # include
    2. using namespace std;
    3. const int N = 100000+10;
    4. int n, m, q;
    5. int fa[N];
    6. int cnt[N];
    7. map<int, int>mp;
    8. typedef pair<int, int> P;
    9. int r[N][3];
    10. set

      s;

    11. char qu[N];
    12. int ask[N];
    13. int d[N][3];
    14. stack<int>st;
    15. int find(int x)
    16. {
    17. if (fa[x] == x)
    18. return x;
    19. else
    20. return fa[x] = find(fa[x]);
    21. }
    22. void merge(int x, int y)
    23. {
    24. int f1 = find(x), f2 = find(y);
    25. if (f1!=f2)
    26. {
    27. if (cnt[f1]>cnt[f2])
    28. fa[f2] = f1;
    29. else
    30. fa[f1] = f2;
    31. }
    32. }
    33. int main()
    34. {
    35. cin>>n>>m;
    36. for (int i=1; i<=n; i++)
    37. {
    38. fa[i] = i;
    39. cin>>cnt[i];
    40. }
    41. for (int i=1; i<=m; i++)
    42. {
    43. int x, y;
    44. cin>>x>>y;
    45. r[i][0] = x;
    46. r[i][1] = y;
    47. }
    48. cin>>q;
    49. for (int i=1; i<=q; i++)
    50. {
    51. char c;
    52. cin>>c;
    53. qu[i] = c;
    54. if (c == 'Q')
    55. {
    56. int a;
    57. cin>>a;
    58. ask[i] = a;
    59. }
    60. else
    61. {
    62. int a, b;
    63. cin>>a>>b;
    64. s.insert(P{a, b});
    65. s.insert(P{b, a});
    66. d[i][0] = a;
    67. d[i][1] = b;
    68. }
    69. }
    70. for (int i=1; i<=m; i++)
    71. {
    72. if (s.find(P{r[i][0], r[i][1]})==s.end())
    73. {
    74. merge(r[i][0], r[i][1]);
    75. }
    76. }
    77. for (int i=q; i>=1; i--)
    78. {
    79. if (qu[i]=='Q')
    80. {
    81. int x = ask[i];
    82. st.push(cnt[find(x)]);
    83. }
    84. else
    85. {
    86. int x = d[i][0];
    87. int y = d[i][1];
    88. merge(x, y);
    89. }
    90. }
    91. while (!st.empty())
    92. {
    93. cout<top()<
    94. st.pop();
    95. }
    96. return 0;
    97. }

  • 相关阅读:
    springboot+敬老院管理系统 毕业设计-附源码161551
    【智能优化算法】基于倭黑猩猩优化算法求解单目标优化问题附matlab代码
    @JsonInclude(JsonInclude.Include.NON_NULL)注解
    5个例子学会Pandas中的字符串过滤
    【夯实Kafka知识体系及基本功】分析一下消费者(Consumer)实现原理分析「原理篇」
    MCE 产品发表高分文章锦集
    Centos Web Proxy(nginx)配置
    docer安装hadoop
    wpf devexpress 创建布局
    关于芯片的名词
  • 原文地址:https://blog.csdn.net/m0_60531106/article/details/126256849