A - Problem A. Ascending Rating

题意:给出n个数,给出区间长度m。对于每个区间,初始值的max为0,cnt为0.遇到一个a[i] > ans, 更新ans并且cnt++。计算

$A = \sum_{i = 1}^{i = n - m +1} (max \oplus i)$

$B = \sum_{i = 1}^{i = n - m +1} (cnt \oplus i)$

思路:单调队列,倒着扫一遍,对于每个区间的cnt就是队列的长度,扫一遍即可。

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int maxn = 1e7 + ;
  6. typedef long long ll;
  7.  
  8. int t;
  9. int n,m,k;
  10. ll p, q, r, mod;
  11. ll arr[maxn];
  12. ll brr[maxn];
  13.  
  14. int main()
  15. {
  16. scanf("%d", &t);
  17. while(t--)
  18. {
  19. scanf("%d %d %d %lld %lld %lld %lld", &n, &m, &k, &p, &q, &r, &mod);
  20. for(int i = ; i <= n; ++i)
  21. {
  22. if(i <= k) scanf("%lld", arr + i);
  23. else arr[i] = (p * arr[i - ] + q * i + r) % mod;
  24. }
  25. ll A = , B = ;
  26. int head = , tail = -;
  27. for(int i = n; i > (n - m + ); --i)
  28. {
  29. while(head <= tail && arr[i] >= arr[brr[tail]]) tail--;
  30. brr[++tail] = i;
  31. }
  32. for(int i = n - m + ; i >= ; --i)
  33. {
  34. while(head <= tail && arr[i] >= arr[brr[tail]]) tail--;
  35. brr[++tail] = i;
  36. while(brr[head] - i >= m) head++;
  37. A += arr[brr[head]] ^ i;
  38. B += (tail - head + ) ^ i;
  39. }
  40. printf("%lld %lld\n", A, B);
  41. }
  42. return ;
  43. }

B - Problem B. Cut The String

留坑。

C - Problem C. Dynamic Graph Matching

题意:给出n个点,两种操作,一种是加边,一种是减边,每次加一条或者减一条,每次操作后输出1, 2, ..., n/2 表示对应的数量的边,有几种取法,并且任意两个边不能相邻

思路:每加一条边,都可以转移状态 比如说 110100 到  111110 就是 dp[111110] += dp[110100]

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. const int maxn = << ;
  7. const int MOD = 1e9 + ;
  8.  
  9. int t, n, m;
  10. ll dp[maxn];
  11. ll ans[];
  12.  
  13. inline int cal(int x)
  14. {
  15. int cnt = ;
  16. while(x)
  17. {
  18. if(x & ) cnt++;
  19. x >>= ;
  20. }
  21. return cnt;
  22. }
  23.  
  24. int main()
  25. {
  26. scanf("%d", &t);
  27. while(t--)
  28. {
  29. memset(ans, , sizeof ans);
  30. memset(dp, , sizeof dp);
  31. dp[] = ;
  32. scanf("%d %d", &n, &m);
  33. while(m--)
  34. {
  35. char op[];
  36. int u, v;
  37. scanf("%s %d %d", op, &u, &v);
  38. --u,--v;
  39. for(int s = ; s < ( << n); ++s)
  40. {
  41. if((s & ( << u)) || (s & ( << v))) continue;
  42. int S = s | ( << u);
  43. S |= ( << v);
  44. if(op[] == '+')
  45. {
  46. dp[S] = (dp[S] + dp[s]) % MOD;
  47. ans[cal(S)] = (ans[cal(S)] + dp[s]) % MOD;
  48. }
  49. else if(op[] == '-')
  50. {
  51. dp[S] = (dp[S] - dp[s] + MOD) % MOD;
  52. ans[cal(S)] = (ans[cal(S)] - dp[s] + MOD) % MOD;
  53. }
  54. }
  55. for(int i = ; i <= n; i += )
  56. {
  57. printf("%lld%c", ans[i], " \n"[i == n]);
  58. }
  59. }
  60. }
  61. return ;
  62. }

D - Problem D. Euler Function

