Contest Info


[Practice Link](https://atcoder.jp/contests/abc133/tasks)

Solved A B C D E F
6/6 O O O O O O
  • O 在比赛中通过
  • Ø 赛后通过
  • ! 尝试了但是失败了
  • - 没有尝试

Solutions


A. T or T

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main() {
  4. int n, a, b;
  5. while (cin >> n >> a >> b) {
  6. cout << min(n * a, b) << "\n";
  7. }
  8. return 0;
  9. }

B.Good Distance

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define N 110
  4. int n, d, x[N][N];
  5. int dis(int i, int j) {
  6. int res = 0;
  7. for (int o = 1; o <= d; ++o) {
  8. res += (x[i][o] - x[j][o]) * (x[i][o] - x[j][o]);
  9. }
  10. return res;
  11. }
  12. int main() {
  13. set <int> se; se.insert(0);
  14. for (int i = 1; i <= 30000; ++i) {
  15. se.insert(i * i);
  16. }
  17. while (scanf("%d%d", &n, &d) != EOF) {
  18. for (int i = 1; i <= n; ++i) {
  19. for (int j = 1; j <= d; ++j) {
  20. scanf("%d", x[i] + j);
  21. }
  22. }
  23. int res = 0;
  24. for (int i = 1; i <= n; ++i) {
  25. for (int j = 1; j < i; ++j) {
  26. int Dis = dis(i, j);
  27. if (se.count(Dis)) {
  28. ++res;
  29. }
  30. }
  31. }
  32. printf("%d\n", res);
  33. }
  34. return 0;
  35. }

C. Remainder Minimization 2019

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define p 2019
  4. int main() {
  5. int l, r;
  6. while (scanf("%d%d", &l, &r) != EOF) {
  7. if (r - l + 1 >= 3000) {
  8. puts("0");
  9. continue;
  10. } else {
  11. int res = 1e9;
  12. for (int i = l; i <= r; ++i) {
  13. for (int j = l; j < i; ++j) {
  14. res = min(res, (i % p) * (j % p) % p);
  15. }
  16. }
  17. printf("%d\n", res);
  18. }
  19. }
  20. return 0;
  21. }

D. Rain Flows into Dams

题意:

给出两个序列\(a_i, b_i\),知道\(a_i\)和\(b_i\)的关系如下:

\[a_i =
\begin{cases}
\frac{b_n}{2} + \frac{b_1}{2} &&i = n \\
\frac{b_i}{2} + \frac{b_{i + 1}}{2} && i \neq n
\end{cases}
\]

现在给出\(a_i\),要求还原\(b_i\)。

思路:

\(n = 3\)时:

\[\begin{eqnarray}
a_1 = \frac{b_1}{2} + \frac{b_2}{2} \\
a_2 = \frac{b_2}{2} + \frac{b_3}{2} \\
a_3 = \frac{b_3}{2} + \frac{b_1}{2}
\end{eqnarray}
\]

我们发现\(b_1 = (1) - (2) + (3)\)

然后就可以还原\(b_i\)了。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define N 100010
  5. int n, a[N];
  6. ll b[N];
  7. int main() {
  8. while (scanf("%d", &n) != EOF) {
  9. for (int i = 1; i <= n; ++i) {
  10. scanf("%d", a + i);
  11. }
  12. b[1] = 0;
  13. for (int i = 1; i <= n; ++i) {
  14. b[1] += a[i] * ((i & 1) ? 1 : -1);
  15. }
  16. b[n] = 2ll * a[n] - b[1];
  17. for (int i = n - 1; i > 1; --i) {
  18. b[i] = 2ll * a[i] - b[i + 1];
  19. }
  20. for (int i = 1; i <= n; ++i) printf("%lld%c", b[i], " \n"[i == n]);
  21. }
  22. return 0;
  23. }

E. Virus Tree 2

题意:

用\(K\)种颜色个一棵树染色,要求距离小于等于\(2\)的两个点的颜色不同。

求方案数。

思路:

如果距离小于等于\(1\)的两个点的颜色不同怎么求?

考虑每个点跟父亲不同就好了,答案为\(k \cdot (k - 1)^{n - 1}\)

那距离小于等于\(2\)呢?

考虑跟父亲往上走的距离小于等于\(2\)的点的颜色,因为这个点任意两个点的距离也是小于等于\(2\)的,也就是说这个点集中的每个点的颜色都不同,假设大小为\(sze\),那么当前点的选择总数为\(k - sze\)。

乘一乘就好了。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define N 100010
  5. const ll p = 1e9 + 7;
  6. int n, k;
  7. ll res;
  8. vector <vector<int>> G;
  9. void DFS(int u, int fa) {
  10. int sze = 1 + (u != 1);
  11. for (auto v : G[u]) if (v != fa) {
  12. res = res * max(0, k - sze) % p;
  13. ++sze;
  14. DFS(v, u);
  15. }
  16. }
  17. int main() {
  18. while (scanf("%d%d", &n, &k) != EOF) {
  19. G.clear(); G.resize(n + 1);
  20. for (int i = 1, u, v; i < n; ++i) {
  21. scanf("%d%d", &u, &v);
  22. G[u].push_back(v);
  23. G[v].push_back(u);
  24. }
  25. res = k;
  26. DFS(1, 1);
  27. printf("%lld\n", res);
  28. }
  29. return 0;
  30. }

F. Colorful Tree

题意:

有一棵树,每条边有颜色和边权。

每次询问要求将所有颜色为\(x_i\)的边的边权都改成\(y_i\),然后询问\(u_i \rightarrow v_i\)的距离。

思路:

将询问拆成原来的距离 - 路径上颜色为\(x_i\)的边的边权和 + 路径上颜色为\(x_i\)的边的条数 * \(y_i\)

然后离线即可。

其实不用写树剖和树状数组,只要将询问拆成三个询问丢在点那里,\(DFS\)下去的时候分别维护一下三个信息就好了。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define N 100010
  4. #define pii pair <int, int>
  5. #define fi first
  6. #define se second
  7. int n, q;
  8. struct node {
  9. int u, v, w, id;
  10. node() {}
  11. node(int v, int w) : v(v), w(w) {}
  12. node (int u, int v, int w, int id = 0) : u(u), v(v), w(w), id(id) {}
  13. };
  14. vector <vector<node>> E, Q, G;
  15. int res[N];
  16. int fa[N], deep[N], dis[N], sze[N], son[N], top[N], in[N], cnt;
  17. void DFS(int u) {
  18. sze[u] = 1;
  19. for (auto it : G[u]) if (it.v != fa[u]) {
  20. int v = it.v;
  21. fa[v] = u;
  22. deep[v] = deep[u] + 1;
  23. dis[v] = dis[u] + it.w;
  24. DFS(v);
  25. sze[u] += sze[v];
  26. if (son[u] == -1 || sze[v] > sze[son[u]]) son[u] = v;
  27. }
  28. }
  29. void gettop(int u, int sp) {
  30. top[u] = sp;
  31. in[u] = ++cnt;
  32. if (son[u] == -1) return;
  33. gettop(son[u], sp);
  34. for (auto it : G[u]) {
  35. int v = it.v;
  36. if (v == fa[u] || v == son[u]) continue;
  37. gettop(v, v);
  38. }
  39. }
  40. int querylca(int u, int v) {
  41. while (top[u] != top[v]) {
  42. if (deep[top[u]] < deep[top[v]]) {
  43. swap(u, v);
  44. }
  45. u = fa[top[u]];
  46. }
  47. if (deep[u] > deep[v]) swap(u, v);
  48. return u;
  49. }
  50. pii add(pii x, pii y) {
  51. return pii(x.fi + y.fi, x.se + y.se);
  52. }
  53. pii sub(pii x, pii y) {
  54. return pii(x.fi - y.fi, x.se - y.se);
  55. }
  56. struct BIT {
  57. pii a[N];
  58. void init() {
  59. memset(a, 0, sizeof a);
  60. }
  61. void update(int x, int s, int t) {
  62. for (; x < N; x += x & -x) {
  63. a[x] = add(a[x], pii(s, t));
  64. }
  65. }
  66. pii query(int x) {
  67. pii res = pii(0, 0);
  68. for (; x > 0; x -= x & -x) {
  69. res = add(res, a[x]);
  70. }
  71. return res;
  72. }
  73. pii query(int l, int r) {
  74. return sub(query(r), query(l - 1));
  75. }
  76. }bit;
  77. pii query(int u, int v) {
  78. pii res = pii(0, 0);
  79. while (top[u] != top[v]) {
  80. if (deep[top[u]] < deep[top[v]]) swap(u, v);
  81. res = add(res, bit.query(in[top[u]], in[u]));
  82. u = fa[top[u]];
  83. }
  84. if (u == v) return res;
  85. if (deep[u] > deep[v]) swap(u, v);
  86. return add(res, bit.query(in[son[u]], in[v]));
  87. }
  88. void init() {
  89. bit.init();
  90. cnt = 0; dis[1] = 0; fa[1] = 0;
  91. E.clear(); E.resize(n + 1);
  92. Q.clear(); Q.resize(n + 1);
  93. G.clear(); G.resize(n + 1);
  94. memset(son, -1, sizeof son);
  95. memset(res, 0, sizeof res);
  96. }
  97. int main() {
  98. while (scanf("%d%d", &n, &q) != EOF) {
  99. init();
  100. for (int i = 1, u, v, c, d; i < n; ++i) {
  101. scanf("%d%d%d%d", &u, &v, &c, &d);
  102. G[u].push_back(node(v, d));
  103. G[v].push_back(node(u, d));
  104. E[c].push_back(node(u, v, d));
  105. }
  106. for (int i = 1, c, u, v, w; i <= q; ++i) {
  107. scanf("%d%d%d%d", &c, &w, &u, &v);
  108. Q[c].push_back(node(u, v, w, i));
  109. }
  110. DFS(1); gettop(1, 1);
  111. // for (int i = 1; i <= n; ++i) printf("%d %d %d %d\n", i, fa[i], son[i], in[i]);
  112. for (int i = 1; i < n; ++i) {
  113. if (Q[i].empty()) continue;
  114. for (auto &it : E[i]) {
  115. if (fa[it.u] == it.v) swap(it.u, it.v);
  116. bit.update(in[it.v], 1, it.w);
  117. }
  118. for (auto it : Q[i]) {
  119. int u = it.u, v = it.v, w = it.w, id = it.id;
  120. int lca = querylca(u, v);
  121. // cout << u << " " << v << " " << lca << endl;
  122. pii tmp = query(u, v);
  123. res[id] = dis[u] + dis[v] - 2 * dis[lca] - tmp.se + w * tmp.fi;
  124. }
  125. for (auto it : E[i]) {
  126. bit.update(in[it.v], -1, -it.w);
  127. }
  128. }
  129. for (int i = 1; i <= q; ++i) printf("%d\n", res[i]);
  130. }
  131. return 0;
  132. }

AtCoder Beginner Contest 133的更多相关文章

  1. AtCoder Beginner Contest 133 -D — Rain Flows into Dams

    (https://atcoder.jp/contests/abc133/tasks/abc133_d) 思路:每座山为2Xi,每个坝为Ai.已知Ai,求出2Xi. 根据已知的X1,则可分别求出X2-n ...

  2. AtCoder Beginner Contest 133 B - Good Distance

    地址:https://atcoder.jp/contests/abc133/tasks/abc133_b 核心问题:判断一个浮点数开方是否为整数 ; double ans1=sqrt(ans); if ...

  3. AtCoder Beginner Contest 133 E - Virus Tree 2(组合数学)

    题意 n个点的树k种颜色,距离不超过2的点对需颜色不同,求方案数 Code(copy) #include<iostream> #include<cstdio> #include ...

  4. AtCoder Beginner Contest 133 F Colorful Tree

    Colorful Tree 思路: 如果强制在线的化可以用树链剖分. 但这道题不强制在线,那么就可以将询问进行差分,最后dfs时再计算每个答案的修改值, 只要维护两个数组就可以了,分别表示根节点到当前 ...

  5. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  6. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

  7. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  8. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  9. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

随机推荐

  1. Springboot模板(thymeleaf、freemarker模板)

    目的: 1.thymeleaf模板 2.Freemarker模板 thymeleaf模板 thymeleaf 的优点: 支持html5标准,页面无须部署到servlet开发到服务器上,直接通过浏览器就 ...

  2. 怎样获取全局对象 window

    1. 使用window.self window.self === window; // true 2. 使用window.window window.window === window; // tru ...

  3. 如何录屏做GIF图

    网上找了一下,ScreenToGif 这个神器 https://github.com/NickeManarin/ScreenToGif https://github.com/NickeManarin/ ...

  4. 2019年全国高校sql数据库

    2019年全国高校名单sql数据库信息: 根据教育部发布的文件整理形成可用.sql文件,导入数据库即可使用. 包括全国高等学校共计2956所,其中:普通高等学校2688所(含独立学院257所),成人高 ...

  5. ubuntu无法安装usb驱动

    第一步: 输入命令 lsusb 箭头指向的就是连接的手机 第二步: 输入命令,新建并打开文件 sudo gedit /etc/udev/rules.d/-android.rules [注意]如果提示没 ...

  6. 面试常考HTTP协议知识点

    协议简介 1. 应用层协议, 一般以TCP为基础,数据收发通过TCP实现: 2. 一次性连接.服务器与客户端的每次连接只处理一个请求,下次请求重新建立连接: 3. 无状态协议.服务器不保留与客户交易时 ...

  7. Vue框架之组件与过滤器的使用

    一.组件的使用 局部组件的使用 ​ 打油诗: 1.声子 2.挂子 3.用 var App = { tempalte:` <div class='app'></div>` }; ...

  8. 分组函数(groupby、itemgetter)

    from itertools import groupby from operator import itemgetter d1={'name':'liuyi','age':25,'city':'SZ ...

  9. C++——虚函数表解析

     转自:https://blog.csdn.net/haoel/article/details/1948051 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型指针指 ...

  10. 在Linux命令行中操作PDF

    pdftk 命令提供了许多处理 PDF 的命令行操作,包括合并页面.加密文件.添加水印.压缩文件,甚至还有修复 PDF. 虽然 PDF 通常被认为是相当稳定的文件,但在 Linux 和其他系统上你可以 ...