=====个人刷题===== ====fks==== ===CF1687C=== 题解:考虑转化题意,令c[i]=b[i]-a[i],再对c作前缀和,那么就转化为了,每次对于[l,r]如果c[l-1]=c[r],那么把l-r这段区间全部覆盖为c[l-1].要求我们最后能把所有c都变成0.我们倒着考虑,来看操作是否有用(因为一开始我对于区间两两交的影响很头痛)。考虑最后反正要都变成0.那么必然c[l]和c[r]也必须要是0.否则做了和没做一个样。那么我们只对是0的考虑。我们把操作存在两个端点的vector里。暴力判断和更新就好了。用set维护非0位置弹出(set用于均摊,只染色非0位置)。 ===CF1687D=== 题解:一开始想的,把段都暴力弄出来,后面扫描线做。但发现其实不需要,考虑可爱的区间是[k^2,k^2+k],那么我们就发现,当我们固定了a[1]的段,也就是a[1]的偏移量的范围确定,后面的段的偏移量也能唯一确定(因为一个段最多从可爱到不可爱,或者从不可爱到可爱,不可能跳变两次(凸性))。那么我们可以发现,一个在不可爱段的最小值,会对下界有影响。一个在可爱段的最大值,会对上界有影响。我们预处理出前驱后继,直接做。每次跳的次数是V/i,那么就是调和级数 ===CF1687E=== 题解:考虑给出的形式,实际上是每个因子的min和min_rk2相加,我们考虑他的选择方式,实际上暗示着我们考虑min_Max容斥,比较容易的可以得到式子(用广义minmax可以得到),然而我们发现复杂度是2^n*n,无法通过。似乎没法优化?我们换个方向,想想能否减小n,来简化问题。也就是说挑选出一些代表性的数,来与我们整个数列等价。我们考虑一个定理:一个数最多的因子个数是w(n),在1e6内,这个函数是7。那也就是,我们可以每次钦定每个因子次小/最小给他选上。 ===CF1717E=== (vp) 题解:比较关键的一点就是想到枚举gcd(不枚举比较难做)。利用辗转相减,我们可以发现a=x*t,b=y*t,gcd(n-(x+y)*t,t)就变为了gcd(n,t),但我们考虑要求出gcd(x,y)==1并且x+y=c的对数,考虑y=c-x,gcd(x,c-x)==1 =>gcd(x,c)=1,也就是欧拉函数 ===CF1717F=== (vp) 题解:+1,-1比较难处理,考虑先全部-1,做单选题,每次选一个+2,那么就变成了考虑+2分配给谁的问题。我们做个delta,把目标值和当前值作差,考虑每个人要被加几次+2,也就是delta/2, 那么可以判断掉一些不合法的:delta负、delta不能被2整除。 比较显然可以得到网络流模型,但我们考虑到有些是无限制,如果按照“最多”的约束连边,则能达到最大流,但没法满足恰好。考虑上下界网络流建图即可。 ====ljz==== VP的签到题就不写了。 ===CF1730D=== 题意:每次可以把a的前k位和b的后k位交换,问a是否可以变成b。 容易发现,对于ai和bn-i+1这两个元素的对应关系不管怎么操作都是不会变的。所以有解无解的判断方法就是相同的pair(无序)有偶数个,或者有一个奇数且n是奇数。 ===CF1730E=== 题意:计算有多少个区间满足最大值可以整除最小值。 先用单调栈求出以每个元素为最大值最小值的最长区间。我们对每个ai都求出以ai为最大值的满足条件的区间,枚举ai的每个约数(ai在一百万以内因此可以AlogA预处理),对于一个约数d,可以找到离ai最近的d(左右各一个),我们只需要计算包含ai和d的满足条件的区间,对于左右的d注意去重。 ===CF1730F=== 题意:给定一个排列p和k,找到一个排列q,满足任意i=X) 然后对这三种取值进行DP,是可以用矩阵表达转移的,于是可以线段树维护。 ===ARC149D=== 题意:一开始给定n个坐标轴上的一维坐标和m个操作,每个操作给定一个d,对于当前为正的坐标,这些坐标-d,对于当前坐标为负的坐标,这些坐标+d,如果有坐标到达了原点就会永久消失。问每个坐标在第几次操作时到达原点,或者无法到达原点则给出最后一次操作结束后的位置。X<=1000000,m,n<=300000 一个观察是,对于两个关于对称的坐标,在以后所有的操作中都会关于原点对称。然后又由于坐标范围不是很大,我们可以对1~1000000都求出答案,我们按照顺序完成操作,如果有关于原点对称的点出现,那么就把他们链接在一起,容易发现这样是线性的。 ===ARC149E=== 题意:一个长度为n的循环数组a,从第一个开始,每次把m个连续的数排序,再给定一个1到n的排列b,问有多少a满足经过k次连续的操作后可以变成b。n,m<=300000,k<=1e9 考虑操作了n-m+1次之后,这时整个a中最大的m-1个数都已经被按顺序排在了最后,后续操作就是把这m-1个数向后移动一个位置,因此k的大小其实是没有意义的。考虑什么情况下可以变成b,我们把b复原到最大的m-1个数都按顺序排在最后的情况。此时,寻找以b1开头的最长不下降子序列(不考虑最后m-1个数)。在不下降序列中的数字每次有m种排法,其余数字的位置则是固定的,因为否则的话一定会被排序提前排到前面去。最后m-1个数的顺序不影响最后的结果,因此有(m-1)!种方案。 ===ARC149F=== 题意:给定一个有理数\frac{p}{q}\geq1.01,p,q=1,容易证明,对于任意正整数n,都存在唯一的序列a_1\ldotsa_k,a1≠0,0≤ai≤p-1,i=1kai·pqk-i。求1~N中表示法按字典序排在第L~R位的数是哪些,N<=1e18,R-L+1<=300000。 首先1~p-1的表示法很简单,p的倍数的表示法也容易想到,对于其他的数,我们找到离n最近的能被p整除的数m,m·qp·pq+n-m就得到了一种新的表示法。我们发现所有数的表示法构成了一棵字典树的结构,而且1~N按照树的bfs序排列,而字典序大小按照dfs序排列。所以我们一旦确定排名第L的数,就可以O(1)计算下一个数。因此问题转化为求字典序排名L的数。注意到还有\frac{p}{q}\geq1.01的条件,因此字典树的深度不超过log_{1.01}N,也就是不会超过4000。我们从字典树第一层开始往下走,可以通过二分来确定需要从哪个位置向下走。 ===ABC271G=== 题意:有一串无限长的01序列,循环节长度为24,给出循环节,按序列顺序执行操作,若序列当前位置上为0,则A操作,有X%的概率成功,为1,则B操作,有Y%的概率成功。问第N次成功是由B完成的概率。 f_i表示前i次成功是由B完成的概率,p_i表示一个循环节当中成功i次的概率。有f_n=\sum_{i=0}^{24}{p_i*f_{n-i}}这个式子明显可以用矩阵快速幂优化,细节就不赘述了。 ===ARC148E=== 题意:求长度为n的序列的重排列满足任意两个相邻的元素的和都大于等于k的数量。 我们把重排列问题看做把元素按照某种顺序一个一个插入一个空序列,并且我们需要很方便的知道可以插入的合法位置有多少。可以把原序列按从小到大的顺序排序,初始时,l=1,r=n ,可插入的位置数量为1,若$a_l+a_r\geq k$,剩下的任何元素都可以插入在a_r两侧,我们把a_r插入序列,同时会使可插入的位置数量加1,反之,剩下的任何元素都无法插入$a_l$两侧,我们把$a_l$插入序列,同时会使可插入的位置数量减1。不断执行,就可以得到可行排列数量。 =====个人学习===== ===ddp=== 新学了ddp,目前只做了P4719,还未学全局平衡二叉树。ddp实际上就是维护了一段重链的转移矩阵,难点在于矩阵的设计和dp状态的设计,可能有时候dp状态会为了转移,把一些权值给并入,比较抽象。需要维护轻儿子的dp值和当前的dp,每次更新一条重链的权值,再把更新重链顶端的父亲的权值。由于每个点维护了轻儿子的dp,且转移矩阵只和轻儿子的dp有关,所以每次修改的矩阵数只有log updata(2022.10.12):有了点新的理解,全局平衡二叉树感觉就是。lct用加权重心建树的方式,把每个平衡树建出来(权重是一个节点对应轻子树的大小)。然后操作就和lct一样,access的时候不需要splay。只需要上传信息即可