打表找规律

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define N 100010
  6.  
  7. inline int gcd(int a, int b)
  8. {
  9. return b == ? a : gcd(b, a % b);
  10. }
  11.  
  12. inline void Init()
  13. {
  14. for (int i = ; i <= ; ++i)
  15. {
  16. int res = ;
  17. for (int j = ; j < i; ++j)
  18. res += (gcd(i, j) == );
  19. printf("%d %d\n", i, res);
  20. }
  21. }
  22.  
  23. int t, n;
  24.  
  25. int main()
  26. {
  27. scanf("%d", &t);
  28. while (t--)
  29. {
  30. scanf("%d", &n);
  31. if (n == ) puts("");
  32. else printf("%d\n", n + );
  33. }
  34. return ;
  35. }

E - Problem E. Find The Submatrix

留坑,

F - Problem F. Grab The Tree

题意:一棵树,每个点有点权,小Q可以选择若干个点,并且任意两个点之间没有边,小T就是剩下的所有点,然后两个人的值就是拥有的点异或起来,求小Q赢还是输还是平局

思路:显然,只有赢或者平局的情况,只要考虑是否有平局情况就可以,当所有点异或起来为0便是平局

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define N 100010
  5.  
  6. int t, n;
  7. int arr[N];
  8.  
  9. int main()
  10. {
  11. scanf("%d", &t);
  12. while (t--)
  13. {
  14. scanf("%d", &n);
  15. int res = ;
  16. for (int i = ; i <= n; ++i)
  17. {
  18. scanf("%d", arr + i);
  19. res ^= arr[i];
  20. }
  21. for (int i = , u, v; i < n; ++i) scanf("%d%d", &u, &v);
  22. if (res == )
  23. {
  24. puts("D");
  25. continue;
  26. }
  27. puts("Q");
  28. }
  29. return ;
  30. }

G - Problem G. Interstellar Travel

题意:给出n个点,要从$i -> j$ 当且仅当 $x_i < x_j$ 花费为 $x_i \cdot y_j - x_j \cdot y_i$ 求从$1 -> n$ 求权值最小如果多解输出字典序最小的解

思路:可以发现权值就是叉积,求个凸包,然后考虑在一条线上的情况

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define N 200010
  5.  
  6. const double eps = 1e-;
  7.  
  8. inline int sgn(double x)
  9. {
  10. if (fabs(x) < eps) return ;
  11. if (x < ) return -;
  12. else return ;
  13. }
  14.  
  15. struct Point
  16. {
  17. double x, y; int id;
  18. inline Point () {}
  19. inline Point(double x, double y) : x(x), y(y) {}
  20. inline void scan(int _id)
  21. {
  22. id = _id;
  23. scanf("%lf%lf", &x, &y);
  24. }
  25. inline bool operator == (const Point &r) const { return sgn(x - r.x) == && sgn(y - r.y) == ; }
  26. inline bool operator < (const Point &r) const { return x < r.x || x == r.x && y < r.y || x == r.x && y == r.y && id < r.id; }
  27. inline Point operator + (const Point &r) const { return Point(x + r.x, y + r.y); }
  28. inline Point operator - (const Point &r) const { return Point(x - r.x, y - r.y); }
  29. inline double operator ^ (const Point &r) const { return x * r.y - y * r.x; }
  30. inline double distance(const Point &r) const { return hypot(x - r.x, y - r.y); }
  31. };
  32.  
  33. struct Polygon
  34. {
  35. int n;
  36. Point p[N];
  37. struct cmp
  38. {
  39. Point p;
  40. inline cmp(const Point &p0) { p = p0; }
  41. inline bool operator () (const Point &aa, const Point &bb)
  42. {
  43. Point a = aa, b = bb;
  44. int d = sgn((a - p) ^ (b - p));
  45. if (d == )
  46. {
  47. return sgn(a.distance(p) - b.distance(p)) < ;
  48. }
  49. return d < ;
  50. }
  51. };
  52. inline void norm()
  53. {
  54. Point mi = p[];
  55. for (int i = ; i < n; ++i) mi = min(mi, p[i]);
  56. sort(p, p + n, cmp(mi));
  57. }
  58. inline void Graham(Polygon &convex)
  59. {
  60. sort(p + , p + n - );
  61. int cnt = ;
  62. for (int i = ; i < n; ++i)
  63. {
  64. if (!(p[i] == p[i - ]))
  65. p[cnt++] = p[i];
  66. }
  67. n = cnt;
  68. norm();
  69. int &top = convex.n;
  70. top = ;
  71. if (n == )
  72. {
  73. top = ;
  74. convex.p[] = p[];
  75. convex.p[] = p[];
  76. return;
  77. }
  78. if(n == )
  79. {
  80. top = ;
  81. convex.p[] = p[];
  82. convex.p[] = p[];
  83. convex.p[] = p[];
  84. return ;
  85. }
  86. convex.p[] = p[];
  87. convex.p[] = p[];
  88. top = ;
  89. for (int i = ; i < n; ++i)
  90. {
  91. while (top > && sgn((convex.p[top - ] - convex.p[top - ]) ^ (p[i] - convex.p[top - ])) >= )
  92. {
  93. if(sgn((convex.p[top - ] - convex.p[top - ]) ^ (p[i] - convex.p[top - ])) == )
  94. {
  95. if(p[i].id < convex.p[top - ].id) --top;
  96. else break;
  97. }
  98. else
  99. {
  100. --top;
  101. }
  102. }
  103. convex.p[top++] = p[i];
  104. }
  105. if (convex.n == && (convex.p[] == convex.p[])) --convex.n;
  106. }
  107. }arr, ans;
  108.  
  109. int t, n;
  110.  
  111. int main()
  112. {
  113. scanf("%d", &t);
  114. while (t--)
  115. {
  116. scanf("%d", &n); arr.n = n;
  117. // cout << n << endl;
  118. for (int i = ; i < n; ++i) arr.p[i].scan(i + );
  119. arr.Graham(ans);
  120. for (int i = ; i < ans.n; ++i) printf("%d%c", ans.p[i].id, " \n"[i == ans.n - ]);
  121. }
  122. return ;
  123. }

