考试总结:这次考试,我非常真实地感觉到了自己能力的提高,具体来说,在之前的考试中,读完题之后我只会想到暴力的思路,甚至有的题连暴力都打不出来,但是这次在考场上我已经有了自己的一些想法,有了一个深入思考的过程,自己演算,推式子也写了几张草稿纸,对于测试点的部分分也有了一定的把握。在改题的时候,我基本上都是研究下发的题解自己该出来的,总之,这几次考试我的收获很大,所有的付出都是值得的。

T1 玩具

思路:我们模拟一下操作过程,那么很显然,最终得到的应该是一颗树,那么如果我们不看 1 结点,那么应该是一个森林,这道题是个 dp,我们设i个点的森林,有j个点在第一颗树的概率\(dp_{i,j}=dp_{i-1,j-1}\times(j-1)\times(inv_i)+dp_{i-1,j}\times(i-j)\times(inv_i)\)设第一棵树有i 个点,深度不超过j的概率 \(f_{i,j}=g_{i-1,j-1}\),设有i个点的森林,深度不超过j的概率 \(g_{i,j}=\sum\limits_{k=1}^{i}f_{k,j}\times g_{i-k,j}\times {dp_{i,k}}\),这个方程式比较好理解,可以结合画图理解,那么注意细节问题就是在转移的时候,我们可以用刷表法,即用当前的更新后面的,还要注意当前枚举不到的状态要在当前转移过去v,具体实现见代码:

AC_Code

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define re register int
  4. #define lc rt<<1
  5. #define rc rt<<1|1
  6. #define mid ((l+r)>>1)
  7. #define re register int
  8. #define ii inline int
  9. #define iv inline void
  10. using namespace std;
  11. const int N=210;
  12. long long n,p,ans;
  13. int inv[N],g[N][N],f[N][N],dp[N][N];
  14. ii read()
  15. {
  16. int x=0,f=1;
  17. char ch=getchar();
  18. while(ch<'0'||ch>'9')
  19. {
  20. if(ch=='-')
  21. f=0;
  22. ch=getchar();
  23. }
  24. while(ch>='0'&&ch<='9')
  25. {
  26. x=(x<<1)+(x<<3)+(ch^48);
  27. ch=getchar();
  28. }
  29. return (f)?x:(-x);
  30. }
  31. #undef int
  32. int main()
  33. {
  34. /*
  35. i个点的森林,有j个点在第一颗树的概率
  36. dp[i][j]=dp[i-1][j-1]*(j-1)*inv[i]+dp[i-1][j]*(i-j)*inv[i];//拿出j-1个,加上拿另外的 i-j个
  37. i个点的树,深度不超过j的概率
  38. f[i][j]=g[i-1][j-1]//画图显然
  39. i个点的森林,深度不超过j的概率
  40. g[i][j]=sum[k=1 ->i] f[k][j]*g[i-k][j]*dp[i][k];
  41. */
  42. #define int long long
  43. n=read();
  44. p=read();
  45. inv[1]=1;
  46. for(re i=2;i<=n;i++)
  47. {
  48. inv[i]=(p-(p/i))*inv[p%i]%p;
  49. }
  50. dp[1][1]=1;
  51. for(re i=2;i<=n;i++)
  52. {
  53. for(re j=1;j<=i;j++)
  54. {
  55. dp[i][j]=(dp[i-1][j-1]%p*(j-1)%p*inv[i]+dp[i-1][j]%p*(i-j)%p*inv[i])%p;
  56. }
  57. }
  58. for(re i=0;i<=n;i++)
  59. {
  60. g[0][i]=1;
  61. f[1][i]=1;
  62. }
  63. for(re i=1;i<=n;i++)
  64. {
  65. for(re j=0;j<i;j++)
  66. {
  67. for(re k=1;k<=i;k++)
  68. g[i][j]=(g[i][j]%p+f[k][j]%p*g[i-k][j]%p*dp[i][k]%p+p)%p;
  69. f[i+1][j+1]=g[i][j];
  70. for(re k=j+1;k<=n;k++)
  71. f[i+1][k]=f[i+1][j+1];
  72. }
  73. for(re k=i;k<=n;k++)
  74. g[i][k]=g[i][i-1];
  75. }
  76. for(re i=1;i<n;i++)
  77. ans=(ans%p+i*(f[n][i]-f[n][i-1]+p)%p)%p;
  78. printf("%lld\n",ans);
  79. return 0;
  80. }


