A. Rikka with Minimum Spanning Trees

题意:

给出一个图,求最小生成树的个数和权值

思路:

因为数据随机,只有一个MST

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ull unsigned long long
  5. ull k1, k2;
  6. const ull MOD = (ull)1e9 + ;
  7. int t, n, m;
  8.  
  9. ull f()
  10. {
  11. ull k3 = k1, k4 = k2;
  12. k1 = k4;
  13. k3 ^= k3 << ;
  14. k2 = k3 ^ k4 ^ (k3 >> ) ^ (k4 >> );
  15. return k2 + k4;
  16. }
  17.  
  18. struct Edge
  19. {
  20. int u, v; ull w;
  21. Edge() {}
  22. Edge(int u, int v, ull w) : u(u), v(v), w(w) {}
  23. bool operator < (const Edge &other) const { return w < other.w; }
  24. }edge[];
  25.  
  26. int fa[];
  27. int find(int x) { return fa[x] == ? x : fa[x] = find(fa[x]); }
  28.  
  29. void Kruskal()
  30. {
  31. memset(fa, , sizeof fa);
  32. sort(edge + , edge + + m);
  33. int cnt = ;
  34. ull res = ;
  35. for (int i = ; i <= m; ++i)
  36. {
  37. int u = edge[i].u, v = edge[i].v; ull w = edge[i].w;
  38. // cout << i << " " << w << endl;
  39. int fu = find(u), fv = find(v);
  40. if (fu == fv) continue;
  41. ++cnt;
  42. res = (res + w) % MOD;
  43. fa[fu] = fv;
  44. if (cnt == n) break;
  45. }
  46. if (cnt != n) res = ;
  47. printf("%llu\n", res);
  48. }
  49.  
  50. int main()
  51. {
  52. scanf("%d", &t);
  53. while (t--)
  54. {
  55. scanf("%d%d%llu%llu", &n, &m, &k1, &k2);
  56. for (int i = ; i <= m; ++i)
  57. {
  58. edge[i].u = f() % n + ;
  59. edge[i].v = f() % n + ;
  60. edge[i].w = f();
  61. // cout << edge[i].u << " " << edge[i].v << " " << edge[i].w << endl;
  62. }
  63. Kruskal();
  64. }
  65. return ;
  66. }

G. Rikka with Intersections of Paths

题意:

给出一棵树,以及$m条简单路径,求从这些简单路径中选出k条,有多少种不同方式使得路径交至少为1$

思路:

枚举路径交的$LCA$, 对于一个点来说,它的贡献是,所有经过它的路径假设为$x$

那么有$C_x^k$ 但是对于一些路径的$LCA不是它,那么这些路径中选出k条的贡献肯定在他们所在的LCA处被计算$

所以应该被减去,也就是说假设经过它但是$LCA不是它的路径条数假设为y条$

那么需要减去$C_y^k$

最终贡献为$C_x^k - C_y^k$

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define N 300010
  6. const ll MOD = (ll)1e9 + ;
  7. int t, n, m, k;
  8. vector <int> G[N];
  9.  
  10. int fa[N], deep[N], sze[N], son[N], top[N];
  11. void DFS(int u)
  12. {
  13. sze[u] = ;
  14. for (auto v : G[u]) if (v != fa[u])
  15. {
  16. fa[v] = u;
  17. deep[v] = deep[u] + ;
  18. DFS(v);
  19. sze[u] += sze[v];
  20. if (!son[u] || sze[v] > sze[son[u]]) son[u] = v;
  21. }
  22. }
  23.  
  24. void getpos(int u, int sp)
  25. {
  26. top[u] = sp;
  27. if (!son[u]) return;
  28. getpos(son[u], sp);
  29. for (auto v : G[u]) if (v != fa[u] && v != son[u])
  30. getpos(v, v);
  31. }
  32.  
  33. int querylca(int u, int v)
  34. {
  35. while (top[u] != top[v])
  36. {
  37. if (deep[top[u]] < deep[top[v]]) swap(u, v);
  38. u = fa[top[u]];
  39. }
  40. return deep[u] > deep[v] ? v : u;
  41. }
  42.  
  43. int cnt[N], tag[N];
  44. void add(int u)
  45. {
  46. for (auto v : G[u]) if (v != fa[u])
  47. {
  48. add(v);
  49. cnt[u] += cnt[v];
  50. }
  51. }
  52.  
  53. ll fac[N], inv[N];
  54. ll qmod(ll base, ll n)
  55. {
  56. ll res = ;
  57. while (n)
  58. {
  59. if (n & ) res = (res * base) % MOD;
  60. base = (base * base) % MOD;
  61. n >>= ;
  62. }
  63. return res;
  64. }
  65.  
  66. void init()
  67. {
  68. fac[] = ;
  69. for (int i = ; i <= ; ++i) fac[i] = (fac[i - ] * i) % MOD;
  70. inv[] = qmod(fac[], MOD - );
  71. for (int i = ; i >= ; --i) inv[i - ] = (inv[i] * i) % MOD;
  72. }
  73.  
  74. ll C(int n, int m)
  75. {
  76. if (m > n) return ;
  77. return fac[n] * inv[m] % MOD * inv[n - m] % MOD;
  78. }
  79.  
  80. int main()
  81. {
  82. init();
  83. scanf("%d", &t);
  84. while (t--)
  85. {
  86. scanf("%d%d%d", &n, &m, &k);
  87. for (int i = ; i <= n; ++i) G[i].clear(), son[i] = , cnt[i] = , tag[i] = ;
  88. for (int i = , u, v; i <= n - ; ++i)
  89. {
  90. scanf("%d%d", &u, &v);
  91. G[u].push_back(v);
  92. G[v].push_back(u);
  93. }
  94. DFS(); getpos(, );
  95. for (int i = , u, v; i <= m; ++i)
  96. {
  97. scanf("%d%d", &u, &v);
  98. int lca = querylca(u, v);
  99. ++tag[lca];
  100. ++cnt[u];
  101. ++cnt[v];
  102. --cnt[lca];
  103. if (fa[lca]) --cnt[fa[lca]];
  104. }
  105. add();
  106. ll res = ;
  107. for (int i = ; i <= n; ++i) res = (res + C(cnt[i], k) - C(cnt[i] - tag[i], k) + MOD) % MOD;
  108. printf("%lld\n", res);
  109. }
  110. return ;
  111. }