H - Problem H. Monster Hunter

留坑。

I - Problem I. Random Sequence

留坑。

J - Problem J. Rectangle Radar Scanner

留坑。

K - Problem K. Transport Construction

留坑。

L - Problem L. Visual Cube

按题意模拟即可,分块解决

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int t, a, b, c, n, m;
  5. char ans[][];
  6.  
  7. int main()
  8. {
  9. scanf("%d", &t);
  10. while (t--)
  11. {
  12. memset(ans, , sizeof ans);
  13. scanf("%d%d%d", &a, &b, &c);
  14. n = (b + c) * + ;
  15. m = (a + b) * + ;
  16. for (int i = n, cnt = ; cnt <= c; ++cnt, i -= )
  17. {
  18. for (int j = ; j <= * a; j += )
  19. ans[i][j] = '+', ans[i][j + ] = '-';
  20. }
  21. for (int i = n - , cnt = ; cnt <= c; ++cnt, i -= )
  22. {
  23. for (int j = ; j <= * a; j += )
  24. ans[i][j] = '|';
  25. }
  26. for (int i = * b + , tmp = , cnt = ; cnt <= b + ; ++cnt, i -=, tmp += )
  27. {
  28. for (int j = + tmp, cntt = ; cntt <= a; ++cntt, j += )
  29. ans[i][j] = '+', ans[i][j + ] = '-';
  30. }
  31. for (int i = * b, tmp = , cnt = ; cnt <= b; ++cnt, tmp += , i -= )
  32. {
  33. for (int j = + tmp, cntt = ; cntt <= a; ++cntt, j += )
  34. ans[i][j] = '/';
  35. }
  36. for (int j = m, cntt = , tmp = ; cntt <= b + ; ++cntt, j -= , tmp += )
  37. {
  38. for (int i = + tmp, cnt = ; cnt <= c + ; ++cnt, i += )
  39. {
  40. ans[i][j] = '+';
  41. if (cnt <= c) ans[i + ][j] = '|';
  42. }
  43. }
  44. for (int j = m - , tmp = , cntt = ; cntt <= b; ++cntt, tmp += , j -= )
  45. {
  46. for (int i = + tmp, cnt = ; cnt <= c + ; ++cnt, i += )
  47. ans[i][j] = '/';
  48. }
  49. for (int i = ; i <= n; ++i)
  50. {
  51. for (int j = ; j <= m; ++j)
  52. if (!ans[i][j]) ans[i][j] = '.';
  53. ans[i][m + ] = ;
  54. printf("%s\n", ans[i] + );
  55. }
  56. }
  57. return ;
  58. }

