退役前的做题记录2.0

2020.2.29

ARC068E

枚举\(d\)后再枚举位置的复杂度是调和级数,那么问题变成了如何不重复的算上每一个纪念品。

注意到对于一个区间,当其长度\(\geq d\)的时候一定会被统计到,而当长度\(< d\)的时候至多会在一个位置被统计到。

树状数组维护当前区间长度\(<d\)的区间的贡献即可。

code

ARC067E

暴力dp的复杂度是调和级数,于是只需要考虑快速计算贡献即可。

我们枚举使用\(k\)个大小为\(t\)的物品,那么\(f_i\)转移到\(f_{i+kt}\)的贡献就是:

\[\dbinom{N-i}{kt}\frac{(kt)!}{(t!)^kk!} \]

暴力做就好了。

code

CF1303F

动态图连通性?线段树分治?不是TLE就是MLE

考虑一次修改将\(x\)改为\(y\),相当于在\(x\)的块内删边同时在\(y\)的块内加边。

注意到题面保证\(c_i\leq c_{i+1}\),也就是对每一种颜色,删边操作在加边操作之后才出现,那么我们可以将两种操作分开计算贡献。加边的贡献直接算,删边的贡献从后往前做就可以当做加边。

code

3.2

ARC066E

性质:

  • 括号不会加在\(+\)的后面。

  • 括号最多只会嵌套两层(括号的作用是修改其中的数的正负号,嵌套多于两层显然是无意义的)

这样的话直接记当前有几个未闭合的括号然后转移就好了。

code

CF1320&1321

sol

3.3

luogu6156

素质反演一下得到答案:

\[\sum_{d=1}^n\mu^2(d)d^{k+1}\sum_{p=1}^{\lfloor\frac{n}{d}\rfloor}\mu(p)p^k\sum_{i=1}^{\lfloor\frac{n}{dp}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{dp}\rfloor}(i+j)^k \]

这里用数论分块套数论分块貌似是\(O(n^{\frac{3}{4}})\)的,由于博主不会证明故略过(雾)

考虑一下怎么处理上面那三个函数的前缀和,只要线筛的时候求出\(\mu,id^k,id^{k+1}\)就能做前两个,第三个(记作\(f(n)\))的话考虑一下\(f(n)\to f(n+1)\)

\[\begin{aligned} f(n+1)-f(n)=&\sum_{i=1}^n\sum_{j=1}^{n+1}(i+j)^k+\sum_{j=1}^{n+1}(n+1+j)^k-\sum_{i=1}^n\sum_{j=1}^{n}(i+j)^k\\ =&\sum_{i=1}^n(i+n+1)^k+\sum_{j=1}^{n+1}(n+1+j)^k \end{aligned} \]

于是只要扩大线筛的范围就做完了。

code

ARC069E

字典序其实就是“让较小的数尽量早出现”。

为了达到这个“尽量早出现”,我们肯定每次选取石子最多的堆来取石子。同时记一下当前可以成为最大值的最小的编号就完事了。

code

ARC067F

最简单的想法是枚举区间\((l,r)\),同时对\(\forall i\in[1,m]\)找出最大的\(B_i\)并将其累加。显然超时。

考虑只枚举\(l\), 注意到如果倒序枚举的话对每个\(i\)维护一个单调栈就可以找到最优决策,最优决策带来的贡献可以直接开差分数组做。最后枚举\(r\)的时候扫过去就行了。

code

3.4

CF1305D

注意到如果回答的\(\rm{LCA}\)是叶子的话那么这个叶子必然是根。

所以我们每次可以询问当前树的某两个叶子的\(\rm{LCA}\),如果没有找到答案的话就删掉它们。

code

CF1305E

不难发现答案的上界为\(\sum_{i=1}^n\lfloor\frac{i-1}{2}\rfloor\),且此时\(a_i=i\).

如果\(m\)大于这个上界显然无解,否则我们找到最小的\(p\)使得\(\sum_{i=1}^p\lfloor\frac{i-1}{2}\rfloor>m\),之后\(a_p\)显然可以根据\(m\)剩下的部分直接算,其它位置直接赋类似无穷大的数即可。

code

CF1305F

观察之后可以发现这样一个事实:假设最后所有数的\(\gcd\)\(2\),那么原来每个数至多只需要操作\(1\)次,也就是\(ans<n\).

