Contest Info


[Practice Link](https://ac.nowcoder.com/acm/contest/140#question)

Solved A B C D E F G H I J K
6/10 Ø . . Ø . . Ø Ø Ø Ø .
  • O 在比赛中通过
  • Ø 赛后通过
  • ! 尝试了但是失败了
  • . 没有尝试

Solutions


### A. run

题意:

白云每次可以移动\(1\)米或者\(k\)米,询问移动的米数在\([L, R]\)范围内的方案数有多少。

思路:

\(dp[i][0/1]\)表示到第\(i\)米,是通过\(1\)米的方式过来的还是\(k\)米的方式过来的,递推即可。

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define N 100010
  4. const int p = 1e9 + 7;
  5. int f[N][2], g[N];
  6. int q, k, l, r;
  7. void add(int &x, int y) {
  8. x += y;
  9. if (x >= p) {
  10. x -= p;
  11. }
  12. }
  13. int main() {
  14. scanf("%d%d", &q, &k);
  15. memset(f, 0, sizeof f);
  16. f[0][0] = 1;
  17. for (int i = 0; i <= 100000; ++i) {
  18. add(f[i + 1][0], (f[i][0] + f[i][1]) % p);
  19. if (i + k <= 100000) {
  20. add(f[i + k][1], f[i][0]);
  21. }
  22. }
  23. memset(g, 0, sizeof g);
  24. for (int i = 1; i <= 100000; ++i) {
  25. g[i] = g[i - 1];
  26. add(g[i], f[i][0]);
  27. add(g[i], f[i][1]);
  28. }
  29. while (q--) {
  30. scanf("%d%d", &l, &r);
  31. printf("%d\n", (g[r] - g[l - 1] + p) % p);
  32. }
  33. return 0;
  34. }

### D. monrey

题意:

有\(n\)个物品,从\(1\)到\(n\)的顺序去访问,身上最多只能携带一个物品,每次可以买进或者卖出物品,身上有无限的钱,问最后获得的利润最多是多少。

思路:

考虑将买入和卖出合并成一种操作,买入就是减去收益,卖出是增加收益,维护两个堆,遍历\(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. struct node {
  7. ll tot; int cnt;
  8. node() {}
  9. node (ll tot, int cnt) : tot(tot), cnt(cnt) {}
  10. bool operator < (const node &other) const {
  11. if (tot == other.tot) {
  12. return cnt > other.cnt;
  13. }
  14. return tot < other.tot;
  15. }
  16. };
  17. int main() {
  18. int T; scanf("%d", &T);
  19. while (T--) {
  20. scanf("%d", &n);
  21. for (int i = 1; i <= n; ++i) {
  22. scanf("%d", a + i);
  23. }
  24. //0表示上一次操作是买入
  25. //1表示上一次操作是卖出
  26. priority_queue <node> pq[2];
  27. node res = node(0, 0);
  28. pq[0].push(node(-a[1], 1));
  29. node t1, t2;
  30. for (int i = 2; i <= n; ++i) {
  31. pq[0].push(node(-a[i], 1));
  32. if (!pq[0].empty()) {
  33. t1 = pq[0].top();
  34. pq[1].push(node(t1.tot + a[i], t1.cnt + 1));
  35. }
  36. if (!pq[1].empty()) {
  37. t2 = pq[1].top();
  38. pq[0].push(node(t2.tot - a[i], t2.cnt + 1));
  39. }
  40. if (!pq[1].empty()) {
  41. res = max(res, pq[1].top());
  42. }
  43. }
  44. printf("%lld %d\n", res.tot, res.cnt);
  45. }
  46. return 0;
  47. }

### G. transform

题意:

一维坐标系上,在\(x_i\)有\(a_i\)个物品,每次移动一个物品的代价为\(2 \cdot abs(x_u - x_v)\),现在有\(T\)元钱,问在不超过\(T\)的代价下,移动物品使得

在同一个位置上的物品最多。

思路:

显然可以二分物品数量,check的时候枚举左端点,双指针维护右端点,多余的部分从右端回退。

再枚举右端点,反着搞一遍。

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define N 500010
  5. int n, x[N], a[N];
  6. ll sum[N], cost[N];
  7. ll T, L, R, need;
  8. int u;
  9. ll cost_l(int i) {
  10. //将L+1~i的物品移动到i的费用
  11. ll a = (sum[i] - sum[L]) * x[i] - (cost[i] - cost[L]);
  12. //将i+1~R的物品移动到i的费用
  13. ll b = (cost[R] - cost[i]) - x[i] * (sum[R] - sum[i]);
  14. //将多余的物品从R移动到i的费用
  15. ll c = (sum[R] - sum[L] - need) * (x[R] - x[i]);
  16. return a + b - c;
  17. }
  18. ll cost_r(int i) {
  19. //将L+1~i的物品移动到i的费用
  20. ll a = (sum[i] - sum[L]) * x[i] - (cost[i] - cost[L]);
  21. //将i+1~R的物品移动到i的费用
  22. ll b = (cost[R] - cost[i]) - x[i] * (sum[R] - sum[i]);
  23. //将多余的物品从L移动到i的费用
  24. ll c = (sum[R] - sum[L] - need) * (x[i] - x[L + 1]);
  25. return a + b - c;
  26. }
  27. bool check(ll x) {
  28. need = x;
  29. L = 0, R = 1, u = 0;
  30. while (1) {
  31. while (R < n && sum[R] - sum[L] < x) ++R;
  32. if (sum[R] - sum[L] < x) break;
  33. while (u < L) ++u;
  34. while (u < R && cost_l(u) > cost_l(u + 1)) ++u;
  35. if (cost_l(u) <= T) return 1;
  36. ++L;
  37. }
  38. L = n - 1, R = n, u = n;
  39. while (1) {
  40. while (L > 0 && sum[R] - sum[L] < x) --L;
  41. if (sum[R] - sum[L] < x) break;
  42. while (u > R) --u;
  43. while (u > L && cost_r(u) > cost_r(u - 1)) --u;
  44. if (cost_r(u) <= T) return 1;
  45. --R;
  46. }
  47. return 0;
  48. }
  49. int main() {
  50. while (scanf("%d%lld", &n, &T) != EOF) {
  51. T /= 2;
  52. for (int i = 1; i <= n; ++i) {
  53. scanf("%d", x + i);
  54. }
  55. for (int i = 1; i <= n; ++i) {
  56. scanf("%d", a + i);
  57. sum[i] = sum[i - 1] + a[i];
  58. cost[i] = cost[i - 1] + 1ll * a[i] * x[i];
  59. }
  60. ll l = 0, r = sum[n], res = -1;
  61. while (r - l >= 0) {
  62. ll mid = (l + r) >> 1;
  63. if (check(mid)) {
  64. l = mid + 1;
  65. res = mid;
  66. } else {
  67. r = mid - 1;
  68. }
  69. }
  70. printf("%lld\n", res);
  71. }
  72. return 0;
  73. }

H. travel

题意:

询问一棵树上三条不相交路径的最大点权和。

思路:

\(f[u][x][y]\)表示以\(u\)为根的子树中,\(u\)的状态为\(x\),已经选了\(y\)条树链的最大点权和是多少。

三种状态:

  • 当前点不选
  • 当前点是链的一端
  • 当前点是链的拐点,即两条链的交界处

考虑转移:

  • 对于\(y\)的转移可以枚举\(y\)和\(i\),可以推出\(j\)
  • 注意\(y\)和\(i\)的枚举要降序枚举。
  • 对于当前点是拐点,转移过来的可以是链+链,也可以是拐点+不选
  • 对于当前点是链,可以是当前点是空,转移过来是链,也可以是当前点是链,转移过来的是空
  • 对于当前点不选,那么可以是任何状态转移过来,但是当前点不要选。
  • 最后答案是\(f[1][0][3]\)

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define N 400010
  5. int n, a[N];
  6. vector <vector<int>> G;
  7. // 0 表示当前点不选
  8. // 1 表示当前点链的一端
  9. // 2 表示当前点是拐点
  10. // 第三维表示已经选了0, 1, 2, 3条链
  11. ll f[N][3][4];
  12. void Max(ll &x, ll y) {
  13. if (x < y) x = y;
  14. }
  15. void DFS(int u, int fa) {
  16. f[u][1][0] = a[u];
  17. for (auto v : G[u]) if (v != fa) {
  18. DFS(v, u);
  19. //转移2状态
  20. for (int k = 2; ~k; --k) {
  21. for (int i = k, j; ~i; --i) {
  22. j = k - i;
  23. //链+链
  24. Max(f[u][2][k], f[u][1][i] + f[v][1][j]);
  25. //拐点+空
  26. Max(f[u][2][k], f[u][2][i] + f[v][0][j]);
  27. }
  28. }
  29. //转移1状态
  30. for (int k = 2; ~k; --k) {
  31. for (int i = k, j; ~i; --i) {
  32. j = k - i;
  33. Max(f[u][1][k], f[u][0][i] + a[u] + f[v][1][j]);
  34. Max(f[u][1][k], f[u][1][i] + f[v][0][j]);
  35. }
  36. }
  37. //转移0状态
  38. for (int k = 3; ~k; --k) {
  39. for (int i = k, j; ~i; --i) {
  40. j = k - i;
  41. f[u][0][k] = max(f[u][0][k], f[u][0][i] + f[v][0][j]);
  42. if (j) {
  43. f[u][0][k] = max(f[u][0][k], f[u][0][i] + f[v][1][j - 1]);
  44. f[u][0][k] = max(f[u][0][k], f[u][0][i] + f[v][2][j - 1]);
  45. }
  46. }
  47. }
  48. }
  49. for (int k = 3; k; --k) {
  50. Max(f[u][0][k], f[u][1][k - 1]);
  51. Max(f[u][0][k], f[u][2][k - 1]);
  52. }
  53. }
  54. int main() {
  55. while (scanf("%d", &n) != EOF) {
  56. memset(f, 0, sizeof f);
  57. G.clear(); G.resize(n + 1);
  58. for (int i = 1; i <= n; ++i) {
  59. scanf("%d", a + i);
  60. }
  61. for (int i = 1, u, v; i < n; ++i) {
  62. scanf("%d%d", &u, &v);
  63. G[u].push_back(v);
  64. G[v].push_back(u);
  65. }
  66. DFS(1, 0);
  67. printf("%lld\n", f[1][0][3]);
  68. }
  69. return 0;
  70. }

I. car

题意:

在一个\(n \cdot n\)的二维平面上,要放置尽量多的小车,使得每一俩小车都要直行到它的对面边界,其中有一些障碍物,小车行驶的时候不能相撞,也不能碰到障碍物,

问最多放多少辆小车。

思路:

  • 显然每一行每一列最多放一辆小车。
  • 假设\(a[x][y]\)有障碍物,那么第\(x\)行第\(y\)列都不能有小车。
  • 如果\(n\)是奇数,那么第\(\frac{n + 1}{2}\)行,第\(\frac{n + 1}{2}\)只能放一辆小车。

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define N 100010
  4. int n, m;
  5. int vis[N][2];
  6. int main() {
  7. while (scanf("%d%d", &n, &m) != EOF) {
  8. memset(vis, 0, sizeof vis);
  9. for (int i = 1, x, y; i <= m; ++i) {
  10. scanf("%d%d", &x, &y);
  11. vis[x][0] = 1;
  12. vis[y][1] = 1;
  13. }
  14. int ans = 0;
  15. if (n & 1) {
  16. if (vis[n / 2 + 1][0] == 0 && vis[n / 2 + 1][1] == 0) {
  17. ++ans;
  18. vis[n / 2 + 1][0] = 1;
  19. vis[n / 2 + 1][1] = 1;
  20. }
  21. }
  22. for (int i = 1; i <= n; ++i) {
  23. for (int j = 0; j < 2; ++j) {
  24. ans += (vis[i][j] == 0);
  25. }
  26. }
  27. printf("%d\n", ans);
  28. }
  29. return 0;
  30. }

### J. farm

题意:

在\(n \cdot m\)的农田上,有\(n \cdot m\)棵植物,每棵植物只能施放第\(a[i][j]\)种肥料,有\(T\)次操作,每次操作时将\(x_1, y_1, x_2, y_2\)矩形内的作物都施上第\(k_i\)种肥料,

一旦作物被施上不是第\(a[i][j]\)种肥料,它就会立刻死亡。

问最后死亡的作物数目.

思路一:

考虑:

作物的施肥次数 = 第\(a[i][j]\)种肥料的施肥次数+其他种类肥料的施肥次数。

我们先二维差分求出所有作物的总的施肥次数。

然后将操作按\(k_i\)分类,用二维BIT维护二维前缀和,表示\(k_i\)操作下作物的施肥次数。

然后再枚举初始值为\(k_i\)的所有作物,判断它总的施肥次数以及第\(k_i\)种肥料的施肥次数是否相等,不相等就挂了。

时间复杂度:\(\mathcal{O}(nm + T \cdot log(n) \cdot log(m))\)

代码一:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define N 1000010
  4. #define pii pair <int, int>
  5. #define fi first
  6. #define se second
  7. int n, m, q;
  8. struct node {
  9. int x[2], y[2];
  10. node() {}
  11. node(int x1, int y1, int x2, int y2) {
  12. x[0] = x1; x[1] = x2;
  13. y[0] = y1; y[1] = y2;
  14. }
  15. };
  16. vector < vector <pii> > a;
  17. vector < vector <node> > b;
  18. struct BIT {
  19. vector < vector <int> > a;
  20. void init() {
  21. a.clear();
  22. a.resize(n + 1);
  23. for (int i = 0; i < n + 1; ++i) {
  24. a[i].resize(m + 1);
  25. }
  26. }
  27. void update(int x, int y, int v) {
  28. for (int i = x; i <= n; i += i & -i) {
  29. for (int j = y; j <= m; j += j & -j) {
  30. a[i][j] += v;
  31. }
  32. }
  33. }
  34. void update(int x1, int y1, int x2, int y2, int v) {
  35. update(x1, y1, v);
  36. update(x2 + 1, y2 + 1, v);
  37. update(x1, y2 + 1, -v);
  38. update(x2 + 1, y1, -v);
  39. }
  40. int query(int x, int y) {
  41. int res = 0;
  42. for (int i = x; i > 0; i -= i & -i) {
  43. for (int j = y; j > 0; j -= j & -j) {
  44. res += a[i][j];
  45. }
  46. }
  47. return res;
  48. }
  49. }bit;
  50. void read(int &x) {
  51. x = 0; char ch;
  52. while (!isdigit(ch = getchar()));
  53. while (isdigit(ch)) {
  54. x = x * 10 + ch - '0';
  55. ch = getchar();
  56. }
  57. }
  58. int main() {
  59. while (scanf("%d%d%d", &n, &m, &q) != EOF) {
  60. a.clear();
  61. a.resize(n * m + 1);
  62. b.clear();
  63. b.resize(n * m + 1);
  64. bit.init();
  65. for (int i = 1; i <= n; ++i) {
  66. for (int j = 1, x; j <= m; ++j) {
  67. read(x);
  68. a[x].emplace_back(i, j);
  69. }
  70. }
  71. for (int i = 1, k, x1, y1, x2, y2; i <= q; ++i) {
  72. read(x1); read(y1); read(x2); read(y2); read(k);
  73. b[k].push_back(node(x1, y1, x2, y2));
  74. bit.update(x1, y1, x2, y2, 1);
  75. }
  76. int res = 0;
  77. for (int i = 1; i <= n * m; ++i) {
  78. for (auto it : b[i]) {
  79. bit.update(it.x[0], it.y[0], it.x[1], it.y[1], -1);
  80. }
  81. for (auto it : a[i]) {
  82. if (bit.query(it.fi, it.se) != 0) {
  83. ++res;
  84. }
  85. }
  86. for (auto it : b[i]) {
  87. bit.update(it.x[0], it.y[0], it.x[1], it.y[1], 1);
  88. }
  89. }
  90. printf("%d\n", res);
  91. }
  92. return 0;
  93. }

思路二:

考虑每次施肥的时候加上的是\(k_i\)而不是1,那么最终如果作物没有死,那么它的值应该是\(a[i][j] \cdot 施肥次数\)。

但是这样容易被卡,将权值映射成素数即可。

时间复杂度:\(\mathcal{O}(n + m + 10^7)\)

代码二:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define N 15500010
  5. int prime[1000010], tot;
  6. bool check[N];
  7. void init() {
  8. tot = 0;
  9. memset(check, 0, sizeof check);
  10. for (int i = 2; i < N; ++i) {
  11. if (!check[i]) {
  12. prime[++tot] = i;
  13. if (tot >= 1000000) break;
  14. }
  15. for (int j = 1; j <= tot; ++j) {
  16. if (1ll * i * prime[j] >= N) break;
  17. check[i * prime[j]] = 1;
  18. if (i % prime[j] == 0) {
  19. break;
  20. }
  21. }
  22. }
  23. }
  24. int n, m, q;
  25. vector <vector<int>> a, c;
  26. vector <vector<ll>> b;
  27. template <class T>
  28. void up(vector <vector<T>> &vec, int x1, int y1, int x2, int y2, int v) {
  29. vec[x1][y1] += v;
  30. vec[x2 + 1][y2 + 1] += v;
  31. vec[x1][y2 + 1] -= v;
  32. vec[x2 + 1][y1] -= v;
  33. }
  34. template <class T>
  35. void work(vector <vector<T>> &vec) {
  36. for (int i = 1; i <= n; ++i) {
  37. for (int j = 1; j <= m; ++j) {
  38. vec[i][j] += vec[i - 1][j] + vec[i][j - 1] - vec[i - 1][j - 1];
  39. }
  40. }
  41. }
  42. int main() {
  43. init();
  44. random_shuffle(prime + 1, prime + 1 + tot);
  45. while (scanf("%d%d%d", &n, &m, &q) != EOF) {
  46. a.clear(); a.resize(n + 2, vector <int> (m + 2, 0));
  47. b.clear(); b.resize(n + 2, vector <ll> (m + 2, 0));
  48. c.clear(); c.resize(n + 2, vector <int> (m + 2, 0));
  49. for (int i = 1; i <= n; ++i) {
  50. for (int j = 1; j <= m; ++j) {
  51. scanf("%d", &a[i][j]);
  52. }
  53. }
  54. int x[2], y[2], k;
  55. while (q--) {
  56. scanf("%d%d%d%d%d", x, y, x + 1, y + 1, &k);
  57. up(b, x[0], y[0], x[1], y[1], prime[k]);
  58. up(c, x[0], y[0], x[1], y[1], 1);
  59. }
  60. work(b); work(c);
  61. int res = 0;
  62. for (int i = 1; i <= n; ++i) {
  63. for (int j = 1; j <= m; ++j) {
  64. if (b[i][j] != c[i][j] * prime[a[i][j]]) {
  65. ++res;
  66. }
  67. }
  68. }
  69. printf("%d\n", res);
  70. }
  71. return 0;
  72. }

思路三:

依据:

\[\begin{eqnarray*}
2c &=& a + b\\
2c^2 &=& a^2 + b^2 \\
\end{eqnarray*}
\]

当且仅当\(a = b = c\)时成立。

增加一个平方验证。

代码三:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. int n, m, q;
  5. vector <vector<int>> a, c;
  6. vector <vector<ll>> b;
  7. template <class T>
  8. void up(vector <vector<T>> &vec, int x1, int y1, int x2, int y2, int v) {
  9. vec[x1][y1] += v;
  10. vec[x2 + 1][y2 + 1] += v;
  11. vec[x1][y2 + 1] -= v;
  12. vec[x2 + 1][y1] -= v;
  13. }
  14. template <class T>
  15. void work(vector <vector<T>> &vec) {
  16. for (int i = 1; i <= n; ++i) {
  17. for (int j = 1; j <= m; ++j) {
  18. vec[i][j] += vec[i - 1][j] + vec[i][j - 1] - vec[i - 1][j - 1];
  19. }
  20. }
  21. }
  22. void read(int &x) {
  23. x = 0; char ch;
  24. while (!isdigit(ch = getchar()));
  25. while (isdigit(ch)) {
  26. x = x * 10 + ch - '0';
  27. ch = getchar();
  28. }
  29. }
  30. int main() {
  31. while (scanf("%d%d%d", &n, &m, &q) != EOF) {
  32. a.clear(); a.resize(n + 2, v ector <int> (m + 2, 0));
  33. b.clear(); b.resize(n + 2, vector <ll> (m + 2, 0));
  34. c.clear(); c.resize(n + 2, vector <int> (m + 2, 0));
  35. for (int i = 1; i <= n; ++i) {
  36. for (int j = 1; j <= m; ++j) {
  37. read(a[i][j]);
  38. }
  39. }
  40. int x[2], y[2], k;
  41. while (q--) {
  42. read(x[0]); read(y[0]); read(x[1]); read(y[1]); read(k);
  43. up(b, x[0], y[0], x[1], y[1], 1ll * k);
  44. up(c, x[0], y[0], x[1], y[1], 1);
  45. }
  46. work(b); work(c);
  47. int res = 0;
  48. for (int i = 1; i <= n; ++i) {
  49. for (int j = 1; j <= m; ++j) {
  50. if (b[i][j] != c[i][j] * a[i][j]) {
  51. ++res;
  52. }
  53. }
  54. }
  55. printf("%d\n", res);
  56. }
  57. return 0;
  58. }

思路四:

考虑两个数不同,那么它们的二进制位至少有一位是不同的。

那么考虑枚举二进制位,当每次操作的\(k_i\)的当前二进制上为一时那么施肥。

然后枚举每个作物:

  • 如果当前作物的\(a[i][j]\)的二进制位上为\(1\),如果施肥总次数与当次总次数不同,那么它挂了
  • 如果当前作物的\(a[i][j]\)的二进制位上为\(0\),如果存在施肥次数,那么它挂了

实现的时候开一维数组然后映射二维坐标就过了,开二维vector就T了。。

代码四:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define N 4000010
  4. #define y1 y_1
  5. int x1[N], y1[N], x2[N], y2[N], k[N];
  6. int n, m, q;
  7. int a[N], b[N], c[N];
  8. bool die[N];
  9. int id(int x, int y) {
  10. return (x - 1) * (m + 2) + y;
  11. }
  12. void up(int *f, int x1, int y1, int x2, int y2, int v) {
  13. f[id(x1, y1)] += v;
  14. f[id(x2 + 1, y2 + 1)] += v;
  15. f[id(x1, y2 + 1)] -= v;
  16. f[id(x2 + 1, y1)] -= v;
  17. }
  18. void work(int *f) {
  19. for (int i = 1; i <= n; ++i) {
  20. for (int j = 1; j <= m; ++j) {
  21. f[id(i, j)] += f[id(i - 1, j)] + f[id(i, j - 1)] - f[id(i - 1, j - 1)];
  22. }
  23. }
  24. }
  25. int main() {
  26. while (scanf("%d%d%d", &n, &m, &q) != EOF) {
  27. memset(b, 0, sizeof b);
  28. for (int i = 1; i <= n; ++i) {
  29. for (int j = 1; j <= m; ++j) {
  30. scanf("%d", &a[id(i, j)]);
  31. }
  32. }
  33. for (int i = 1; i <= q; ++i) {
  34. scanf("%d%d%d%d%d", x1 + i, y1 + i, x2 + i, y2 + i, k + i);
  35. up(b, x1[i], y1[i], x2[i], y2[i], 1);
  36. }
  37. work(b);
  38. for (int i = 15; i >= 0; --i) {
  39. for (int _i = 1; _i <= n; ++_i) {
  40. for (int _j = 1; _j <= m; ++_j) {
  41. c[id(_i, _j)] = 0;
  42. }
  43. }
  44. for (int j = 1; j <= q; ++j) {
  45. if (k[j] >> i & 1) {
  46. up(c, x1[j], y1[j], x2[j], y2[j], 1);
  47. }
  48. }
  49. work(c);
  50. for (int _i = 1; _i <= n; ++_i) {
  51. for (int _j = 1; _j <= m; ++_j) {
  52. if (a[id(_i, _j)] >> i & 1) {
  53. if (b[id(_i, _j)] != c[id(_i, _j)]) {
  54. die[id(_i, _j)] = 1;
  55. }
  56. } else if (c[id(_i, _j)]) {
  57. die[id(_i, _j)] = 1;
  58. }
  59. }
  60. }
  61. }
  62. int res = 0;
  63. for (int i = 1; i <= n; ++i) {
  64. for (int j = 1; j <= m; ++j) {
  65. res += die[id(i, j)];
  66. }
  67. }
  68. printf("%d\n", res);
  69. }
  70. return 0;
  71. }

2018 Nowcoder Multi-University Training Contest 2的更多相关文章

  1. HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 【单调队列优化】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/500 ...

  2. 2018 Multi-University Training Contest 2

    题目链接:2018 Multi-University Training Contest 2 6318 Swaps and Inversions 题意:sum=x*逆序个数+交换次数*y,使sum最小 ...

  3. 2018 Multi-University Training Contest 1

    比赛链接:2018 Multi-University Training Contest 1 6301 Distinct Values 题意:输出一个长度为n的序列,要求满足m个区间的数都不相同,并且字 ...

  4. hdu 6301 Distinct Values (2018 Multi-University Training Contest 1 1004)

    Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  5. 2018 Multi-University Training Contest 4 Problem J. Let Sudoku Rotate 【DFS+剪枝+矩阵旋转】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6341 Problem J. Let Sudoku Rotate Time Limit: 2000/100 ...

  6. 2018 Multi-University Training Contest 4 Problem K. Expression in Memories 【模拟】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6342 Problem K. Expression in Memories Time Limit: 200 ...

  7. 2018 Multi-University Training Contest 4 Problem E. Matrix from Arrays 【打表+二维前缀和】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6336 Problem E. Matrix from Arrays Time Limit: 4000/20 ...

  8. 2018 Multi-University Training Contest 4 Problem L. Graph Theory Homework 【YY】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6343 Problem L. Graph Theory Homework Time Limit: 2000 ...

  9. 2018 Multi-University Training Contest 4 Problem B. Harvest of Apples 【莫队+排列组合+逆元预处理技巧】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6333 Problem B. Harvest of Apples Time Limit: 4000/200 ...

  10. 2018 Multi-University Training Contest 1 Distinct Values 【贪心 + set】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6301 Distinct Values Time Limit: 4000/2000 MS (Java/Ot ...

随机推荐

  1. JS 07 Dom

    DOM(Document Object Model): 结点的概念:整个文档就是由层次不同的多个节点组成,可以说结点代表了全部内容. 结点类型 1.元素结点 2.属性结点 3.文本结点   结点的注意 ...

  2. electron实现透明点投的方法

    1. electron createWindow 的时候 设置 transparent: true, clickThrough: 'pointer-events' 2. body 上添加 pointe ...

  3. 剑指Offer(4)——替换空格

    题目: 请实现一个函数,把字符串中的每个空格替换成"%20".例如输入“We are happy.”,则输出“We%20are%20happy.”. 思路: 如果按照顺序从前往后依 ...

  4. ASM实例远程连接

    存在一个软件,远程连接ASM实例 tj2:/picclife/app/grid$ lsnrctl status Listening Endpoints Summary... (DESCRIPTION= ...

  5. hdu 6208 上一个kmp模板

    #include <cstdio> #include <cstring> #include <iostream> #include <queue> #i ...

  6. (一)shiro简介和用户登录demo及角色管理

    一.shiro简介 Apache Shiro是Java的一个安全框架.Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境.Shiro可以帮助我们完成 ...

  7. 使用layer.open 父页面获取子页面输入文本框中的值

    $(function () { $("#confirmpassword").click(function () { var pwd = $("#txtPwd") ...

  8. redis集群安装2

      概要:本文主要介绍如何在Centos7中单机搭建redis集群三主三从,按照本文绝对可以实现该需求,至于先搭建单机版主要为了方便理解redis集群,为下一步开发或生产上redis集群做铺垫.同时本 ...

  9. vim调试Shell脚本: unexpected EOF while looking for matching

    往往在编写脚本完后测试,出现错误需要调试,vim 是一种强大的文本编辑器,对调试也很有帮助.如果指定用不同的颜色显示某些错误,通过配置 .vimrc 文件就会替您完成大部分调试工作. 小柏在测试脚本时 ...

  10. 使用java中的反射获得object对象的属性值

    知识点:使用java中的反射获得object对象的属性值 一:场景 这两天开发代码时,调用别人的后台接口,返回值为Object对象(json形式的),我想获得object中指定的属性值,没有对应的ge ...