• CF做题记录


    CF1550

    CF1550D Excellent Arrays

    观察样例可得:满足条件当且仅当初始序列满足(a_i=i) ,然后选择(lfloordfrac n2 floor) 个位置(-x) ,剩下位置(+x) ,其中(x) 为任意非零整数。对这个计数即可。枚举最靠前的减的位置然后枚举最靠后的加的位置计数,然后用上指标求和优化即可。

    CF1550E Stringforces

    二分答案然后用状态压缩dp判断。设(f_S) 表示已经完成集合(S) 中的要求时最靠前的位置,转移十分显然。需要预处理长度为(x) 且全是小写字母(v) 的字符串能放的位置。

    CF1550F Jumping Around

    考虑到可达性,将该问题转化为一个图论问题:在(u,v) 之间连接边权为(||a_u-a_v|-d|) 的边表示偏移量大小。这样如果存在一条从(s)(i) 的路径满足经过边权最大值(f(i)) 不超过(k) 则答案为Yes,否则为No。

    根据经典结论:任意两点间的任意路径上边权最大值的最小值等于在最小生成树简单路径上的边权最大值。因此只要建出最小生成树即可。这里考虑使用boruvka算法。现在关键在于如何对一个联通块求出以它连向其它连通块的边中权值最小的那一条边。枚举联通块内的每个点(u) ,要求最小的(v) 使边权尽量小,只要(a_v) 距离(a_upm d) 尽量小。使用set lower_bound即可。

    CF1592

    CF1592C Bakry and Partitioning

    首先题目不要看错!!接下来可以转化为是否存在三个连通块使得其内部点的点权异或和均为sum,其中sum表示所有点权异或和。只有两种情况:1.存在(v_1,v_2) 满足其子树内均存在某个子树异或和为sum 2.存在(u,v) 满足(u)(v) 的祖先且(u) 子树异或和为0,(v) 的为sum。dfs判断即可。

    CF1592D Hemose in ICPC ?

    需要找的其实是最大边权。根据询问次数考虑二分,关键是如何保证每次二分时点集都是联通的。直接在欧拉序上二分即可。(求欧拉序不要写错)

    CF1592E Bored Bakry

    与大于异或意味着存在某一二进制位满足更高的位都一致但是当前位与是1而异或是0,即这一位全部是1且有偶数个,因此区间长度一定为偶数。考虑前面的位相同,分0/1两种情况:1.存在0且有偶数个1。2.全是1且有奇数个。第二类情况显然不会出现,而对于第一种情况,可以排除掉存在0这一条件,因为这样答案不会变大。于是我们枚举当前位,对数列做前缀异或和,那么前面的位相同意味着值相等。用vector存下值为i,下标奇偶性为0/1的下标,然后扫一遍同时得到最大值即可。

    CF1580

    CF1580B Mathematics Curriculum

    所有包含这个数的区间中,不同的最大值的个数恰有 (m) 个意味着([1,x]) 的后缀最大值和([x,n]) 的前缀最大值个数,而这就是这个数在排列建成的笛卡尔树中的深度(注意这个转化)。于是记(f_{i,j,k}) 表示长度为(i) 的排列中深度为(j) 的点有(k) 个的方案数,dp即可。

    CF1580C Train Maintenance

    根号分治。首先先进行差分答案数组(s) ,最后再前缀和回来。对于(x_i+y_i>B) 的点暴力做。对于(x_i+y_ile B) 的点,(x_i+y_i) 的取值只有(B) 种,因此可以用数组(D_i) 维护(s) 数组中下标除以(x_i+y_i)(i) 位置的答案,那么每次的贡献就是区间加,仍然可以转化为差分+前缀和。复杂度为(mathcal O(nsqrt n))

    CF1601

    CF1601A Array Elimination

    与运算的一个性质是每个二进制位相互独立。对每个二进制位进行考虑,假设该位总共有(d) 个1,那么容易发现(k) 合法当且仅当(kmid d) 。因此最终答案就是所有(d) 的最大公约数的约数。

    CF1601B Frog Traveler

    可以直接dp,然后使用数据结构进行优化。也可以直接建图后跑01bfs,但是需要线段树优化建边。

    CF1601C Optimal Insertion

    使用如下策略必然能够达到最优解:对(b) 的每个元素(b_i) 放到满足放入后新产生的逆序对(即前面比(b_i) 小的数的个数和后面比(b_i) 大的数的个数)最少的位置。

    考虑证明。关键在于每个(b_i) 都能取到最小值,无关插入顺序。我们考虑将(b) 从小到大地排序依次插入。令(c_i) 表示在(i) 位置后插入当前的(b) 时新产生的逆序对。那么对于(a_i) ,假设它从原来的大于(b) 变成了小于(b) ,那么相当于对于(xin[1,i],c_xleftarrow c_x+1) ,对于(xin[i+1,n],c_xleftarrow c_x-1) 。而初始时(c=[1,2,3,cdots,n]) ,每次相当于前缀加后缀减,那么最小值的位置一定是单调右移,即(b) 越大,其最优位置越靠右。这样不仅每个(b) 均能取到最小值,同时(b) 内部也不会新产生任何逆序对,因此这样一定是最优的。具体实现时使用线段树进行维护即可。

    CF1601D Difficult Mountain

    结论:按照第一关键字为(max(s,a)) ,第二关键字为(s) ,第三关键字为(a) 从小到大进行排序。依次考虑是否能选即能获得最大值。考虑证明。对于两个元素((s_1,a_1),(s_2,a_2)) 。分三种情况:1.(s_1<a_1,s_2<a_2) 2.(s_1>a_1,s_2<a_2) 3.(s_1>a_1,s_2>a_2) 分别讨论即可。

    CF1601E Phys Ed Online

    (mn_i=min_{t=i}^{i+k}a_t) ,那么对于区间([l,r])

    [ans=a_l+sum_{j=1}^{l+kjle r}min_{t=0}^{j-1}mn_{l+kt} ]

    按照(mod k) 进行分类后,可以将问题转化为(k=1) 的情况。此时从右到左进行考虑,对于每个位置能做出贡献的一定是一个单调递减的序列。维护这个单调栈,然后维护两个数组(go_{i,j},s_{i,j}) 分别表示从(i) 出发跳(2^j) 步后到达的点,以及经过的数的和。每次询问时倍增即可。

    CF1603

    CF1603B Moderate Modular Mode

    (x>y) 时答案可以为(x+y) 。否则考虑令(n=ax+b,y=cn+b) ,然后将(n) 代入得(y=acx+b(c+1)) 。大胆令(b(c+1)=ymod x) ,然后由于(2mid ymod x) ,因此再大胆令(c+1=2) ,则(b=dfrac{ymod x}2) ,发现满足(bin[0,x-1],bin[0,y-1]) ,因此答案即为(y-dfrac{ymod x}2)

    CF1603C Extreme Extension

    先考虑对一个序列求出其“extreme value”。考虑从后往前找到第一个(i) 满足(a_i>a_{i+1}) 。容易发现至少需要将(a_i) 分为(lceildfrac{a_i}{a_{i+1}} ceil) 尽量平均的份才能满足条件。考虑到需要让操作总数尽量少,因此需要让操作后最小的数尽量大,因此恰好将(a_i) 分为(lceildfrac{a_i}{a_{i+1}} ceil) 就是最优的。令(a_i=sum_{t=1}^kb_t(b_1le b_2lecdotsle b_k)) ,则(k=lceildfrac{a_i}{a_{i+1}} ceil,b_1=lfloordfrac{a_i}{k} floor,b_k=lceildfrac{a_i}{k} ceil) 。然后(ansleftarrow k-1) ,将(a_i) 替换为(b_1) ,继续进行上述操作即可。最终的(ans) 就是答案。

    对于原问题,直接做可以做到(mathcal O(n^2)) 。优化考虑dp。令(f_{i,x}) 表示有多少(j) 满足(jge i) 且从(j) 开始操作到(i) 时该序列的第一个数为(x) 。转移十分trivial,按照上面的过程模拟即可,即(f_{i+1,x} ightarrow f_{i,lfloorfrac{a_i}{lceilfrac{a_i}{x} ceil} floor}) 。可以发现对于状态(f_{i+1,x}) ,其对答案的贡献为(icdot f_{i+1,x}cdot(lceilfrac{a_i}{x} ceil-1)) 。容易发现状态数事实上仅有(mathcal O(sqrt{10^5}n)) 个,直接dp即可。

    CF1603D Artistic Partition

    考虑(c) 到底是什么。

    [egin{aligned} c(l,r)&=sum_{i=l}^rsum_{j=i}^r[gcd(i,j)ge l]\ &=sum_{d=l}^rsum_{lle ile r,dmid i}sum_{ile jle r,dmid j}[gcd(i,j)=d]\ &=sum_{d=l}^rsum_{i=1}^{lfloor frac rd floor}sum_{j=1}^{i}[gcd(i,j)=1]\ &=sum_{d=l}^rsum_{i=1}^{lfloor frac rd floor}varphi(i)\ &=sum_{d=l}^rS(lfloor frac rd floor) end{aligned} ]

    (S) 可以线性预处理。然后我们对于每个(rin[1,n]) 求出每个(lfloor dfrac rd floor) 处的(S) 的前缀和,那么(c(l,r)) 就可以做到(mathcal O(1)) 求出了。

    对于(f(n,k)) 我们显然有转移方程:(f(n,k)=min_{i=1}^n(f(i-1,k-1)+c(i,n))) 。直接做是(mathcal O(n^3)) 的,考虑优化。首先是减少状态数。可以发现(c(l,r)ge r-l+1) ,而当(rle 2l-1)(c(l,r)) 取得下界。对于最小的(k) 满足(2^k>n) ,我们考虑取(x_i=2^{i-1}-1) ,在这样的情况下所有的(c) 同时取得最小值,显然(f(n,k)) 是最小的,答案就是(n) ,不需要dp。同时当(k) 更大时答案仍然能取得最小值(n)

    现在只需要考虑(kle log_2 n)(k) 了,但复杂度仍然是(mathcal O(n^2log n)) 的。考虑优化转移。观察转移方程可以发现其形式非常经典,于是我们可以大胆猜想(c) 满足四边形不等式。事实上的确如此,按照定义即可证明。那么令(g(n,k)) 表示(f(n,k)) 的最优转移位置,就有(g(n-1,k)le g(n,k)le g(n+1,k)) ,即决策点单调不左移。因此采用分治的做法就可以对于一个(k)(mathcal O(nlog n)) 的复杂度求出所有的(f(n,k)) 了。

    总时间复杂度(mathcal O(nsqrt n+nlog^2 n+t))

    ps:即使每次转移时暴力根号地计算(c(l,r)) ,不知道为何也可以通过。

    NO PAIN NO GAIN
  • 相关阅读:
    xpath取其中几个使用position
    pycharm2018.3.5 下载激活(windows平台)
    switch host 切换本地host
    leveldb 学习记录(四)Log文件
    bittorrent 学习(一) 种子文件分析与bitmap位图
    分布式协议学习笔记(三) Raft 选举自编写代码练习
    谷歌开源的一个BTREE实现 Go语言
    分布式协议学习笔记(二) 日志复制
    分布式协议学习笔记(一) Raft 选举
    利用redis制作消息队列
  • 原文地址:https://www.cnblogs.com/zmyzmy/p/15340043.html
Copyright © 2020-2023  润新知