2018-2019 ACM-ICPC, Asia Xuzhou Regional Contest Solution的更多相关文章

  1. ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków

    ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków Problem A: Rubik’s Rect ...

  2. 2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred)

    2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred) easy: ACE ...

  3. 2019 ICPC Asia Xuzhou Regional

    目录 Contest Info Solutions A. Cat B. Cats line up C. <3 numbers E. Multiply F. The Answer to the U ...

  4. 2018-2019, ICPC, Asia Yokohama Regional Contest 2018 K

    传送门:https://codeforces.com/gym/102082/attachments 题解: 代码: /** * ┏┓ ┏┓ * ┏┛┗━━━━━━━┛┗━━━┓ * ┃ ┃ * ┃ ━ ...

  5. 2018 ICPC Asia Jakarta Regional Contest

    题目传送门 题号 A B C D E F G H I J K L 状态 Ο . . Ο . . Ø Ø Ø Ø . Ο Ο:当场 Ø:已补 .  :  待补 A. Edit Distance Thin ...

  6. Gym - 101981K The 2018 ICPC Asia Nanjing Regional Contest K.Kangaroo Puzzle 暴力或随机

    题面 题意:给你1个20*20的格子图,有的是障碍有的是怪,你可以每次指定上下左右的方向,然后所有怪都会向那个方向走, 如果2个怪撞上了,就融合在一起,让你给不超过5w步,让所有怪都融合 题解:我们可 ...

  7. Gym - 101981M The 2018 ICPC Asia Nanjing Regional Contest M.Mediocre String Problem Manacher+扩增KMP

    题面 题意:给你2个串(长度1e6),在第一个串里找“s1s2s3”,第二个串里找“s4”,拼接后,是一个回文串,求方案数 题解:知道s1和s4回文,s2和s3回文,所以我们枚举s1的右端点,s1的长 ...

  8. Gym - 101981G The 2018 ICPC Asia Nanjing Regional Contest G.Pyramid 找规律

    题面 题意:数一个n阶三角形中,有多少个全等三角形,n<=1e9 题解:拿到题想找规律,手画开始一直数漏....,最后还是打了个表 (打表就是随便定个点为(0,0),然后(2,0),(4,0), ...

  9. Gym - 101981I The 2018 ICPC Asia Nanjing Regional Contest I.Magic Potion 最大流

    题面 题意:n个英雄,m个怪兽,第i个英雄可以打第i个集合里的一个怪兽,一个怪兽可以在多个集合里,有k瓶药水,每个英雄最多喝一次,可以多打一只怪兽,求最多打多少只 n,m,k<=500 题解:显 ...

随机推荐

  1. /etc/hostname

    我们可以使用 hostname 命令来修改主机名,但只是临时生效,如果想永久生效可以编辑 /etc/hostname 文件,注意不是每个 Linux 发行版都有该文件 root@Ubuntu_Lee: ...

  2. mac 操作idea快捷键

    http://blog.csdn.net/rainytooo/article/details/51469126 在mac下idea的常用快捷键如下,下面的快捷键都亲自试用,并有一些和eclipse对比 ...

  3. 如何在HTML中播放flash

    随着html的风靡,改变了之前前端的许多条条框框,而video的出现使flash仿佛都要退出历史的舞台了,但是h5也会出现以下局限性,比如说,在一些不支持h5的浏览器上,此处省略一万只草泥马..... ...

  4. php学习四:数组(一)

    1.  直接赋值方式: ①   索引数组:以索引来存储数据,内存不是连续的,但是js中的内存是连续的 代码如下: $array[0] = "11"; $array[1] = &qu ...

  5. PyQt4开关按钮ToggleButton

    PyQt4没有开关按钮部件.但是我们可以使用在特殊状态下的QPushButton部件来创建开关按钮.而所谓的开关按钮就是一个具有按下和未按下两种状态的普通赶牛.用户可以通过单击按钮来切换其开或者关的状 ...

  6. 【HTML】改变鼠标样式图片css

    你需要一张图   .ico 的 格式 如果一开始你要解决的是怎么去用png 格式图片转成 ICO格式 先做一张32*32的PNG格式图片 然后 打开http://www.easyicon.net/co ...

  7. Python 中的线程-进程1

    原文:https://www.cnblogs.com/i-honey/p/8042047.html 1. 并行和并发 并行:同时做某些事,可以互不干扰的同一时刻做几件事. 并发:也是同时做某些事,但是 ...

  8. 一个Activity中使用两个layout实例

    package com.sbs.aas2l; import android.app.Activity; import android.os.Bundle; import android.view.Vi ...

  9. jpa关联映射(一)

    开发中常用到数据表的关联(其实很难遇到..),spring-data-jpa(其实是hibernate)提供了一整套十分方便的注解来供我们使用表关联功能. OneToOne OneToMany Man ...

  10. MySQL 5.6 my.cnf 参数说明(转)

    # 以下选项会被MySQL客户端应用读取. # 注意只有MySQL附带的客户端应用程序保证可以读取这段内容. # 如果你想你自己的MySQL应用程序获取这些值. # 需要在MySQL客户端库初始化的时 ...