Description n,m<=10000 Solution 考虑暴力轮廓线DP,按顺序放骨牌 显然轮廓线长度为N+M 轮廓线也是单调的 1表示向上,0表示向右 N个1,M个0 只能放四种骨牌 四种转移写出来,就是 1000 0001 1110 0111 1010 0011 1100 0101 相当与一个1和后面3格的一个0换过来,中间不变 把模3相同的分组, 转换成只换相邻的10 再把它看作轮廓线,相当与每次只能放1×1的骨牌,问拓扑序个数 利用杨氏矩阵的钩子定理 就是矩阵大小的阶乘除以每个…
Description n<=1e9,M,K<=100 Solution 显然任选m个港口的答案是一样的,乘个组合数即可. 考虑枚举m个港口的度数之和D 可以DP计算 记\(F_{m,D}\)为将D的度数分给m个港口的方案数 枚举新的一个度数分配给谁,然后此时可能某一个超出了限制,减掉这一个的贡献. 接下来我们可以用一个超级根把D个点连起来 prufer序简单计数即可 \(n-m+1\)个点,其中超级根出现了\(D-1\)次 就是\({n-m-1\choose D-1}(n-m)^{n-m-D…
Description n<=200000 Solution 比赛时没做出这道题真的太弟弟了 首先我们从小到大插入数i,考虑B中有多少个区间的最大值为i 恰好出现的次数不太好计算,我们考虑计算最大值小于等于i,再做一个差分即可. 然后直接分成长度在一段内的和长度跨过一段边界的考虑,跨过完整的一段的区间的答案一定是整个序列最大值 分类讨论即可,式子并不难推,有一个地方可以直接暴力计算前缀和. 复杂度O(N)或加上O(MAX(a)) Code #include <bits/stdc++.h>…
Description: \(1<=n<=1e9,1<=m,k<=100\) 模数不是质数. 题解: 先选m个点,最后答案乘上\(C_{n}^m\). 不妨枚举m个点的度数和D,那么我们需要解决两个问题: 一共m个有标号盒子,D个有标号小球放到盒子里,且每个盒子的球数不超过k的方案数. n-m个有标号点的D棵有根树的森林划分 Task1: 事实上这个东西可以直接NTT卷起来,效率应该是最高的,但是因为模数不是质数,所以不行. 设\(f[i][j]\)表示i个盒子,j个小球的方案数.…
Description \(n,m<=1e4,mod ~1e9+7\) 题解: 显然右边那个图形只有旋转90°和270°后才能放置. 先考虑一个暴力的轮廓线dp: 假设已经放了编号前i的骨牌,那么这些骨牌形成的图形一定是杨表那样的. 对轮廓线来考虑,不妨设1表示向上走,0表示向右走. 初始状态是:111-(n个1)000..(m个0) 那么四种转移为: 1110->0111 1000->0001 1010->0011 1100->0101 这样暴力dp应该能过n,m<=…
Description 给出一个长为n的字符串\(S\)和一个长为n的序列\(a\) 定义一个函数\(f(l,r)\)表示子串\(S[l..r]\)的任意两个后缀的最长公共前缀的最大值. 现在有q组询问,每组询问给出\(L,R,x\) 你需要找到一个子串\(S[l,r]\)满足\([l,r]\subset[L,R]\)且\(f(l,r)\geq x\) 同时需要满足\(max(a[l..r])\)最小 求这个最小值,无解则输出-1 \(n,q\leq 50000\) Solution 这道题实际…
Description: 1<=n<=5e4 题解: 考虑\(f\)这个东西应该是怎样算的? 不妨建出SA,然后按height从大到小启发式合并,显然只有相邻的才可能成为最优答案.这样的只有\(O(n log n)\)个有用的串. 建SAM在fail树上启发式合并是一样的. 然后用个主席树就可以快速查询答案. 现在思考查询一个[x,y],要求f>=z怎么办? 考虑一个区间[l,r],如果a[l-1]<=max[a[l..r]]或a[r+1]<=max[a[l..r]]显然延伸…
Description: p<=10且p是质数,n<=7,l,r<=1e18 题解: Lucas定理: \(C_{n}^m=C_{n~mod~p}^{m~mod~p}*C_{n/p}^{m/p}\) 若把\(n,m\)在p进制下分解,那么就是\(\prod C_{n[i]}^{m[i]}\). 对于\(∈[l,r]\)的限制先容斥为\(<=r\). 考虑从低位到高位的数位dp,设\(f[i][S][j]\)表示做了前i位,S[i]第i个数选的数是<=还是>,进了j位,的…
Description: 题解: 这种东西肯定是burnside引理: \(\sum置换后不动点数 \over |置换数|\) 一般来说,是枚举置换\(i\),则\(对所有x,满足a[x+i]=a[i]\),然后a还要满足题目条件,但是仔细想一想,设\(d=gcd(i,n)\),只要a[0..d-1]满足就好了,所以: \(Ans=\sum_{d|n}f(d)*\phi(n/d),f(d)表示\)不考虑循环同构时的答案. 然后考虑dp: 枚举0这一列的块是什么,然后设\(dp[i][1..4][…
Description: \(1<=n,k<=1e5,mod~1e9+7\) 题解: 考虑最经典的排列dp,每次插入第\(i\)大的数,那么可以增加的逆序对个数是\(0-i-1\). 不难得到生成函数: \(Ans=\prod_{i=0}^{n-1}(\sum_{j=0}^ix^j)[x^k]\) \(=\prod_{i=1}^{n}{1-x^i\over 1-x}[x^k]\) 分母是一个经典的生成函数: \({1\over 1-x}^n=(\sum_{i>=0}x^i)^n=\sum…
[NOI2019模拟]搬砖 Description 小火车很穷,只好去搬砖了. 小火车被工头要求搭建\(n\)座塔,第i个高度为\(H_i\),也就是由\(H_i\)块砖头组成.每次小火车可以携带至多\(k\)块砖头,由某座塔底出发,摆放砖头.他可以向左右两座塔的相同高度摆放砖头(即使是悬空的),也可以向那两个位置移动过去(必须有砖头才能移动),还可以向同一座塔的上一层攀爬(如果那里有砖头的话就直接爬,如果没有的话可以摆上砖头再爬过去),可惜携带砖头的他并不方便向下爬.请问他至少要多少次才能搭建…
noi2019模拟测试赛(四十七) T1与运算(and) 题意: ​ 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所有排列的\(\Sigma_i f_i\)的最大值. 题解: ​ dp,记\(dp_i\)表示前面的数与和为\(i\)的最大值,转移要一个超集的东西,fwt搞一搞就行了. #include<bits/stdc++.h> #define fo(i,l,r) for(int i=l;i<=r;i+…
[NOIP2017提高A组模拟9.7]JZOJ 计数题 题目 Description Input Output Sample Input 5 2 2 3 4 5 Sample Output 8 6 Data Constraint 题解 题意 给出\(a[i]\),有一完全图,\(i\)与\(j\)之间的边的值为\(a[i] \oplus a[j]\)(\(\oplus\)为异或的意思) 求最小生成树及方案数 题解 科普一个东西,\(n\)个点的完全图的生成树个数是\(n^{n-2}\) 这个东西…
传送门 正难则反. 考虑计算两人相遇的方案数. 先正反跑一遍最短路计数. 然后对于一条在最短路上的边(u,v)(u,v)(u,v),如果(dis(s,u)*2<total&&dis(v,t)*2<total)说明两人可以在这条边上面相遇. 如果对于一个点从起点到它的距离刚好是最短路的一半也可以在这个点相遇. 代码…
题目链接:https://jzoj.net/senior/#main/show/6101 记\(f_i\)为从\(i\)号点走到\(n\)号点所花天数的期望 那么根据\(m\)条边等可能的出现一条和一定会往期望值较小的点走的贪心策略我们可以得到 \[ f_i=\frac{1}{m}\sum min(f_i,f_j)+1 \] 其中当\(i,j\)不相连的时候可将\(f_j\)看做无限大 我们考虑在该式子中一共选取了\(sum\)次\(f_j\),也就是\(m-sum\)次\(f_i\),那么 \…
题目链接:https://jzoj.net/senior/#main/show/6099 考虑直接统计某个点到其它所有点的距离和 我们先把整个团当成一个点建图,处理出任意两个团之间的距离\(dis(i,j)\),注意这里的\(dis\)表示的是两个不位于团的相交部分的两点之间距离,即路程一定是某个点\(a->相交部分->b->--\)这样的 接下来我们枚举点\(x\),统计所有点到\(x\)的最短路,我们考虑从\(x\)到所有团的最短路,并按照该最短路从小到大的顺序考虑它们对答案的贡献…
Description N,M<=100000,S,T<=1e9 Solution 首先可以感受一下,我们把街道看成一行,那么只有给出的2n个点的纵坐标是有用的,于是我们可以将坐标离散化至O(n)级别. 显然出发地和目的地的地位是相同的,因此我们强制要求从编号小的街道走向标号大的街道. 我们考虑一个朴素的DP,记\(F[i][j]\)表示当前转移到了第i行,连接第i-1行和第i行的桥梁位于位置j 枚举上一行的桥梁在哪里,我们可以得到一个大概的转移式子\(F[i][j]=S[i][j]+min(…
题面 茉优最近研究发现,一个人的想愿能力可以认为是字符串S的一个子串S[l,r],而连接值可以认为是这个子串的本质不同子序列个数.现在她想验证她的结论是否正确,于是她给了你Q个询问,希望你帮她来计算,注意空串也是子序列. 题解 考场上暴力都打错 先考虑暴力,设\(f_i\)为\(i\)下标为终止位置的子序列个数,那么\(f_i\)就等于前面的所有\(f_j,j<i\)的和,不过要减去所有\(s_j=s_i\)的\(f_j\),否则会重复 然后考虑把\(f_i\)给前缀和,先离散化,设一个向量,其…
Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些边依次加入图中,每次加入之后计算当前图的强连通分量个数并记下来,最后得到一个长度为E 的序列,这个序列就是能力的效果. 注意到,可能存在边的序列不同而能力效果相同的情况,所以羽月想请你帮她计算能发动的不同能力个数,答案对 998244353 取模.你需要对于1<=E<=V*(V-1)的所有 E 计…
题面 题解 幸好咱不是在晚上做的否则咱就不用睡觉了--都什么年代了居然还会出高精的题-- 先考虑如果暴力怎么做,令\(G(x)\)为\(F(n,k)\)的生成函数,那么不难发现\[G^R(x)=\prod_{i=1}^n(x+i)\] 也就是说如果把\(G(x)\)的系数反过来就是后面那个东西,所以对于\(n\leq 100000\)的数据直接分治\(FFT\)就行了.不过因为这里的模数不一定满足原根性质,所以要用三模数\(NTT\)或拆系数\(FFT\)(所以咱为了这题还特地去学了一下拆系数-…
题面 题解 这种题目就是要好好推倒 我们枚举最小的数是哪一个,那么答案就是\[Ans=\sum_{i=1}^nT^i{n-i\choose k-1}\] 因为有\[\sum_{i=p}^n{n-i\choose k-1}={n-p+1\choose k}\] 原式太难算了,我们可以先计算\(\sum_{i=1}^nT{n-i\choose k-1}=T\times {n\choose k}\),再加上\(\sum_{i=2}^n(T^2-T){n-i\choose k-1}=(T^2-T)\ti…
题面 题解 不难发现,如果一行最后被染色,那么这行的颜色肯定一样,如果倒数第二个被染色,那么除了被最后一个染色的覆盖的那一部分剩下的颜色肯定一样 于是题目可以转化为每一次删去一行或一列颜色相同的,问最少几次删完 首先判断能不能删完.因为可行性和删的顺序没有关系,我们可以直接\(bfs\),能删就删,看最后是否有剩下 然后是最少的次数,首先行和列中肯定有一个是删满的 我们假设行全都删掉了,那么就是要求最多有多少列不用删.对于这些不用删的列,它们肯定颜色是一样的,所以现在就转化为最多有多少列是相同的…
题面 题解 设\(lim=(n-1)/2\)(这里是下取整),那么\(x\)位置的值最大不能超过\(lim\),而\(y\)处的值不能小于\(y\),于是有\[Ans=\sum_{i=1}^{lim}\sum_{j=2 i+1}^n(y-2)!{j-2\choose y-2}(n-y)!\] 上式的意思是,枚举\(x\)处的值\(i\)和\(y\)处的值\(j\),那么放在\(y\)前面的数都不能大于\(j\),要从除了\(i,j\)之外的剩下\(j-2\)个数中选出\(y-2\)个,因为顺序无…
题面 题解 我们把每个地雷向它能炸到的地雷连边,不难发现同一个强联通分量里的点只要一个炸全炸 那么我们缩点,首先所有入度为\(0\)的强联通分量中必须得选一个地雷炸掉,而入度不为\(0\)的强联通分量绝对会被某个入度为\(0\)的点连锁反应给炸掉,所以不用考虑 于是对于每个入度为\(0\)的点开一个\(set\),维护里面的所有\(c_i\),从每个\(set\)里取出最小的加入答案,修改也没问题了,于是有\(50\)分了 然而现在的问题是边数太多了,题解的做法是用线段树优化连边,于是就可以\(…
题面 题解 我永远讨厌dp.jpg 搞了一个下午优化复杂度最后发现只要有一个小trick就可以A了→_→.全场都插头dp就我一个状压跑得贼慢-- 不难发现我们可以状压,对于每一行,用状态\(S\)表示有哪些格子是已经被上一行推倒了的,那么我们可以枚举本行所有格子的字母情况,然后计算一下这个时候下一行格子被推倒的情况,把这一行的贡献加到下一行就行了. 简单来说就是记一个\(f[pos][S]\)表示第\(pos\)行,格子被推倒的情况为\(S\)时的方案数,\(dp[pos][S]\)为所有方案中…
题面 题解 好迷-- //minamoto #include<bits/stdc++.h> #define R register #define ll long long #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i) #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i) #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)…
题面 题解 为了一点小细节卡了一个下午--我都怕我瞎用set把电脑搞炸-- 观察一次\(1\)操作会造成什么影响,比如说把\(A[i]\)从\(x\)改成\(y\): \(D[x]\)会\(-1\),导致\(E[x]=B[x]/D[x]\)会修改 \(D[y]\)会\(+1\),导致\(E[y]=B[y]/D[y]\)会修改 连边关系会修改 当某个\(E[x]\)改变时,所有跟它距离不超过\(1\)的点的\(C[]\)值都要修改 \(C[A[x]]\):单点修改 \(C[x]\):单点修改 儿子…
题面 题解 数据结构做傻了.jpg 考虑每一个节点,它的儿子的取值最多只有\(O(\sqrt {m})\)种,那么可以用一个双向链表维护儿子的所有取值以及该取值的个数,那么对儿子节点修改一个值就是\(O(\sqrt{m})\),整体修改可以通过在自己身上打一个标记做到\(O(1)\) 然后还要修改父亲,那么可以通过修改父亲的父亲的儿子实现,并把父亲打上一个加一标记 然后还需要知道该时刻某个点的具体取值,可以通过父亲身上整体加一的标记和自己身上被儿子打的标记的总和求出 //minamoto #in…
题面 题解 又一道全场切的题目我连题目都没看懂--细节真多-- 先考虑怎么维护仙人掌.在线可以用LCT,或者像我代码里先离线,并按时间求出一棵最小生成树(或者一个森林),然后树链剖分.如果一条边不是生成树上的边,它肯定会和树上\(u,v\)这条路径构成一个环,然后对于每条树边记录一下这条树边被覆盖过没有.如果\(u,v\)路径上有任何一条树边被覆盖过,那么就说明路径上有一条边已经在一个简单环中,这条非树边就不能加.否则就加上这条边并让这条路径上所有树边的覆盖次数加一 然后考虑期望连通块个数.首先…
传送门 题面 liu_runda曾经是个喜欢切数数题的OIer,往往看到数数题他就开始刚数数题.于是liu_runda出了一个数树题.听说OI圈子珂学盛行,他就在题目名字里加了珂学二字.一开始liu_runda想让选手数n个节点的不同构的二叉树的数目. 但是liu_runda虽然退役已久,也知道答案就是Catalan(n),这太裸了,出出来一定会被挂起来裱.因此他把题目加强.我们从二叉树的根节点出发一直向右儿子走到不能再走为止,可以找到最右下方的节点v,这个节点是没有右儿子的. 如果根节点和v不…