M - Problem M. Walking Plan

题意:给出一张图,询问从$u -> v 至少经过k条路的最少花费$

思路:因为$k <= 10000$ 那么我们可以拆成 $k = x * 100 + y$ 然后考虑分块

$G[k][i][j] 表示 i -> j 至少经过k条路$

$dp[k][i][j] 表示 i -> j 至少经过 k * 100 条路$

然后查询的时候枚举中间点

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define N 210
  5. #define INFLL 0x3f3f3f3f3f3f3f3f
  6. #define ll long long
  7.  
  8. int t, n, m, q;
  9. ll G[N][][], dp[N][][];
  10.  
  11. inline void Init()
  12. {
  13. memset(G, 0x3f, sizeof G);
  14. memset(dp, 0x3f, sizeof dp);
  15. }
  16.  
  17. inline void Floyd()
  18. {
  19. for (int l = ; l <= ; ++l)
  20. for (int k = ; k <= n; ++k)
  21. for (int i = ; i <= n; ++i)
  22. for (int j = ; j <= n; ++j)
  23. G[l][i][j] = min(G[l][i][j], G[l - ][i][k] + G[][k][j]);
  24. for (int i = ; i <= n; ++i)
  25. for (int j = ; j <= n; ++j)
  26. for (int l = ; l >= ; --l)
  27. G[l][i][j] = min(G[l][i][j], G[l + ][i][j]); // at least K roads;
  28. for (int i = ; i <= n; ++i)
  29. for (int j = ; j <= n; ++j)
  30. dp[][i][j] = G[][i][j];
  31. for (int l = ; l <= ; ++l)
  32. for (int k = ; k <= n; ++k)
  33. for (int i = ; i <= n; ++i)
  34. for (int j = ; j <= n; ++j)
  35. dp[l][i][j] = min(dp[l][i][j], dp[l - ][i][k] + dp[][k][j]);
  36. }
  37.  
  38. inline void Run()
  39. {
  40. scanf("%d", &t);
  41. while (Init(), t--)
  42. {
  43. scanf("%d%d", &n, &m);
  44. for (int i = , u, v, w; i <= m; ++i)
  45. {
  46. scanf("%d%d%d", &u, &v, &w);
  47. G[][u][v] = min(G[][u][v], (ll)w);
  48. }
  49. Floyd(); scanf("%d", &q);
  50. for (int i = , u, v, k; i <= q; ++i)
  51. {
  52. scanf("%d%d%d", &u, &v, &k);
  53. int unit = floor (k * 1.0 / ), remind = k - unit * ;
  54. ll ans = INFLL;
  55. if (k <= ) ans = G[k][u][v];
  56. else
  57. {
  58. for (int j = ; j <= n; ++j)
  59. ans = min(ans, dp[unit][u][j] + G[remind][j][v]);
  60. }
  61. if (k > && remind == ) ans = min(ans, dp[unit][u][v]);
  62. printf("%lld\n", ans >= INFLL ? - : ans);
  63. }
  64. }
  65. }
  66.  
  67. int main()
  68. {
  69. #ifdef LOCAL
  70. freopen("Test.in", "r", stdin);
  71. #endif
  72.  
  73. Run();
  74. return ;
  75. }

