[关闭]
@dxbdly 2022-07-12T15:26:25.000000Z 字数 3561 阅读 166

7.11暑期模拟赛

2022暑


预估分数:

T1 T2 T3 Sum
100 100 100 300

实际分数:

T1 T2 T3 Sum
100 100 100 300

(吐槽T3数据,要不是有人发现了数据BUG就痛失AK)

T1 Chain

第一问统计叶子树,第二问直接依题意树形DP上来,签到题。

Tips:题面提示说注意可能有必要写手写栈,然后我就用的Tuopu,结果递归的也都过了,我因为用了STL比有些小常数递归的还慢(

  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 = 2 * 1e6 + 5, mod = 32416190071;
  14. int n;
  15. struct node {
  16. int v, nex;
  17. int w;
  18. }edge[maxn];
  19. int head[maxn], len, In[maxn], Out[maxn], f[maxn], root, Ans1;
  20. inline void make_map(int u, int v, int w) {
  21. len++;
  22. edge[len].nex = head[u];
  23. edge[len].v = v;
  24. edge[len].w = w;
  25. head[u] = len;
  26. }
  27. inline void Tuopu() {
  28. queue <int> Q;
  29. for(register int i = 1; i <= n; ++i) {
  30. if(!In[i]) Ans1++, Q.push(i);
  31. if(!Out[i]) root = i;
  32. }
  33. while(!Q.empty()) {
  34. int x = Q.front(); Q.pop();
  35. for(register int i = head[x]; i; i = edge[i].nex) {
  36. int y = edge[i].v, z = edge[i].w;
  37. f[y] = (f[y] + f[x] * z % mod) % mod, In[y]--;
  38. if(!In[y]) Q.push(y);
  39. }
  40. }
  41. }
  42. signed main() {
  43. // freopen("Chain.in", "r", stdin);
  44. // freopen("Chain.out", "w", stdout);
  45. n = read();
  46. for(register int i = 1; i < n; ++i) {
  47. int u = read(), v = read(), w = read();
  48. make_map(v, u, w), In[u]++, Out[v]++;
  49. }
  50. for(register int i = 1; i <= n; ++i) f[i] = read() % mod;
  51. Tuopu();
  52. printf("%lld\n%lld\n", Ans1, f[root]);
  53. return 0;
  54. }

T2 Prefix

算法:KMP+DP

计数题,考虑DP,子串,考虑定义状态 为 以 结尾的合法子串数量。

朴素方程:

可以发现这个check是个前缀等于后缀的形式,考虑利用 KMP 里的 数组

那么就是:

  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 = 2 * 1e5 + 5;
  13. char s[maxn];
  14. int n, Next[maxn], f[maxn], Ans;
  15. inline void Get_Next() {
  16. Next[0] = -1, Next[1] = 0;
  17. for(register int i = 2; i <= n; ++i) {
  18. int j = Next[i - 1] + 1;
  19. while(s[j] != s[i] && j) j = Next[j - 1] + 1;
  20. if(j) Next[i] = j;
  21. else Next[i] = 0;
  22. }
  23. }
  24. int main() {
  25. // freopen("Prefix.in", "r", stdin);
  26. // freopen("Prefix.out", "w", stdout);
  27. scanf("%s", s + 1), n = strlen(s + 1);
  28. Get_Next();
  29. for(register int i = 1; i <= n; ++i) {
  30. if(i % 2 == 0) f[i] = 1;
  31. if(Next[i] > 0) f[i] += f[Next[i]];
  32. Ans += f[i];
  33. }
  34. printf("%d\n", Ans);
  35. return 0;
  36. }

T3 Motor

很显然的分层图模型,这里采用二维 Dij

  1. //The Code Is From Dawn
  2. #include<bits/stdc++.h>
  3. #define Pi pair< pair<int, int>, int >
  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 maxm = 5 * 1e4 + 5, maxn = 1e4 + 5, INF = 1e9 + 7;
  14. int n, m, k, s, t;
  15. struct node {
  16. int v, nex;
  17. int w;
  18. }edge[maxm << 1];
  19. int head[maxn], len;
  20. int Dist[maxn][15], Vst[maxn][15];
  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 Dijstra() {
  29. memset(Vst, 0, sizeof(Vst));
  30. for(register int i = 1; i <= n; ++i)
  31. for(register int j = 0; j <= k; ++j) Dist[i][j] = INF;
  32. priority_queue < Pi > Q;
  33. Q.push(make_pair(make_pair(0, 0), s)), Dist[s][0] = 0;
  34. while(!Q.empty()) {
  35. int x = Q.top().second, fr = Q.top().first.second; Q.pop();
  36. if(Vst[x][fr]) continue;
  37. for(register int i = head[x]; i; i = edge[i].nex) {
  38. int y = edge[i].v, z = edge[i].w;
  39. if(Dist[y][fr] > Dist[x][fr] + z) {
  40. Dist[y][fr] = Dist[x][fr] + z;
  41. Q.push(make_pair(make_pair(-Dist[y][fr], fr), y));
  42. }
  43. if(fr < k && Dist[y][fr + 1] > Dist[x][fr]) {
  44. Dist[y][fr + 1] = Dist[x][fr];
  45. Q.push(make_pair(make_pair(-Dist[y][fr + 1], fr + 1), y));
  46. }
  47. }
  48. }
  49. }
  50. int main() {
  51. // freopen("Motor.in", "r", stdin);
  52. // freopen("Motor.out", "w", stdout);
  53. n = read(), m = read(), k = read(), s = read(), t = read();
  54. for(register int i = 1; i <= m; ++i) {
  55. int u = read(), v = read(), w = read();
  56. make_map(u, v, w), make_map(v, u, w);
  57. }
  58. Dijstra();
  59. int Ans = INF;
  60. for(register int i = 0; i <= k; ++i) Ans = min(Ans, Dist[t][i]);
  61. printf("%d\n", Ans);
  62. return 0;
  63. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注