杂题题解

lg P5598 混乱度

(卢卡斯定理)

考虑用卢卡斯定理展开成\(k\)进制来做
对于每一个位置网后枚举维护和计算后缀答案,如果某一位发生了进位显然答案就会变成\(0\)
于是分成若干段做即可,将所有\(0\)的位置压缩并且每个数只枚举\(p\)进制有值的位置,这样复杂度就是\(O(nplog)\)的了

code


省选模拟 Tree

(DP)

显然只有二叉树才合法
考虑\(f[u]\)表示\(u\)的子树,只填在\(u\)所填这一列即之后的方案数
如果两个儿子,枚举哪个向下一步
加上较长的那一个和较短的挨着走后的下个的答案即可
对于一个儿子\(v\)
要么接到下面,要么右边加上\(f[v]\)后要么就是\(v\)后面有某一条链拼回\(u\)下面的情况
大力分类讨论以及判不合法的即可

code


省选模拟 植物加热器

(贪心)

显然是下凸的,二分后贪心即可
比较蠢写的两个\(log\)

code


loj 3185

(数据结构 / 斐波那契数列)

考虑用斐波那契数系表示
记所有为\(1\)的位置为\(b\)
考虑\(dp,f[i]\)表示前\(i\)个当前这个不下放\(b_{i-1},b_{i-2}\)的方案
\(g[i]\)表示要下放的
那么\(f_i=f_{i-1}+g_{i-1},g_{i}=\frac{b_i-b_{i-1}-1}{2}f_{i-1}+\frac{b_i-b_{i-1}}{2}g_{i-1}\)
发现\(b\)差分后可以写成矩乘形式
有插入用平衡树维护
另外再用\(set\)之类的维护连续\(01\)交替段
对插入\(ps\)分四类讨论:
1.\(a_{ps-1},a_{ps},a_{ps+1}=0\)直接插入
2.\(ps-1\)接着一个连续段
3.在一个连续段内\(0\)位置
4.在一个连续段\(1\)位置
然后维护\(del_b\)即可,讨论挺恶心的

code


loj 2387

(差分)

维护一下前缀和之类的东西再差分一贡献即可

code


cf 607E

(计算几何 / 二分答案 / 树状数组)

考虑二分圆的半径,然后所有和圆有交点的线段映射到圆周上
这样就可以直接\(bit\)统计交点个数,注意不要算重
精度有点爆炸

code


cf 611H

(二分图匹配 / Hall定理)

显然每种位数的看做一类
考虑把 \(1\) 作为根
每条边有两种可能(哪个点作为儿子)
于是可以看做二分图匹配,左边是所有边,右边是所有点,连向右边哪个就表示哪个作为儿子
于是尝试钦定,用 \(hall\) 定理判断是否合法
可以把每类压做一个点

code


loj 3168 玩具

暴力即可

code


loj 3184 彩票

考虑对于\(\forall k\),如果有\(i,i+k\)开头的距离,那么可以\(O(1)\)得到\(i+1,i+k+1\)的距离
于是\(O(n^2)\)做即可
不过卡空间,把询问离散化

code


loj 3166 魔法树

(启发式合并 / 差分 / 数据结构)

一个显然的做法是线段树+启发式合并维护
但是写起很麻烦

可以发现每次要做的是后缀取\(max\)
可以直接用\(map\)维护差分数组

code


loj 3165 游乐园

(容斥 / 子集卷积)

首先可以发现不需要记贡献,因为每个方案一定存在一种相反的边的方案
考虑按拓扑序\(DP\)\(f[s]\)表示已经选了\(s\)的方案
对于同一层多次枚举的情况容斥
每次加\(i\)个点的容斥系数是\((-1)^{i-1}\)
转移是一个子集卷积

code


loj 3163 动态直径

(链分治 / 线段树)

早知道写\(lct\)了,树剖麻烦的细节很多
询问的大概是一个树上区间最大子段和的东西,用堆维护每条重链的答案
每个点用可删堆维护轻子树的最长\(lmx\)
线段树维护一个结构体
影响是边不好在点上处理,点记一下到父亲的边的长度\(ew\)
然后在线段树合并左右儿子答案的时候中间乘一个\(ew[idx[mid+1]]\)的影响