2018 Multi-University Training Contest 3 Solution的更多相关文章

  1. 2018 Multi-University Training Contest 1 Solution

    A - Maximum Multiple 题意:给出一个n 找x, y, z 使得$n = x + y +z$ 并且 $n \equiv 0 \pmod x, n \equiv 0 \pmod y, ...

  2. 2018 Multi-University Training Contest 2 Solution

    A - Absolute 留坑. B - Counting Permutations 留坑. C - Cover 留坑. D - Game puts("Yes") #include ...

  3. 2018 Multi-University Training Contest 4 Solution

    A - Problem A. Integers Exhibition 留坑. B - Problem B. Harvest of Apples 题意:计算$\sum_{i = 0}^{i = m}C( ...

  4. 2018 Multi-University Training Contest 5 Solution

    A - Always Online Unsolved. B - Beautiful Now Solved. 题意: 给出一个n, k  每次可以将n这个数字上的某两位交换,最多交换k次,求交换后的最大 ...

  5. 2018 Multi-University Training Contest 6 Solution

    A - oval-and-rectangle 题意:给出一个椭圆的a 和 b,在$[0, b]中随机选择c$ 使得四个顶点在椭圆上构成一个矩形,求矩形周长期望 思路:求出每种矩形的周长,除以b(积分) ...

  6. 2018 Multi-University Training Contest 7 Solution

    A - Age of Moyu 题意:给出一张图,从1走到n,如果相邻两次走的边的权值不同,花费+1, 否则花费相同,求最小花费 思路:用set记录有当前点的最小花费有多少种方案到达,然后最短路 #i ...

  7. 2018 Multi-University Training Contest 8 Solution

    A - Character Encoding 题意:用m个$0-n-1$的数去构成k,求方案数 思路:当没有0-n-1这个条件是答案为C(k+m-1, m-1),减去有大于的关于n的情况,当有i个n时 ...

  8. 2018 Multi-University Training Contest 9 Solution

    A - Rikka with Nash Equilibrium 题意:构造一个$n * m$的矩阵,使得$[1, n * m]$ 中每个数只出现一次,并且纳什均衡只出现一次. 思路:从大到小的放置,每 ...

  9. 2018 Multi-University Training Contest 10 Solution

    A - Problem A.Alkane 留坑. B - Problem B. Beads 留坑. C - Problem C. Calculate 留坑. D - Problem D. Permut ...

随机推荐

  1. ssh通过密钥进行连接

    sshd服务提供两种安全验证的方法: 基于口令的安全验证:经过验证帐号与密码即可登陆到远程主机. 基于密钥的安全验证:需要在本地生成"密钥对"后将公钥传送至服务端,进行公共密钥的比 ...

  2. EventBus 简单原理(一)

    EventBus 1.根据文章最前面所讲的EventBus使用步骤,首先我们需要定义一个消息事件类: public class MessageEvent { private String messag ...

  3. vue.js2.0+elementui ——> 后台管理系统

    前言: 因为观察到vue.js的轻量以及实时更新数据的便捷性,于是新项目便决定使用vue.js2.0以及与之配套的elementui来完成.只是初次接触新框架,再使用过程中,遇见了各种各样“奇葩”的问 ...

  4. C++的virtual详解

    类的多态特性是支持面向对象的语言最主要的特性,有过非面向对象语言开发经历的人,通常对这一章节的内容会觉得不习惯,因为很多人错误的认为,支持类的封装的语言就是支持面向对象的,其实不然,Visual BA ...

  5. GMT时间转换为当地时间的方法

    1.取得当地时间与GMT时间的时间差 (new Date()).getTimezoneOffset()  //单位为分钟 2.GMT时间加上与当地时间的时间差 (new Date(GMTTime)) ...

  6. 如何实现UI层的松耦合

    UI层的松耦合主要是指html.css.js的松耦合 1.  将js代码从css中分离,即不使用expression 2.  将css从js中分离,尽量不要在js中直接操作css.如果需要操作,可以使 ...

  7. Python subprocess shell 编程规范

    使用subprocess通过shell调用另一个模块组件时,需要对返回的code进行判断.判断结果为执行失败时需要raise Exception,不然调用树过于复杂时,我们很难跟踪到异常发生的位置.s ...

  8. javascript关于链接的一些用法

    (1)javascript:openURL() http://www.kpdown.com/search?name=Ben Nadel 此URL后边有一个name参数,只不过参数的值竟然带了空格,这样 ...

  9. 什么是runtime?什么是webgl?

    一 什么是Runtime? Egret官方解释:https://www.egret.com/products/runtime.html 二.什么是WebGL渲染? egret官方解释:http://d ...

  10. Egret Wing4.0.3 合并资源图片问题

    一 发布项目时,选择合并图片资源 选择合图大小 发布后,图片合并.随机了图片名字.  二  随机名的问题 当资源不变更的情况下,多次发布,每次发布后资源的图片随机名是不变的. 现在改变preload组 ...