之后大力猜想有很多数只会操作至多\(1\)次,于是随机一些位置,并且对每个位置将\(x-1,x,x+1\)的所有质因数暴力\(\rm{check}\)一遍即可。

code

3.6

CF1316D

记从\((i,j)\)出发的终点为\(ed(i,j)\).

如果\((i,j)=ed(i,j)\)那么这个位置肯定是X,并且其它的点\(ed(i',j')=(i,j)\)的位置肯定能走到\((i,j)\),这个可以以\((i,j)\)为源一遍bfs。

对于剩下的\(ed(i,j)=(-1,-1)\)的点,不难发现只要让它们自己内部连起来就好了。

如果上面这一通操作下来还有未访问的点即为不合法点。

code

CF1316E

如果我们已经确定了那些编入队伍的人,那么观众肯定是剩下的\(a_i\)中最大的\(k\)个。

于是我们将所有人按照\(a_i\)从大到小排序,之后dp的时候就可以直接确定那些作为观众的人。

code

CF1316F

先把答案写出来

\[\mathrm{Answer}=\sum_{i=1}^n\sum_{j=1}^{i-1}a_ia_j\frac{1}{2^{i-j+1}}=\sum_{i=1}^na_i\frac{1}{2^i}\sum_{j=1}^{i-1}a_j2^{j-1} \]

这样就能做到单组询问\(O(1)\),接下来考虑修改,由于贡献和\(a_i\)的排名有关,便可以用权值线段树来维护,把答案拆成\(\sum a_i\frac{1}{2^i}\)\(\sum a_j2^{j-1}\),线段树维护在维护当前值域的答案的同时,维护上述两个值以及子树大小即可。具体实现参考了一下std.

code

3.8

Codeforces Round #620 (Div. 2) 题解

3.11

hitachi2020E Odd Sum Rectangles

题解搬运人(雾)

\(H=2^N,W=2^M\), 首先考虑答案的上界,对于任意的两列\(j_1,j_2(1\leq j_1\leq j_2\leq W-1)\), \(S(a,b,j_1,j_2)=S(1,b,j_1,j_2)-S(1,a-1,j_1,j_2)\), 故\(S(*,*,j_1,j_2)\)的奇偶性只与\(S(1,i,j_1,j_2)\)有关,那么此时的答案为:\(S(1,i,j_1,j_2)\)为奇数的数量\(\times S(1,i,j_1,j_2)\)为偶数的数量\((0\leq i\leq H-1)\). 其上界为\((\frac{H}{2})^2\).同时合法的\(j_1,j_2\)\(\frac{W(W-1)}{2}\)对,故答案的上界为\(\frac{W(W-1)}{2}\times (\frac{H}{2})^2\).

接下来我们通过给出构造方法证明这样的上界。

先假设\(N=M\),接下来使用数学归纳法的思路,当\(N=1\)的时候矩阵只有1个数,直接填1即可。当已知\(N=K\)的答案,考虑由其得到\(N=K+1\)的答案。这里直接给出构造思路:在\((2^K,2^K)\)的位置填上\(1\),其余的第\(2^K\)行或第\(2^K\)列的位置均填\(0\),剩下的部分是四个子矩阵,直接套\(N=K\)的答案就可以了(合法性的话考虑对是否包含\(2^K\)分类讨论即可)。

\(N\neq M\)的时候,可以先构造\(\max(N,M)\)的答案,再取其中的一部分即可。

code

3.20

诈尸.jpg

CF1292C

考虑从小到大填数,并且判断每填完一个数后哪些\(\mathrm{mex}(u,v)\)发生了变化。在填完数\(p\)后,那些路径上已经有\([0,p]\)的所有数的\(\mathrm{mex}(u,v)\)增大了1,我们希望每次加1的时候影响的点对尽可能最多。

手画几个图不难发现:当\([0,p]\)在一条路径上时能使收益最大化,且数\(p\)必然在路径的两端,于是直接记\(f_{u,v}\)表示当前路径\((u,v)\)上已经全部填上了数时的答案(不考虑未填的数),这个可以\(O(1)\)转移。

code

3.21

补了一下USACO 2020.2 Platinum的题目

「USACO 2020.2 Platinum」Delegation

