以为有必要在NOI以前开一篇学习内容记录。
至于为何要取这个标题呢?也许并无什么特殊的借口吧。数组
在LOJ上搬了三道原题给你们考了考,而后你们都在考试就我一我的在划水。函数
给一个串\(S\),\(q\)次询问知足是串\(S[l_1,r_1]\)的前缀且是串\(S[l_2,r_2]\)的后缀的最长回文串长度。\(|S|,q\le2\times10^5\)学习
把串\(S\)反过来接在后面建回文树,而后就是求两个点的公共祖先中深度不超过两子串长的深度最大值。优化
有\(n\)个球,其中\(m\)个是红色的,其他的是蓝色的,从中随机选出\(k\)个,若选出了\(x\)个红球则得分为\(x^L\)。求指望得分模\(998244353\)。共\(T\)组数据,每组数据的\(L\)是相同的。\(T\le200,L\le2\times10^5,m,k\le n\le 2\times10^7\)ui
\[\binom{n}{k}Ans=\sum_{i=0}^k\binom{m}{i}\binom{n-m}{k-i}i^L\\=\sum_{i=0}^k\binom{m}{i}\binom{n-m}{k-i}\sum_{j=0}^LS(L,j)j!\binom{i}{j}\\=\sum_{j=0}^LS(L,j)j!\sum_{i=0}^k\binom{m}{i}\binom{n-m}{k-i}\binom{i}{j}\\=\sum_{j=0}^LS(L,j)j!\binom{m}{j}\sum_{i=0}^k\binom{m-j}{i-j}\binom{n-m}{k-i}\\=\sum_{j=0}^LS(L,j)j!\binom{m}{j}\binom{n-j}{k-j}\]
预处理第\(L\)行第二类斯特林数便可。spa
交互题。一棵\(n(n\le1000)\)个节点的树,每次能够给交互库一个长度为\(n\)的数组\(d_i\),交互库会对于每一个\(i\),在树上标记与点\(i\)距离不超过\(d_i\)且不为\(i\)自己的全部点,而后返回一个\(01\)串表示哪些点有标记。你须要在\(80\)次询问内还原出树的形态。.net
定义\(query(s,t)\)表示作一次询问,将\(s\)集合中包含的全部数的\(d_i\)设为\(t\),其他的\(d_i\)为\(0\)。其返回值为一个集合\(s'\)。
第一步是求出每一个点到\(1\)号点的距离。动态维护\(s_0\)表示到\(1\)号点距离为\(2^k\)的偶数倍的点集,\(s_1\)表示到\(1\)号点距离为\(2^k\)的奇数倍的点集,以及一个集合数组\(S\),其第\(i\)位\(S_i\)表示到\(1\)号点距离为\([(i-1)\times2^k,i\times2^k)\)的全部点。初始时\(k_0=\lceil\log n\rceil\),\(s_0=\{1\},s_1=\varnothing,S=\{\{1,2...n\}\}\)。每次将\(k\)减\(1\),并询问\(query(s_0,2^k),query(s_1,2^k),query(s_0,2^k-1),query(s_1,2^k-1)\),显然\(s_0'=s_0\cup s_1\),而后经过一些集合操做能够获得\(s_1'\),同时将每一个\(S_i\)分裂为\(S_{2i}\)与\(S_{2i+1}\)后能够获得\(S'\)。重复此过程直到\(k=0\),每次须要作\(4\)次询问,总询问次数为\(4\log n\)。
接下来考虑对每一个点求其父亲编号。对于每一个深度\(d\),枚举\(i\in[0,\lceil\log n\rceil)\),将该深度全部节点中二进制位第\(i\)位为\(1\)的位置加入集合\(s\)并询问\(query(s,1)\),而后再枚举全部被标记到的\(d+1\)深度的节点更新答案。看上去须要\(n\log n\)次询问,但实际上\(\%3\)相等的深度能够一块儿作询问,所以就只须要\(3\log n\)次询问了。
总询问次数\(7\log n\)。code
给一个长度为\(n\)且每一个元素都在\([1,c]\)的数列\(a_i\),定义其一个子序列的权值为最大的\(k\)知足全部长度为\(k\)的全部元素在\([1,c]\)的序列均在这个子序列中做为子序列出现过。先要求对于\(i\in[0,n]\)求有多少\(a_i\)的子序列知足其权值刚好为\(i\)。\(n,c\le3000\),答案对\(998244353\)取模后输出。递归
权值为\(k\)意味着子序列至多能够分为\(k\)段使每段内均包含\([1,c]\)的全部数。考虑\(dp\)。设\(f_{i,j}\)表示前\(i\)个数已经分了\(j\)段且\(i\)刚好是第\(j\)段的最后一个数的方案数,注意为了不算从算重,须要强制分段时每段最后一个数字是段内第一次出现,能够从\(f_{i,j}\)转移到\(f_{k,j+1}\),转移系数是一堆\(2^x-1\)的乘积。记\(ans_j\)表示答案,那么就能够用\(f_{i,j}\)贡献给\(ans_j\),这里须要乘上\(i\)后面随便选不构成新的一段的方案数,这个系数能够在\(dp\)的过程当中计算出。这种作法的总复杂度是\(O(\frac{n^3}{c})\)的。
在\(c\)很小时上述作法没法经过本题。不过咱们还有一个更加简单的\(O(\frac{n^22^c}{c})\)的作法,将二者结合后便可经过本题。队列
给出一个\(m\)次多项式\(G(x)\)以及\(n\)个数\(x_i\),有一个\(n\)次项系数为\(1\)的\(n\)次多项式\(F(x)\)对于全部的\(x_i\)均知足\(F(x_i)=G(x_i)\),求\(F(k)\)。\(m<n\le5\times10^6\)
令\(H(x)=F(x)-G(x)\),则\(H(x)\)为一个\(n\)次多项式,且\(n\)个零点即为\(\{x_i\}\)。故\(F(x)=G(x)+\prod_{i=1}^n(x-x_i)\)。
一个\(n\times m\)的网格,每一个格子上有一个数\(0/1\),初始时会读入\(k\)个位置\((x_i,y_i)\)表示该位置上的数是\(1\),其他位置上的数均是\(0\)。每次操做能够将某一行或者某一列的全部数取反,求最少多少次操做后可使全部位置都变成\(0\)。有\(q\)次修改操做,为对输入的某一行或者某一列取反,要求在每次修改后求出答案。数据保证始终有解。\(n,m\le10^6,k,q\le3\times10^5\)
因为保证有解,所以任意两行要么全等要么所有相反。维护与第一行不一样的行数\(A\)以及第一行\(1\)的数量\(B\),答案为\(\min(A+B,n+m-A-B)\)。\(A,B\)都可动态维护,复杂度线性。
一个字符集大小为\(n\)的字符串,每次有\(p_i\)的几率向后添加字符\(i\),当出现连续两个相同字符时中止操做。求中止时字符串的指望长度。\(n\le10^7, \sum_{i=1}^np_i=1\)
设\(f_i\)表示结束时长度为\(i\)的几率,\({f_k}_i\)表示结束时长度为\(i\)且最后一个字符为\(j\)的几率,\(g_i\)表示长度为\(i\)未结束的几率,\(F(x),F_k(x),G(x)\)分别为三者的几率生成函数。因而就有以下的一些等式:
\[F(x)+G(x)=1+G(x)x\\G(x)(p_kx)^2=F_k(x)(1+p_kx)\]
对前式求导并代入\(x=1\)可得
\[F'(x)+G'(x)=G'(x)x+G(x)\\F'(1)=G(1)\]
再将\(x=1\)代入后式可得
\[\frac{G(1)p_k^2}{1+p_k}=F_k(x)\\\sum_{i=1}^n\frac{p_i^2}{1+p_i}G(1)=\sum_{i=1}^nF_i(1)=F(1)=1\\G(1)=\frac{1}{\sum_{i=1}^n\frac{p_i^2}{1+p_i}}\]
线性求逆元便可作到线性复杂度。
给一个字符串\(S\),\(q\)次询问从\(S\)中选出\(m\)个子串(能够为空)顺序拼接起来后能够获得多少种本质不一样的串。\(|S|,q\le10^5,m\le10^{10}\)
为了不算重,一种可行的策略是,全部方案的子串选取都应该尽可能靠后。换言之,对于一个选取方案中相邻的两个子串\(t_i,t_{i+1}\),应知足\(t_{i+1}\)前接上\(t_i\)的最后一个字符后不为原串\(S\)的子串。
记\(dp_{i,j}\)表示考虑了最后\(i\)个子串,当前已构造串的第一位字符是\(j\)的方案数。能够发现转移大体形如\(dp_{i+1,k}=\sum_{j}dp_{i,j}coef_{j,k}+C_k\),这里的\(coef_{j,k}\)和\(C_k\)都可以经过后缀自动机上\(dp\)求出。这一步的复杂度为\(O(\sigma n)\)。
能够发现上述\(dp\)能够写成矩阵的形式。因为\(q\)次询问的转移矩阵都是同样的,所以能够预处理出转移矩阵的\(1,2,3...\sqrt m,2\sqrt m,3\sqrt m...\)次幂,能够将复杂度作到\(O((\sqrt m+q)\sigma^3)\),没法经过本题。
考虑答案是一个行向量乘上转移矩阵的\(m\)次幂再乘上一个列向量的结果。所以能够从前日后维护前缀行向量以及后缀列向量,复杂度能够作到\(O(m\sigma^2+q\sigma)\),能够经过本题。
参加了学校里的学考模拟,又垫底了。
懒得写了本身看吧......
一个结论是,对于任意的\(x\),\(10x+[0,9]\)这\(10\)个数的答案之和必定是\(45\)。
所以只须要暴力计算最后的不超过\(9\)个数便可。
然而这样\(TLE\)了。
因此就只计算\(1\)个数就好了。
给两个长度分别为\(n\)和\(m\),字符集大小为\(3\)的串,求其最长公共不降子序列。\(n,m\le10^6\)
一个显然的思路是,枚举从前日后选了多少个\(1\),枚举从后往前选了多少个\(3\),中间的部分全都选\(2\)。考虑优化这个过程,从大到小枚举选择了多少个\(1\),维护从后往前选\(3\)数量的决策集合(只添不删),假设从后往前选了\(i\)个\(3\)后两个串前面分别剩下\(a_1,a_2\)个\(2\),当前枚举选了\(j\)个\(1\)致使两个串的前缀分别有\(b_1,b_2\)个\(2\)不能选(固然这里要保证\(i,j\)这一对是合法的),那么此时\(2\)的贡献就是\(\min(a_1-b_1,a_2-b_2)\)。这个东西能够根据\(a_1-a_2,b_1-b_2\)的大小讨论,而后维护两棵线段树/\(BIT\)就好了。时间复杂度\(O(n\log n)\)。
上午参加了学校里的学考模拟,又垫底了。
下午开始写2018 Multi-University Training Contest 2,差很少作完了,题解啥的明天再补。
上午在家里颓颓颓。
下午过来查成绩。竟然查不到,果真停课选手没有人权。
求\(\int_{l_1}^{r_1}\int_{l_2}^{r_2}...\int_{l_n}^{r_n}|x_1+x_2+...+x_n|dx_1dx_2...dx_n\)。\(n\le15\),答案模\(998244353\)后输出。
将积分展开,最终是要在函数\(F(x)=\text{sgn}(x)x^{n+1}\)上求\(2^n\)个点值,\(dfs\)的话能够作到\(O(2^n\log n)\)。
对于一个\(n\)阶排列,记每一个数向左第一个大于它的位置为\(l_i\)(不存在记为\(0\)),记每一个数向右第一个大于它的位置为\(r_i\)(不存在记为\(n+1\)),令这个排列的权值为\(P=\sum_{i=1}^n\min(i-l_i,r_i-i)\),给出\(n,m\)求权值为\(m\)的\(n\)阶排列数量。答案对给定大质数取模。\(n\le200,m\le10^9,10^8\le mod\le10^9\)
令\(n\)阶排列的答案的生成函数为\(F_n(x)\),边界\(F_0(x)=1\)。考虑\(n\)阶排列的构成,即在一个\(n-1\)阶排列的\(n\)个间隔中选择一个插入\(n\)这个数,所以\(F_n(x)=\sum_{i=0}^{n-1}\binom{n-1}{i}x^{\min(i+1,n-i)}F_{i}F_{n-1-i}\)。打表能够发现\(F_{200}(x)\)的最高次项指数为\(m=735\),因此直接暴力代入\(x=0...m\)求出点值后多点差值便可,复杂度\(O(n^2m+Tm^2)\)。
给一张图,选若干条路径使得通过每一条边刚好一次,要求路径条数尽可能少,输出方案。\(n,m\le10^5\)
不一样连通块显然相互独立。连通块内根据奇度点数量求欧拉路/欧拉回路便可。
有一个集合\(S\)初始为\(\{1,2...n\}\),两我的博弈,每次操做能够选取集合内的一个数并移除集合内它的全部约数(含自己),不能操做者输。给定\(n\),求是否先手必胜。\(n\le500\)
结论是先手必胜。能够考虑初始时\(S=\{2...n\}\),若是次数先手必胜,则原问题按照这种策略亦能够先手必胜,不然先手取走\(1\),一样能够获胜。
构造一个\(n\times n\)的\(01\)矩阵,要求\(1\)的数量超过\(85000\)而且不存在两行拥有超过\(1\)个相同的\(1\)的位置。\(n\le2000\)
假设\(n=p^2\),其中\(p\)为质数,能够考虑枚举\(i,j\in[0,p)\),构造一个长度为\(p^2\)的\(01\)串\(S\),其第\(kp+(jk+i)\bmod p\)位为\(1\)。这样的构造显然是知足条件的。
求至少有\(A\)行全\(1\),至少有\(B\)列全\(1\)的\(n\times m\)的\(01\)矩阵数量模\(998244353\)。\(n,m,A,B\le3000\)
先只考虑一维的状况。答案确定是\(\sum_{i=A}^nf_i\binom{n}{i}2^{(n-i)m}\),这样实际有\(j\)行全\(1\)的方案被计算了\(\sum_{i=A}^jf_i\binom{j}{i}\)次,所以\(\sum_{i=A}^jf_i\binom{j}{i}=1\),\(f_j=1-\sum_{i=A}^{j-1}f_i\binom{j}{i}\)。
两维的容斥是同样的,令\(g_j=1-\sum_{i=B}^{j-1}g_i\binom{j}{i}\),最终答案即为\(\sum_{i=A}^n\sum_{j=B}^mf_ig_j\binom{n}{i}\binom{m}{j}2^{(n-i)(m-j)}\)。
给出一个排列\(b_i\),要求维护一个序列\(a_i\)支持区间加\(1\)以及查询区间\(\lfloor\frac{a_i}{b_i}\rfloor\)之和。\(n,m\le10^5\)
记\(t_i\)表示\(a_i\)还要加多少次才能使\(\lfloor\frac{a_i}{b_i}\rfloor\)加\(1\),维护\(t_i\)的区间最小值,每次修改操做就暴力找到全部\(t_i\)为\(1\)的位置进行更新,用两棵线段树/线段树+\(BIT\)实现便可,因为\(b_i\)是排列,所以更新次数不超过\(n\ln n\),总复杂度\(O(n\log^2n)\)。
求\((\sum_{i=1}^{10}a_ix^i)^n\)有多少项系数为奇数,答案模\(998244353\)。\(n\le10^9\)
考虑更通常的问题,求\(f(x)^ng(x)\)有多少项系数为奇数。一个性质是\(f(x)^2\equiv f(x^2)\bmod 2\),所以\(f(x)^n\)在\(n\)为偶数的时候奇数项必定均为\(0\)。把\(g(x)\)拆成\(p(x)+q(x)x\)知足\(p(x),q(x)\)的奇数项也均为\(0\),那么\(f(x)^np(x),f(x)^nq(x)x\)两部分的答案独立,能够分别计算,从而能够将问题递归为求\(f(x)^{n/2}p(x)\)与\(f(x)^{n/2}\)的答案。\(n\)为奇数的话就乘一个\(f(x)\)到\(g(x)\)中去便可。
求大小为\(n\)的随机广义线段树上一次\(query(l,r)\)操做会通过的节点数量的指望模\(998244353\)。\(q\)次询问(每次询问的\(n\)是相同的),\(n,q\le10^6\)
考虑一棵广义线段树的生成方式,等价于初始有\(n\)个长度为\(1\)的区间,每次随机合并两个相邻的区间。接着考虑一棵广义线段树上一个区间\([l,r]\)出现的几率。若\(l=1,r=n\)那么几率显然为\(1\),不然若\(l=1\)或\(r=n\),那么几率为\(\frac{1}{r-l+1}\)(即要求某次合并是这\(r-l+1\)次合并中最晚发生的),不然几率为\(\frac{2}{(r-l+1)(r-l+2)}=2(\frac{1}{r-l+1}-\frac{1}{r-l+2})\)(即要求共\(r-l+2\)次合并中某两次是在最后发生的)。
对于一次\(query(l,r)\),根据指望的线性性,答案为全部与\([l,r]\)有交且其父亲未被\([l,r]\)彻底包含的区间的出现几率之和。后者有点难以计算,能够转换成被\([l,r]\)包含的叶子减去被\([l,r]\)包含的非叶子的几率,这样就显得能够计算了。
计算时涉及到的东西只有逆元的区间和,\(O(n)\)预处理后每次询问能够作到\(O(1)\)。分类讨论是真的难
有一个长为\(n\)的数组\(a_i\),你能够任意次花费\(y\)的代价交换相邻的两个数,交换结束后你须要付出\(x\)乘上逆序对数的代价,求最小代价。\(n\le10^5\)
答案是\(\min(x,y)\)乘上逆序对数。
地理竟然及格了。然而仍是因为政治生物不及格被D了一顿(小声BB)
有一个长度为\(n\)的序列\(a_i(0\le a_i < m)\),每次操做你能够选择一个子序列,把这个子序列中的数\(x\)变成\(x+1\bmod m\),求最少操做多少次可使序列单调不降。\(n,m\le3\times10^5\)
二分后贪心\(check\)便可。可耻地WA了一发(捂脸)
给一个长度为\(n\)的\(01\)串,求有多少个区间内包含一个对应字符均相同的下标等差数列。\(n\le3\times10^5\)
结论是不合法串的长度不会超过\(9\),因此直接暴力就行了,复杂度\(O(9n)\)。
证实:手动验证便可。
一个长度为\(n\)的序列\(\{a_i\}\),\(q\)次询问\(x,y\),问是否存在一个下标序列\(x=p_1<p_2<...<p_k=y\)知足\(a_{p_i}\&a_{p_{i+1}}\neq 0\)。\(n,q\le3\times10^5\)
记\(f_{i,j}\)表示从\(i\)出发可以到达的最近的且第\(j\)位上为\(1\)的下标是多少,转移显然。
询问的话就取\(a_r\)第\(j\)位为\(1\)的\(\min\{f_{l,j}\}\)判断与\(r\)的大小关系便可。
复杂度\(O(n\log^2n+q\log n)\)。
给一棵\(n\)个节点的二叉树,每条边上有一个小写字母或者\(?\),\(q\)次修改操做,每次修改某条边上的字符,问修改后是否存在一种方案,使得给全部\(?\)填上小写字母后,全部叶子到根的路径字符串经重排后是否能所有相同,若能,还须要求出每种字符在这个字符串里的最多出现次数。\(n,q\le1.5\times10^5\)
显然全部叶子的深度必须所有相等。而全部叶子深度全都相等的树,在缩去只有一个儿子的节点后,树高是\(O(\sqrt n)\)的。记\(s_i\)表示深度为\(i\)的节点数量,显然\(s_{i-1}\le s_i\),而缩点会致使全部\(s_{i-1}=s_i\)的层被缩掉,保留下来的每一层均知足\(s_{i-1}<s_i\),所以总层数为\(O(\sqrt n)\)。
对(缩点后的)树上每一个节点\(x\)记\(dp_{x,y}\)表示\(x\)向下走到某个叶子的全部路径中,\(y\)字符的最多出现次数是多少,记\(len_x\)表示\(x\)向下走到某个叶子的距离。那么第一问答案为Yes
当且仅当对于全部\(x\),均知足\(\sum dp_{x,y}\le len_x\),必要性显然,充分性可经过构造证实。
接着只要对每次询问暴力更新就行了,因为保证了每一个点的度数,复杂度\(O(n\sigma+q\sqrt n)\)或\(O((n+q)\sqrt n)\)。
回去上文化课了。
全天学考三模。晚自习竟然获批来机房?
开始补Codeforces Global Round 3的题,题解明天放。
上午学考三模,下午是毫无心义的试卷讲评。
有一张\(n\)个点的图,每一个点上有一个权值\(a_i\),两个点\(i,j\)之间有边当且仅当\(\gcd(a_i,a_j)=1\)。现给出\(k(k\le\frac n2)\),要求找出一个大小为\(k\)的点集,知足这个点集是独立集,或者这个点集的导出子图中没有孤立点(即每一个点的度数均不为零)。\(6\le2k\le n\le10^5,2\le a_i \le 10^7\)
先随便找出一个极大独立集\(S\),若\(|S|\ge\frac n2\)那么就直接结束了,不然对每一个不在\(S\)中的点求它与\(S\)中的哪个之间有边(如有多个则任意一个都可),从而能够把所有\(n\)个点分红\(|S|\)个连通块,假设这时有\(m\)个连通块是孤立点,那么能够证实对于任意的\(k\le n-m\)都可以构造出答案。
因为\(m\le|S|-1\),因此根据这种策略咱们必定能够构造出任意\(k\le \max(|S|,n-|S|+1)\)的答案,因为\(k\le\frac n2\),于是这种方法必定能够构造出解。
怎么求极大独立集,以及怎么对于每一个不在\(S\)中的点求其在\(S\)中的相邻点呢?先考虑前一个问题,即当前存在一个数集,每次尝试加入一个数,须要判断加入的数是否和原数集中的全部数都不互质。根据\(\sum_{d|n}\mu(d)=[n=1]\),能够维护一个数组\(sum_i\),每次加入一个数\(x\)就对\(x\)的全部约数\(d\)进行\(sum_d+=\mu(d)\),判断\(x\)是否能够加入,只要判断\(\sum_{d|x}\mu(d)\)是否为\(0\)就好了。
这样能够解决第一个子问题。第二个子问题能够在这种作法的基础上加上总体二分,因为\(10^7\)内一个数\(\mu(d)\neq0\)的约数\(d\)至多\(2^8\)个,由于总时间复杂度\(O(n2^8\log n)\)。
上午找数学组老鸽们学习了伯努利数求天然数幂和。
定义伯努利数的生成函数为\(B(x)=\sum_{i\ge0}\frac{B_i}{i!}x^i=\frac{x}{e^x-1}\)。
考虑设天然数幂和的指数生成函数\(A_n(x)=\sum_{i\ge0}(\sum_{j=0}^nj^i)\frac{x^i}{i!}\),则\[A_n(x)=\sum_{j=0}^n\sum_{i\ge0}\frac{(jx)^i}{i!}\\=\sum_{j=0}^ne^{jx}\\=\frac{1-e^{(n+1)x}}{1-e^x}\\=B(x)\frac{e^{(n+1)x}-1}{x}\\=B(x)(\sum_{i\ge0}\frac{(n+1)^{i+1}}{(i+1)!}x^i)\]
因而\(k!A_n(x)[x^k]=\frac{1}{k+1}\sum_{i=0}^k\binom{k+1}{i}B_i(n+1)^{k+1-i}\)
伯努利数能够多项式求逆\(O(n\log n)\)求得。而后要求\(A_n(x)\)也只须要一次卷积。
定义\(S_k(x)=\sum_{i=0}^xi^k\),求多项式\(\sum_{k=0}^nS_k(x)a_k\)。\(n\le250000\),系数对\(998244353\)取模。
\[\sum_{k=0}^nS_k(x)a_k=\sum_{k=0}^n\frac{1}{k+1}\sum_{i=1}^{k+1}\binom{k+1}{i}B_{k+1-i}(x+1)^i\\=\sum_{i=1}^{n+1}(x+1)^i\sum_{k=i-1}^n\binom{k+1}{i}\frac{a_k}{k+1}B_{k+1-i}\]
令\(C_i=\sum_{k=i-1}^n\binom{k+1}{i}\frac{a_k}{k+1}B_{k+1-i}\),则求出伯努利数后只需一次卷积便可求出\(C_i\),以后再使用二项式定理展开\((x+1)^i\)便可。
昨晚vp了一场2018 Chinese Multi-University Training, Nanjing U Contest然而写了两个小时就跑路了。今天早上过来补了几个题。题解懒得写了。
晚上打了场小米 Online Judge TCO 预选赛,又垫底了。
给一个\(n\times n\)的矩阵\(A\),定义一个非空子矩阵\(B\)的补矩阵为原矩阵去掉\(B\)所在行列后剩下的矩阵。求在模\(P\)(一个质数)意义下有多少个正方形矩阵\(B\)知足其补矩阵非空且\(B\)与\(B\)的补矩阵均满秩。\(n\le40\)
复杂度看上去是\(O(n^5)\)的,然而貌似\(O(n^6)\)卡卡常就过了。
先枚举\([l,r]\subseteq[1,n]\),即枚举\(B\)所在的行区间,接下来可行的\(B\)就只有\(n-r+l\)个。依次考虑判断这\(n-r+l\)个矩阵\(B\)是否满秩,顺序枚举,能够发现相邻的两个矩阵\(B\)的差异仅为替换了一个行向量,那么使用带删除线性基便可作到单次\(O(n^2)\)插入删除,总复杂度\(O(n^5)\)。
教练我不想写带删除线性基怎么办?
由于是按顺序插入与删除的(相似队列,每次操做恰在队首删除,队尾加入),所以能够对于每一个行向量维护其被插入线性基的时间,每次新插入向量时,尽可能将原有线性基内向量替换为更新插入的向量(比较插入时间),于是在判断是否满秩时,只须要判断构成线性基的\(r\)个行向量是否是最近插入的\(r\)个便可。复杂度依然为\(O(n^5)\)。
NCEE 2019 Day 1
Good Luck & Have Fun !
Codeforces Round #564 (Div. 1)弃疗了没打,不过感受打了就上分了啊。
NCEE 2019 Day 2
Good Luck & Have Fun !
去JUNE Challenge 2019 Division 2玩了玩写了几个题。
Q:为何打Division 2?
A:由于Rating不够打Division 1 \(Q\omega Q\)
to be continued...