T2 y

思路:显然是一个状压dp,我们设 \(f_{i,j,s}\)表示当前走了 i 步,终点为 j,当前状态为 S 是否可以达到,

那么\(f_{i+1,to[j],s<<1|val[k]}|=f_{i,j,s}\),因为时间和空间的限制,我们直接枚举所有点转移会 T飞,所以我们考虑枚举路径的中点,正着作一遍dp,倒着做一遍dp,同时记录每个点作为中点时的状态,最后输出即可。

注意细节:我们存储状态的时候一定要最后单独开一个for循环,不要在计算的过程中存储,否则直接T飞

AC_Code

  1. #include<bits/stdc++.h>
  2. #define re register int
  3. #define lc rt<<1
  4. #define rc rt<<1|1
  5. #define mid ((l+r)>>1)
  6. #define ii inline int
  7. #define iv inline void
  8. #define head heaaaddddd
  9. #define next netyurywi
  10. using namespace std;
  11. const int N=1e4+10;
  12. int n,m,d,tot;
  13. long long ans=0;
  14. int to[N<<1],next[N<<1],head[N],val[N<<1];
  15. int f[12][95][1<<12], f2[12][95][1<<12];
  16. vector<int> v1[95],v2[95];
  17. bool vis[1<<22];
  18. ii read()
  19. {
  20. int x=0,f=1;
  21. char ch=getchar();
  22. while(ch<'0'||ch>'9')
  23. {
  24. if(ch=='-')
  25. f=0;
  26. ch=getchar();
  27. }
  28. while(ch>='0'&&ch<='9')
  29. {
  30. x=(x<<1)+(x<<3)+(ch^48);
  31. ch=getchar();
  32. }
  33. return (f)?x:(-x);
  34. }
  35. iv add(int x,int y,int z)
  36. {
  37. to[++tot]=y;
  38. next[tot]=head[x];
  39. head[x]=tot;
  40. val[tot]=z;
  41. }
  42. int main()
  43. {
  44. n=read();
  45. m=read();
  46. d=read();
  47. int a,b,c;
  48. for(re i=1;i<=m;i++)
  49. {
  50. a=read();
  51. b=read();
  52. c=read();
  53. add(a,b,c);
  54. add(b,a,c);
  55. }
  56. int d1=(d>>1);
  57. int d2=d-d1;
  58. f[0][1][0]=1;
  59. for(re i=0;i<d1;i++)
  60. {
  61. for(re j=1;j<=n;j++)
  62. {
  63. for(re k=head[j];k;k=next[k])
  64. {
  65. int p=to[k];
  66. for(re s=0;s<(1<<i);s++)
  67. {
  68. f[i+1][p][s<<1|val[k]]|=f[i][j][s];
  69. }
  70. }
  71. }
  72. }
  73. for(re i=1;i<=n;i++)
  74. f2[0][i][0]=1;
  75. for(re i=0;i<d2;i++)
  76. {
  77. for(re j=1;j<=n;j++)
  78. {
  79. for(re k=head[j];k;k=next[k])
  80. {
  81. int p=to[k];
  82. for(re s=0;s<(1<<i);s++)
  83. {
  84. f2[i+1][p][s<<1|val[k]]|=f2[i][j][s];
  85. }
  86. }
  87. }
  88. }
  89. for(re i=1;i<=n;i++)
  90. {
  91. for(re j = 0;j<(1 << d1);j++)
  92. {
  93. if(f[d1][i][j])
  94. v1[i].push_back(j);
  95. }
  96. }
  97. for(re i=1;i<=n;i++)
  98. {
  99. for(re j=0;j <(1<<d2);j++)
  100. {
  101. if(f2[d2][i][j])
  102. v2[i].push_back(j);
  103. }
  104. }
  105. for(re k=1;k<=n;k++)
  106. {
  107. for(re i=0;i<v1[k].size();i++)
  108. {
  109. for(re j=0;j<v2[k].size();j++)
  110. {
  111. if(vis[v1[k][i]<<(d2)|v2[k][j]])
  112. continue;
  113. vis[v1[k][i]<<(d2)|v2[k][j]]=1;
  114. ++ans;
  115. }
  116. }
  117. }
  118. printf("%lld\n",ans);
  119. return 0;
  120. }


