省选模拟总结
数学专题测试1:
T1 exLucas板子 不会就没什么好说的
T2 50pts 异或FWT板子 不会就没什么好说的
满分做法:先把原序列变成点值表达式,然后点值比较好的性质是可以直接运算。
问题等价于求$ans=\sum\limits_{i=0}^{p} x^{2^i}$,然后注意到模数很小,直接倍增就行了。
顺便放下FWT板子(
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 const int mod=998244353,inv=499122177; 5 int n,m,a[1<<18],b[1<<18],ta[1<<18],tb[1<<18]; 6 inline int read() { 7 int x=0;char c=getchar(),f=0; 8 for(;c>'9'||c<'0';c=getchar()) f=c=='-'; 9 for(;c>='0'&&c<='9';c=getchar()) x=x*10+c-48; 10 return f?-x:x; 11 } 12 inline void moded(int &x) { 13 if(x<0) x+=mod; if(x>=mod) x-=mod; 14 } 15 inline void and_FWT(int *f,int *g,int opt=1) { 16 for(int i=0;i<m;++i) g[i]=f[i]; 17 for(int i=2;i<=m;i<<=1) 18 for(int st=0;st<m-1;st+=i) 19 for(int j=st;j<st+i/2;++j) 20 moded(g[j]+=g[j+i/2]*opt); 21 return ; 22 } 23 inline void or_FWT(int *f,int *g,int opt=1) { 24 for(int i=0;i<m;++i) g[i]=f[i]; 25 for(int i=2;i<=m;i<<=1) 26 for(int st=0;st<m-1;st+=i) 27 for(int j=st;j<st+i/2;++j) 28 moded(g[j+i/2]+=g[j]*opt); 29 return ; 30 } 31 inline void xor_FWT(int *f,int *g,int opt=1) { 32 for(int i=0;i<m;++i) g[i]=f[i]; 33 for(int i=2;i<=m;i<<=1) 34 for(int st=0;st<m-1;st+=i) 35 for(int j=st;j<st+i/2;++j) { 36 int u=g[j],t=g[j+i/2]; 37 if(opt) moded(g[j]=u+t),moded(g[j+i/2]=u-t); 38 else g[j]=1ll*(u+t)*inv%mod,g[j+i/2]=1ll*(u-t)*inv%mod; 39 } 40 return ; 41 } 42 int main() { 43 m=1<<(n=read()); 44 for(int i=0;i<m;++i) a[i]=read(); 45 for(int i=0;i<m;++i) b[i]=read(); 46 or_FWT(a,ta),or_FWT(b,tb); 47 for(int i=0;i<m;++i) ta[i]=1ll*ta[i]*tb[i]%mod; 48 or_FWT(ta,ta,-1); 49 for(int i=0;i<m;++i) printf("%d ",ta[i]);puts(""); 50 and_FWT(a,ta),and_FWT(b,tb); 51 for(int i=0;i<m;++i) ta[i]=1ll*ta[i]*tb[i]%mod; 52 and_FWT(ta,ta,-1); 53 for(int i=0;i<m;++i) printf("%d ",ta[i]);puts(""); 54 xor_FWT(a,ta),xor_FWT(b,tb); 55 for(int i=0;i<m;++i) ta[i]=1ll*ta[i]*tb[i]%mod; 56 xor_FWT(ta,ta,0); 57 for(int i=0;i<m;++i) printf("%d ",(ta[i]+mod)%mod); 58 return 0; 59 }
T3 大神期望题
和三华聚顶很像,但我当时就没改出来233,看数据范围是区间DP。
先断环成链,这种题倒退很难,考虑正着推。
设f[i][j]表示区间[i,j-1]均被安排好了,j还未被安排的期望。
枚举最后一个被安排的k,基本的就是f[i][j]等于每个可能k的贡献累加,但是最后安排每个k的概率又不一样。
所以现在问题是求p(i,j,k)即在区间i,j中除了j最后一个是k的概率。
顺便设$g[i][j]=\sum\limits_{k=i}^{j-1} p(i,j,k)$即搞到[i,j]区间且实现了f[i][j]的概率
如果能求出来,那么直观地想有$f[i][j]=\sum\limits_{k=i}^{j-1} p(i,j,k)*(f[i][k]+f[k+1][j]+cost(i,k))$
上面的柿子其实是有问题的,后面那一坨每一项表示的是在k对[i,j]的贡献,但是所有k的概率总和不是1,所以要除一个$g[i][j]$表示期望。
其实还挺好理解的,把概率看成方案,这就是一个加权平均数。
好了,现在的问题集中到了求(p,i,j,k)上
一开始想的是GPBS
现在应该理解一下g[i][j],f[i][j]
g[i][j]是基于所有操作均落在[i,j]内的概率,都是区间合并,所以肯定只考虑了区间内部。
f[i][j]是单纯的一个期望,因为如果把概率看成方案的话,这是一个很纯的加权平均数。
重新定义:
g[i][j]表示所有操作均落在区间[i,j]且区间[i,j-1]安排好,j点未安排的方案除以所有操作均落在区间[i,j]的总方案
f[i][j]表示所有操作均落在区间[i,j]且区间[i,j-1]安排好,j点未安排的方案的代价总和除于方案数。
然后p(i,j,k)就显然了。k作为分割点尚未被安排,那么k左右两侧一定是分别独立的。
假设ls是[i,k-1]的"."的个数,rs是[k+1,j]的"."的个数
直接有柿子:$p(i,j,k)=C_{ls+rs+1}^{ls} g[i][k] (k-i+1)^{ls+1} g[k+1][j] (j-k)^{rs}/(j-i+1)^{ls+rs+1}$
数学专题测试2:
T1 杜教筛+莫比乌斯反演。
记一个小东西:在n个物品中选k个数,每个数可以任意选,而且选出来k个数无顺序(组合)
每个数可以任意选很恶心,假如说每个数只能选一个,那么实际上一个数代表着一段区间,还有位置2~k位置的空白球,空白球即与前一位置一样。
T2 BSGS+矩阵快速幂
设f(p)表示递推序列$g_x=ag_{x-1}+bg_{x-2}\ mod\ p$的循环节
有结论:
- 若a,b互质,那么$f_{ab}=lcm(f_a,f_b)$
- 对于一个质数p来说,$f_{p^k}=f_{p}p^{k-1}$
- $f_x|(x+1)(x-1)$
然后就没啥了。
T3 大力推柿子,有一些值得记录的技巧:
- 对于两个数在指数上相乘的形式如$p^{2ab}$可以化成$p^{(a+b)^2-a^2-b^2}$,这样就可以卷了
- 两数相加为定值,两数相减为定值均可以卷积,但一定要注意卷积长度!!!!
- 剩下的就是对卷积的灵活运用了
数学专项测试3:
T1 大神DP,按二进制位考虑。
T2 莫比无私反演,主要是想不到柿子,如果能把题目转化成循环节长度为n的个数就会做了。
T3 不会咕了。
省选模拟4:
T1 把一个圆转化成两个半圆,插入的时候查找前驱后继就好了。
T2 可以证明$ans_{i,j}=lcm(i,i+1...j)$,然后问题转化为区间lcm,n很小枚举每个数,考虑当前数的贡献,由于每次都是后缀,只要把最靠近它的改变就好了,具体来说,质因数分解,对于每个$p^q$,找到离他最近的也具有p因子的数,除掉,,这个过程可以用栈,然后用可持久化线段树记录就好了。
T3 不会,咕了。
省选模拟5:
T1 没什么好说的。
T2 记一点东西:
$B_{0}=1$,$\sum\limits_{i=0}^{n} C_{n+1}^{i}B_{i}=0$
这个是求$B^{-}$,$B^{+}$与$B^{-}$第一项互为相反数,其他都一样。
一般化柿子用$B^{+}$,也有时用$B^{-}$
$$\sum\limits_{i=1}^{n}i^k=\frac{1}{k+1}\sum\limits_{i=0}^{k} C_{k+1}^{i}B_{i}^{+}n^{k+1-i}$$
$$\sum\limits_{i=0}^{n}i^k=\frac{1}{k+1}\sum\limits_{i=0}^{k} C_{k+1}^{i}B_{i}^{-}(n+1)^{k+1-i}$$
自然数幂和是一个多项式,项数为k,参数为n,用递推公式搞一搞就好了。
拉格朗日插值也可以求自然数幂和,优化一下就是$O(k)$了。
这个题也可以用插值直接插2333
T3 LCT的每一棵splay是一条链,也就是说splay的根的父亲是当前splay的深度最小的点在原树的父结点。
然后就挺麻烦的。
省选模拟6
T1 根号思想,当时zzh学长大肆宣扬根号算法,然而并没有听555
类似分块,分块的复杂度对是因为把询问劈成了整块和散块,然后整块的数量很少,可以直接维护信息,然而散块的代价很小,可以直接暴力。
所以复杂度为$O(n\sqrt{n})$。
然后它可以有很多扩展,不过本质都是大块数量很少,小块代价很小。
典型的有三元环计数,暴力是bitset$O(n^2/w)$的,其实更暴力的是$O(m^2)$的,正解是从度数大的向度数小的连边,现在根据点的度数划分,度数$>\sqrt{n}$的为重点,度数$<\sqrt{n}$的为轻点,那么重点代价很大但是数量很少,轻点虽然多但是代价很小。
也就是重点代价虽然是$O(m)$级别,但是只有$\sqrt{m}$个,同时单个点的代价不会超过$O(m)$即被拓展次数不超过$O(\frac{m}{k})$,拓展其他点不超过$O(k)$。
考虑轻点,轻点就随便了,总的被拓展次数不超过$O(m)$,拓展其他点不超过$O(k)$
其实本质还是让代价大的大点尽量少地出现在中间位置,而让轻点随便弄。
今天T1也类似,不过是真正划分了轻重点,对于轻点直接维护它对周围的贡献,对于重点直接统计信息。
这样的话维护轻点的代价不超过$O(m\sqrt{m})$,统计重点的复杂度也不超过$O(m\sqrt{m})$
T2 思博题
T3 LIS&LDS 神题
说一下暴力思路,显然LIS&LDS的转移是一张拓扑图,现在问题是在一个有两种边的拓扑图上求两条不相交的路径
考虑DP dp[i][j]表示当前LIS在i点 LDS在j点的可行性,转移的时候怎么保证不相交?由小的去转移,可以这样去想:
若当前该去转移i了,那么j一定>i,且既然j能到那去,那么j上次一定比i小,也就是:i往前走,除了j位置都是合法的,很巧妙的思想。
正解很好理解
省选模拟测试7
考试的时候心态崩了,寻思着调T2嘻嘻嘻
T1 原题,我不会,我还写过题解2333333区间修改,单点需求要差分
T2 思博题
T3 神DP,首先$O(n^2)$DP显然,然后发现并不好优化,状态数爆炸,转移数较少的可以考虑用差分表维护。
这个是满足单调性的,初态肯定满足,后面每次变化都不会丧失这个单调性,所以是对的。
支持单点插入,区间加,显然可以用平衡树维护。
省选模拟测试8
这次考试。。。想到T1正解就没去打T3暴力,结果T1少了个特判挂成55
T1 分块题,因为显然询问应该满足单调性,分块维护单调性,支持单点询问,如果空间给足的话就很简单。
没给足就暴力重构啊,注意排序的时候归并和sort一个$O(n\sqrt(n))$,一个$O(n\sqrt(nlogn))$
T2 很强的一道题,k为奇数的直接判掉,下面只讨论k为偶数的情况
首先我们只考虑每个联通块(这样一定不会使答案变劣)
有一个引理若$gcd(a_1,a_2.....a_n,p)=1$,那么$\sum k_ia_i==1 (mod\ p)$
证明的话,n=2的时候显然,后面每加一个数就得多一个数的公共gcd
这玩意有啥用?因为无向且联通所以一定可以构造出一种方案每条边经过两次回到起点,而且还可以反复横跳几次,所以一定可以构造出所有的2的倍数
这个时候如果存在从起点到终点的偶路,就一定是0,反之是1,并查集随便搞一下就好了。
T3 网络流题,用最小割显然可以保证每条路径至少一条边被割,如何保证至多??反边流量INF就好了。
若存在一条路径割掉大于一条边的情况,那么一定可以继续增广,也即用一条边来代替非法边。
省选模拟测试9
T1暴力打挂&T3模数打错=AFO
T1 化一化柿子发现只与i,j,lca有关,建虚树就行了。
T2 asasasas
T3 asasasas
省选模拟测试10
数据水,就没什么好说的。
T1 没有存在的意义
T2 正解|DDP,一会去打DDP。
一个结论:最大独立集=总点数-最大匹配。
首先对于一条匹配边的两端的匹配点,一定只有其中一个点与非匹配点有连边,如果两个都有的话,显然就不是最大匹配了。
每次选与非匹配点连边的点就好了。
然后就直接树剖+线段树了(其实我写了很多,消失了)
T3 期望计数十合一待改
省选模拟测试11
T1数组没清空从暴力选手退化成垃圾选手
T1 不会
T2 后缀自动机+树上启发式合并。
转化题意:找到不同两点,最大化其在原树和parent tree的lca深度之和。
一个小结论:相邻dfs序两个lca深度最大
考虑线段树启发式合并,维护子树内在另一棵树上最大lca深度,如果有信息错误,答案一定不会更优。
T3 平衡树维护动态排名信息
首先显然相对大小永远不会改变,但是排名不好查。
这时候就体现splay的大神了:splay到根,左儿子size即为rank