不过好像拆成括号序列直接就是\(O(nlogn)\)
(或者\(LCT\)并用\(splay\)维护虚儿子的答案)
code


loj 3164 立方填词

对每个长度分别做
考虑正方体内存在一个正四面体
枚举四个顶点的字母
预处理一下三叉形状的答案

复杂度\(O(10|C|^4)\)
代码没有一点优化,离散字符集和优化枚举顺序都可以快很多
code


CF 627E Orchestra

(链表)

考虑枚举\(lx\)
考虑枚举\(rx\)并加入点
会产生影响的只有相邻距离\(k\)的点
于是从大到小枚举\(rx\)链表维护删除,复杂度\(O(rnk)\)

但并不是非常好写
code


cf 671D Roads in Yusland

(DP / 线段树 / 线性规划)

可以线段树合并维护\(dp\)
另一个做法是设\(f[i]\)表示当前填满的最高的线段为\(i\)的方案
将线段按照底端节点\(dfs\)序标号,这样经过某个点的线段就是连续的
于是线段树维护,在每个点对于每个儿子,经过这个儿子的线段需要加上其他子树覆盖的最小代价

code

另一种想法是发现这个可以列成线性规划的形式,转对偶后意义是
给每条边一个权值,使每条链上所有边权值不超过给定价值,求最大权值和
具体可以参照这篇题解here


CF671E Organizing a Race

(线段树 / 单调栈)