二分答案,之后dfs整棵树,对每个点考虑其儿子向上连的链的长度,并将其两两合并,所有的操作均可以通过\(\mathrm{multiset}\)实现,合并的时候直接在\(\mathrm{multiset}\)里二分即可。注意根节点要特判一下。

code

「USACO 2020.2 Platinum」Equilateral Triangles

由于在曼哈顿距离意义下距离一个点相同的点构成一个斜\(45^{\circ}\)的正方形边界,故将坐标系旋转\(45^{\circ}\)后转为切比雪夫距离。

通过画图可以发现,此时必然有两个点的某一个坐标相同,具体的,假设这两个点的坐标为\(A(x_1,y_1),B(x_2,y_1)\)\(x_2-x_1=k\),那么不难发现\(C\in\{(x_3,y_3)|x_1\leq x_3\leq x_2,y3=y_1\pm k\}\).纵坐标相同时同理,但是为了减掉三个点之间的任两个点都有一个坐标相同的情况,不能考虑取等的方案数。

code

「USACO 2020.2 Platinum」Help Yourself

记全集\(U=S\),那么将幂用斯特林数展开。

\[\sum_{T\subseteq S}ans(T)^k=\sum_{T\subseteq S}\sum_{i=0}^kS(k,i)i!\dbinom{ans(T)}{i}=\sum_{i=0}^kS(k,i)i!\sum_{T\subseteq S}\dbinom{ans(T)}{i} \]

其中\(S(n,m)\)表示第二类斯特林数。

考虑对\(\forall i\in[0,k]\)维护\(\sum_{T\subseteq S}\dbinom{ans(T)}{i}\), 记\(f_{i,j}\)表示当前的线段集合的最大的右端点为\(i\), 组合数的一维为\(j\)时上式的值,我们将所有线段按左端点排序。那么在加入一条线段\([l,r]\)时:

  • \(i\in [1,l-1]\),在原集合中不存在与当前线段的交,也就是当前线段对所有的\(ans(T)\)均有\(1\)的贡献,又因为\(\dbinom{ans(T)+1}{i}=\dbinom{ans(T)}{i}+\dbinom{ans(T)}{i-1}\), 所以\(f_{1 \cdots l-1}\)\(f_r\)的贡献可以通过简单的累加得出。

  • \(i\in [l,r-1]\),在原集合中存在与当前线段有交的部分,所以\(f_{l\cdots r-1}\)均对\(f_r\)有其原值的贡献。

  • \(i\in [r+1,2n]\), 对每个\(f_i\), 是否选这条线段都不会对答案有影响,因为以\(i\)为右端点的线段一定包含了当前的线段\([l,r]\), 故\(f_{r+1\cdots 2n}\)都要\(\times 2\).

上述的所有操作均可以使用线段树维护,复杂度为\(O(nk\log n)\).

code

3.23

打了一场模拟赛,又垫底了。

T1

以下论述保证\(A_i<B_i\).

\(T_j\)的值分类讨论,考虑每一次操作后卡牌上的值是什么。

  • \(T_j<A_i\), 那么这一次操作对这张牌没有影响。

  • \(A_i\leq T_j<B_i\), 那么无论操作前牌上的数是什么,操作后牌上的数都是\(B_i\).

  • \(T_j\geq B_i\), 那么这一次操作一定会使得这张卡翻面。

注意到操作2的性质非常的好,那么对每张卡,可以直接使用权值线段树找到最后一次操作2发生的时间,之后只要考虑操作3发生的次数即可。这是一个简单的二维数点问题。

如果\(A_i\geq B_i\), 不难发现上述论证过程只与\(\max(A_i,B_i)\)有关,于是可以找出次数后按奇偶性讨论即可。

code

T2

最小割树可以硬艹,但让我们更充分的利用以下这张图的性质。

由于每个点的度数\(\leq 3\),所以点对间的最大流也会\(\leq 3\).

如果最大流\(\leq 1\), 则这两个点联通。

如果最大流\(\leq 2\), 则这两个点在同一个边双连通分量中。

如果最大流\(=3\), 那么可以发现无论我们删去图上的哪一条边(即这条边在最大流中已使用过),这两个点仍在同一边双连通分量中,这个可以使用\(\mathrm{hash}\)判断。

code

2020.3.29

vp了一场Codeforces Global Round 7,又垫底了。

题解在这里

posted @ 2020-03-01 00:26  EncodeTalker  阅读(270)  评论(0编辑  收藏  举报