[关闭]
@dxbdly 2022-10-06T09:01:20.000000Z 字数 2844 阅读 168

7.18暑期模拟赛

2022暑


T1 pellet

思维难度:,代码难度:

1.题意

个相同物品放入 个相同盒子中,盒子非空,求方案数(最小表示后不同即不同)。

2.解析

考虑 DP。

考试的时候好像傻逼了,没推出来。

听说这个转移和第二类 很像。

表示 个球, 个箱子的答案。

转移分两种,一种是全部都多放一个,一种是在最前面放一个

说起来十分简单,但是这转移的分类确实奇怪。

  1. //The Code Is From Dawn
  2. #include<bits/stdc++.h>
  3. #define int long long
  4. using namespace std;
  5. inline int read() {
  6. int x = 0;
  7. char c = getchar();
  8. bool f = 0;
  9. while(!isdigit(c)) f |= (c == '-'), c = getchar();
  10. while(isdigit(c)) x = (x * 10) + (c ^ 48), c = getchar();
  11. return f ? -x : x;
  12. }
  13. const int maxn = 5005, mod = 998244353;
  14. int n, k;
  15. int f[maxn][maxn];
  16. signed main() {
  17. // freopen("A.in", "r", stdin);
  18. // freopen("A.out", "w", stdout);
  19. n = read(), k = read();
  20. for(register int i = 1; i <= n; ++i) f[1][i] = 1;
  21. for(register int i = 2; i <= k; ++i)
  22. for(register int j = i; j <= n; ++j) {
  23. f[i][j] = (f[i - 1][j - 1] + f[i][j - i]) % mod;
  24. }
  25. printf("%lld\n", f[k][n] % mod);
  26. return 0;
  27. }

3.总结

奇奇怪怪的转移分类,积累。

T2 Tree

思维难度: 代码难度:

1.题意

节点树,有边权,找到最小的长度 满足 的路径,输出长度。

2.解析

显然可以二分答案。

那确定了长度,就是一个淀粉质板子判定。

  1. //The Code Is From Dawn
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. inline int read() {
  5. int x = 0;
  6. char c = getchar();
  7. bool f = 0;
  8. while(!isdigit(c)) f |= (c == '-'), c = getchar();
  9. while(isdigit(c)) x = (x * 10) + (c ^ 48), c = getchar();
  10. return f ? -x : x;
  11. }
  12. const int maxn = 2e5 + 5, INF = 1e9 + 7;
  13. int n, L, R;
  14. struct node {
  15. int v, nex;
  16. int w;
  17. }edge[maxn << 1];
  18. int head[maxn], len;
  19. int Siz[maxn], Maxx[maxn], root, Sum, Answer;
  20. int Vst[maxn];
  21. inline void make_map(int u, int v, int w) {
  22. len++;
  23. edge[len].nex = head[u];
  24. edge[len].v = v;
  25. edge[len].w = w;
  26. head[u] = len;
  27. }
  28. inline void Get_Siz(int x, int fa) {
  29. Siz[x] = 1;
  30. for(register int i = head[x]; i; i = edge[i].nex) {
  31. int y = edge[i].v, z = edge[i].w;
  32. if(y == fa) continue;
  33. Get_Siz(y, x), Siz[x] += Siz[y];
  34. }
  35. }
  36. inline int Get_Rt(int x, int fa) {
  37. int s = 1; Maxx[x] = 0;
  38. for(register int i = head[x]; i; i = edge[i].nex) {
  39. int y = edge[i].v, z = edge[i].w;
  40. if(y == fa || Vst[y]) continue;
  41. int nex = Get_Rt(y, x); s += nex;
  42. Maxx[x] = max(Maxx[x], nex);
  43. }
  44. Maxx[x] = max(Maxx[x], Sum - s);
  45. if(Maxx[x] < Maxx[root]) root = x;
  46. return s;
  47. }
  48. inline set<int> Calc(int x, int fa) {
  49. set<int> now; now.insert(0);
  50. for(register int i = head[x]; i; i = edge[i].nex) {
  51. int y = edge[i].v, z = edge[i].w;
  52. if(y == fa || Vst[y]) continue;
  53. set <int> Nex = Calc(y, x);
  54. for(auto j : Nex) now.insert(z + j);
  55. }
  56. return now;
  57. }
  58. inline void Solve(int x) {
  59. set<int> now; now.insert(0), Vst[x] = 1;
  60. for(register int i = head[x]; i; i = edge[i].nex) {
  61. int y = edge[i].v, z = edge[i].w;;
  62. if(Vst[y]) continue;
  63. set <int> Nex = Calc(y, x); set <int> :: iterator It;
  64. for(auto j : Nex) {
  65. It = now.lower_bound(L - j - z);
  66. if(It != now.end()) Answer = min(Answer, *It + j + z);
  67. }
  68. for(auto j : Nex) now.insert(j + z);
  69. Solve(y);
  70. }
  71. }
  72. int main() {
  73. // freopen("B.in", "r", stdin);
  74. // freopen("B.out", "w", stdout);
  75. n = read(), L = read(), R = read();
  76. for(register int i = 1; i < n; ++i) {
  77. int u = read(), v = read(), w = read();
  78. make_map(u, v, w), make_map(v, u, w);
  79. }
  80. Answer = INF, Solve(1);
  81. if(Answer > R) printf("-1\n");
  82. else printf("%d\n", Answer);
  83. return 0;
  84. }

3.总结

寄在不会淀粉质。

T3 Gcd

思维难度:,代码难度:

1.题意

求满足 的无序数对 的个数。

2.解析

异或可逆,所以

那么有:

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注