考虑将限制列出来,即
\(\forall k\in [l,r-1], \sum_{i=l}^{k}g_i \geq \sum_{i=l}^{k}w_i\)
\(\forall k\in [l+1,r], \sum_{i=r}^{k}g_i \geq \sum_{i=r}^{k}w_{i=1}\)
写成前缀和的形式
\(a,b\)分别为\(g,w\)的前缀和,移项后
\(\min_{k\in [l,r-1]}a_k-b_k\geq a_{l-1}-b_{l-1}\)
\(\min_{k\in [l,r-1]}a_{k}-b_{k-1}\le a_{r}-b_{r-1}\)
再令\(c_{i}=a_{i-1}-b_{i-1},d_i=a_i-b_{i-1}\)
那么就是\(\min_{k\in[l,r]}c_k=c_l,\max_{k\in[l,r]}d_k=d_r\)
如果\(g_i\leftarrow g_i+1\)
\(\forall j>i,c_i\leftarrow c_i+1,\forall j\geq i,d_i\leftarrow d_i+1\)
考虑从后往前维护\(c\)的递减单调栈
那么每个\(i\),一定在\(stk[i-1]-1\)的位置给\(g\)加上\(c_{stk[i]}-c_{stk[i-1]}\)
线段树维护一下修改后的\(d'\)
二分找到最大的可以\(l\rightarrow r\)\(r\)
考虑在线段树上二分
如果右边\(\max_{i\in rc} d_i+k\geq \max_{i\in lc} d'i\)则往右
否则往左

code


CF643F Bears and Juice

考虑给每个桶分配不同的被喝的方案,则每个桶就可以唯一的表示出来
首先\(p=\min(p,n-1)\)
那么枚举几个熊喝,就有\(\sum_{i=0}^{n}{n\choose i}q^i\)
而且这显然是一个上界
预处理组合数暴力即可

code


CF679E Bear and Bad Powers of 42

考虑线段树维护每个位置距下一个的差值
对于第三个操作
每次线段树上走,如果当前询问区间最小值小于\(x\)且没有被覆盖则递归左右儿子
否则直接区间加,每次操作完后看一下当前整个\(\min=0\)即可
复杂度\(O(nlognlog_{42}W)\)

code


uoj 182 a^-1 + b problem

考虑每次每个位置的值可以写作\(\frac{ax+b}{cx+d}\),其中\(x\)是最开始的值
可以改写成\(e+f\times\frac{1}{x+g}\),考虑每次询问实际上只需要求\(f(g)=\sum_{i}\frac{1}{a_i+g}\)即可
\(p(x)=\prod_{i}{a_i+x},f(x)=\frac{p'(x)}{p(x)}\),然后写个多点求值即可
不过注意由于\(f=p'/p\)要多点求值,\(\frac 1 p\)的次数是不确定的,所以只能分别求值然后算逆元

code


loj 6396 Toyshop
用线段树维护每个大小的最大权值,每次做一次完全背包即可

code


loj 2719 冒泡排序

考虑一下满足的条件是序列不存在长度\(\geq 3\)的下降子序列
因为这样一定存在一次不减少逆序对的操作

然后可以列出\(dp,f[i][j]\)表示前\(i\)个最大值为\(j\),后面\(n-i\)个的方案数
那么转移是\(f[i][j]=\sum_{k\geq j}f[i+1][k]\)

可以看做折线统计方案,即\((i,j)\rightarrow (n,n)\)不经过\(y=x-1\)的方案数
可以通过折线法或者发现这是卡特兰数得知方案数为\({2n-i-j\choose n-i}-{2n-i-j\choose n+1-i}\)

然后考虑按位计算方案,求前面都相等,当前这位\(>q_i\)的方案
记前面最大\(q_i\)\(mx\),未选过的最小的数为\(mn\)
只需要按照\(q_i=mn,mn<q_i<mx,mx<q_i\)讨论即可

code


lolj 2305 游戏

枚举所有\(x\)选哪种地图然后\(2-sat\)即可,由于任意两种地图可以涵盖三种情况
所以只需要\(2^d\)枚举即可

至于\(tarjan\)求方案
直接按照\(bel\)选较小的即拓扑序更大的那个一定合法

code


loj 6392 Rsa
脑残想的转成原根指数解个方程
由于\(gcd(e1,e2)=1,\)存在\(a,b,a\times e1+b\times e2=1\)
\(m=m^{ae1+be2}=c_1^a+c_2^b\)

code


codechef TRIPWAYS

考虑暴力生成函数\(dp\)\(f_i(x)=\frac{\sum_{v}f_v(x)x}{1-l_ix}\)

显然可知答案能表示成
\(f_n(x)=\frac{A}{\prod_{i}(1-l_ix)}\)的形式

\(C-H\)定理可知
\(F=F*G+A\)
\(F=\frac{A}{1-G}\)
会表示成求\(x^t\%(1-G)^R\)

所以可以考虑求出
\(x^t\%M(x)=\prod_i(x-l_i)\)
由于\(deg(M)=n\)
暴力\(DP\)只需要\(A\)的前\(n\)

但这道题如果直接倍增取模复杂度\(O(Qnlog^2n)\)无法接受
考虑利用\(M\)的性质优化
考虑对于每个\(l_i\)考虑,假设有\(k_i\)\(l_i\)
我们求出\(f_i(x)=x^t\%(x-l_i)^{l_i}\)的答案,然后利用\(crt\)合并

考虑求出\(f_i(x+l_i)=(x+l_i)^t\%x^{l_i}\)后还原
\((x+l_i)^{t}\%x^{l_i}\)的组合系数可以留到最后求答案的时候加入
这里只需要求出\(\%x^{l_i}\)的然后转回去即可

然后考虑\(crt\)合并答案
实际上要求的就是\(\sum_if_i(x)M_i(M_i^{-1}\%(x-l_i)^{k_i}),M_i=\frac{M}{(1-l_i)^{k_i}}\)
只需要考虑求后面那个逆元
类似的求\(M_i(x+l_i)*M_i(x+l_i)\equiv 1\%x^{k_i}\)
只需要算\(M_i(x+l_i)\)的逆元然后转回去即可

其中多项式乘法求逆除法取模都可以用\(O(n^2)\)

复杂度\(O(nm+n^2+qn)\)

code

posted @ 2020-04-27 22:09  神山识  阅读(207)  评论(0)    收藏  举报