1004-神仙出神仙题给神仙做,蒟蒻想蒟蒻解得蒟蒻分

A

显而易见,答案为

\[C_n^m \]

反正这个显而易见我没看出来

试卷为小球,日期为盒子,那么我们就把问题转化成\(n\)个小球放入\(m\)个盒子中

等等,真的是m个盒子吗??

由题意可知,我们选择的,其实是m~n个球。由此,可以增加一个m+1号盒子,用来装剩下没有被选中的球。

这里,1~m号盒子是不能为空的,但是m+1号盒子是可以的,为了消除掉这个不同带来的影响,我们增加一个n+1号球,放在最后,保证无论如何m+1号盒子都不为空

插板法

\((n+1)-1\)个空格中放\((m+1)-1\)个板,将其隔为\(m+1\)个不为空的集合,所以答案为\(C_n^m\)

让我们来康康数据

id=1:

​ 不说了,打组合数的表

id=2:

​ 仔细想想,打个线性求逆的表+阶乘的表,乱搞操作一下

id=3:

​ 模数很小,Lucas定理水过

id=7:

​ n,m又大,模数又大,咋整啊

分段打表

wtf???

​ 跟id=2的情况类似,也是打阶乘表,不过\(10^9\)的表肯定打不下来,考虑到\(T\)很小,我们可以分段打表,在\(1\)~\(10^9\)中,每隔一百万就算一次阶乘(当然要%p)

举个例子:b[1]=1!,b[2]=1000000!,b[3]=2000000!,......
​ 每次最多再在打的表的基础算一百万次算出要求的阶乘,由于T很小,所以能过

​ 逆元直接用费马小定理(快速幂)

​ 然后继续乱搞

B

伪树上莫队

deaf做法:dfs序+HH的项链(我已经忘了黄黄的项链是个什么玩意了,只记得这个名字以及分块做法洛谷开\(O_2\)会T80

dfs序把树上问题转换成线性

离线,按区间右端点排序(由于一个点对应了一段dfs序的区间)。然后右指针移移移(移到当前询问的右端点为止

对于每一个数字我们记录一个Last数组:

last[x]:表示上一次出现的 跟dfn为x的种类相同 的位置

虚拟一个的A数组:

A[x]:表示编号为x的种类是否出现

树状数组:
维护区间和(每次询问x其实就是询问\([dfn[x],Out[x]]\)这一段区间)

右指针移动的时候。扫到下一个种类的时候就令A[x的种类]=1,再用树状数组维护,重点是假设当前讨论到的点的dfn是now,判断last[now的种类]是否=0,如果不为0,那必须在加一之后删除掉last[now的种类]造成的影响(+(-1)),用这种方法保证不会算重,设当前讨论到的右端点为R(R=q[i].r),那么ans=getsum(R) - getsum(q[i].l)

需要一边移右端点一边算ans

老板的方法:

先不考虑算重的情况,设f[x]:以x为根的子树的颜色种类我琢磨着这不就是x为根的子树所管辖的节点个数吗qwq

对于两个种类相同的点,他们会对他们的lca造成影响,所以需要再它们的lca上减上一个1

那么万一这个lca管辖范围的点有多个种类相同呢?

dfs序相邻的点的lca减一(因为不能保证这两个点的lca是上文的lca),然后你会发现刚好会找到x-1个点对,减x-1次(注意不要减多了)

......写不下去了,再见

刚刚发现老板题解只有两句话,靠之

考虑一种颜色的贡献,容易发现就是每个点加一,dfs序相邻的点的lca减一 ,然后求子树和

优势是可以支持修改和强制在线

Phenning的方法:

dfs算出每一个以x为根的子树的答案,记在ans[x]里,查询只需要O(1)

同样用树状数组维护区间和+dfs序乱搞

假设我们算到了以x为根的子树(已经将他的儿子们全部遍历过一遍):

用一个f[i]数组记录编号为i的种类出现的点的\(dfn_{max}\),每讨论到一个点就更新,因为是后续遍历,所以能保证当前讨论到的\(>=dfn[x]\)的f[i]都在以x为根的子树里面

显而易见ans[x]= 所有\(>=dfn[x]\)的f[i]求和,但是每次\(O(K)\)扫一遍肯定会T

考虑用一个cnt[dfn]记录\(=dfn\)的f[i]的个数,那么ans[x]就转化成了cnt[dfn[x]]~cnt[Out[x]]的一个和

由于f[i]是不断变化的,所以每次更改f[i]的值的时候需要将cnt[f[i]上一次的值]--;

同样需要一边递归一边算ans

C

由于题目要求,一定是从与起点相连的一个点出发,再回到与起点相连的另一个点

有三种做法:

1.将与起点相连的点提出来随机建新图

2.二进制分组

3.有规律的建新图

具体老板的题解:

可以暴力\(N^2logN\)枚举环上和1相邻的两个点,乱搞两点间的最短路即可(答案需要加上起点到其中一个点的边长和另外一个点到起点的边长)我连这个都没想到我果然药丸
考虑一次枚举多个点对,将一号点拆成2个,一个入点,一个出点,然后将所有和一号点相邻的点分成两个集合
其中一个集合连到出点,入点连到另一集合,那么跑一次入点到出点的最短路即可算出两个集合分别选一个点的所有环
两种处理方式 :

  1. 直接随机划分点集,多划分几次,错误概率为\(75%\)
  2. 按照二进制分组,依次枚举二进制位,以该位上的0/1作为划分依据, 复 杂 度\(Nlog^2N\)(不过并不能保证能过,万一出题人卡这个做法呢)

懒得写了,黄学长的博客写得不知道比我高到哪里去了,尤其是解法2,十分的详细

总结:

A:不会,乱搞,骗分,结果Lucas的部分T了

B:不会,乱搞,暴力

C:哇,神仙题,最基础的都没看出来

我恨捆绑测试!!!!

就算不是捆绑测试我也没分

期望得分:\(60 + 20 + 0 = 80\)

实际得分:\(45 + 20 + 0 = 65\)

今天学到的新知识:

1.分段打表

2.二进制分组

3.伪树上莫队

题外话

%出题人OBlack学长

三道题涉及10个方法,TQL.......

听说去年A题是什么都卡,一共涉及7个做法(我考试的时候就说为什么只有id=1/2/3/7,4 5 6去哪儿了,如今应该庆幸只出现了4种方法QwQ....)

posted @ 2019-10-04 17:05  羽错光阴  阅读(210)  评论(0编辑  收藏  举报