T3 z

留坑

noip模拟测试20的更多相关文章

  1. NOIP模拟测试20「周·任·飞」

    liu_runda出的题再次$\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%$ 任 题解 题目中为什么反复强调简单路径,没有环 没有环的图中点数-边数=联通块数 前缀和维护边 ...

  2. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  3. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

  4. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  5. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  6. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  7. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

  8. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  9. 2019.7.29 NOIP模拟测试10 反思总结【T2补全】

    这次意外考得不错…但是并没有太多厉害的地方,因为我只是打满了暴力[还没去推T3] 第一题折腾了一个小时,看了看时间先去写第二题了.第二题尝试了半天还是只写了三十分的暴力,然后看到第三题是期望,本能排斥 ...

随机推荐

  1. MySQL 为什么使用 B+ 树来作索引?

    什么是索引? 所谓的索引,就是帮助 MySQL 高效获取数据的排好序的数据结构.因此,根据索引的定义,构建索引其实就是数据排序的过程. 平时常见的索引数据结构有: 二叉树 红黑树 哈希表 B Tree ...

  2. MetingJS 是如何配合 Aplayer 加载歌单的?

    Meting.js 介绍 Meting.js 依赖 APlayer.js,扩展了 APlayer.js 的功能,能够使 APlayer.js 加载网易云音乐.QQ 音乐.虾米音乐中的歌单. 安装 &l ...

  3. Centos ulimit设置

    1.三处配置 1. 系统编译时默认设置文件(centos7新增) 服务配置 /etc/systemd/system.conf 用户配置 /etc/systemd/user.conf 2. PAM模块配 ...

  4. SpringCloud微服务(基于Eureka+Feign+Hystrix+Zuul)

    一.搭建注册中心 1.1.创建一个cloud-service项目 1.2:POM文件依赖 1 <?xml version="1.0" encoding="UTF-8 ...

  5. Pandas高级教程之:GroupBy用法

    Pandas高级教程之:GroupBy用法 目录 简介 分割数据 多index get_group dropna groups属性 index的层级 group的遍历 聚合操作 通用聚合方法 同时使用 ...

  6. 其他:Spring5.0框架源码导入IDEA

    1.下载Spring spring-framework-5.0.4.RELEASE下载地址:https://github.com/spring-projects/spring-framework/re ...

  7. jar\war\SpringBoot加载包内外资源的方式,告别FileNotFoundException吧

    工作中常常会用到文件加载,然后又经常忘记,印象不深,没有系统性研究过,从最初的war包项目到现在的springboot项目,从加载外部文件到加载自身jar包内文件,也发生了许多变化,这里开一贴,作为自 ...

  8. 长按短按控制LED灯-ESP32中断处理

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include "freertos ...

  9. 单点登录(SSO)实现原理(转)

    简介 单点登录是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的保护资源,若用户在某个应用系统中进行注销登录,所有的应用系统都不能再直接访问保护资源,像一些知名的大型网站,如:淘 ...

  10. 【论文小综】基于外部知识的VQA(视觉问答)

    ​ 我们生活在一个多模态的世界中.视觉的捕捉与理解,知识的学习与感知,语言的交流与表达,诸多方面的信息促进着我们对于世界的认知.作为多模态领域的一个典型场景,VQA旨在结合视觉的信息来回答所提出的问题 ...