题6/GF

GFP1981

感觉有点神。考虑这个\(\frac{k}{4}\)的东西,他是可以由减半两次得到的。第一次,考虑由于只有四联通的位置是有位置的,所以如果只考虑行/列之间的限制的话,那么所有都可以满足,设行的限制更多,那么就先满足行的。列之间,由于是四联通的,所以只有相邻的列是有限制的,我们设填完行后\(j\)\(j-1\)行之间的限制有\(a\)个满足了,\(b\)个没满足,如果\(a>b\)那么就不动了,否则把\(j\)行反转一下。这样的话,不满足的就是\(\frac{k}{4}\)了。然后就做完了,感觉还挺巧妙地。

总结:网格上的问题,有时可以把行和列拆开来考虑,先满足行再满足列,或者相反,然后再考虑行行之间的限制,这个思路好像还挺常见的。

P6772

线性基合并,合并两个区间的线性基,我们只关心基底,暴力的把一个区间的基底插到另外一个基底上,复杂度就是\(O(V^2)V\)代表维数。感性理解上是对的,但是不会严谨证明。然后这道题,树剖感觉不太行把,复杂度炸飞了,然后就考虑只分成两端,\(x\to lca\),\(y\to lca_y\) ,\(lca_y\)代表\(lca\)在%y%方向上的儿子。这样复杂度就是\(O(qV^2)\)了。怎么维护上面的,就相当于找一个区间的线性基,保留最靠后的基底就行了。

P14349 [JOISC 2019] 蛋糕 3 / Cake 3

这个是决策单调性板子。先考虑选定了一个集合,怎么让后面的那一项最小。贪心的想就是单调的时候。证明就是,考虑找到最小值和最大值的位置\(i,j\),我们现在只考虑\(i\sim j\)之间的贡献,发现至少会有\(2*(max-min)\)的贡献,并且这是基于\(i\to j,j\to i\)的路径上(是一个环所以有两个方向的路径)的值都是单调的才能得到这个,如果不单调那么贡献就会增加。那么就分析到了这个,所以我们把这个按照\(c\)排序,枚举最大值和最小值\(l,r\),那么这个的最大贡献就是\(c_r-c_l+[l,r]\text{中前k大的v}\)。设贡献为\(w_{l,r}\)。我们通过分讨能得到\(w_{l,r}+w_{l-1,r+1}\le w_{l-1,r}+w_{l,r+1}\),也就是四边形不等式,通过这个我们能推得决策单调性,就是变换一下\(w_{l,r}-w_{l-1,r}\le w_{l,r+1}-w_{l-1,r+1}\) 推广一下就能得到\(w_{l,r}-w_{i,r}\le w_{l,r+1}-w_{i,r+1}(i<l)\) 所以当\(l\)\(r\)的最优决策点的时候,\(r+1\)的最有决策点必定在\(l\)后面。那么我们怎么求对于每个\(r\)的最优决策点呢?采用分治做法设\(solve(l,r,opl,opr)\)表示\(l,r\)中的每个点的最优决策点在\(opl,opr\)中,那么设\(mid=(l+r)/2\),然后暴力找出其最优决策点\(L\),那么\(l,mid-1\)中的点的最优决策点就在\(opl,L\)中,\(mid+1,r\)中的就在\(L,opr\)中,也就是\(solve(l,mid-1,opl,L),solve(mid+1,r,L,opr)\)。然后就完了。

注意:如果有多个最优决策点,选择左边和选择右边都可以。

总结:通过四边形不等式能够的到决策单调性;贡献与区间中的值相关,判断其是否有四边形不等式;

P12074 [OOI 2025] The arithmetic exercise

这个感觉还挺有意思的。就是这个操作可以看作放到一个栈里面,从栈顶到栈底的符号是\(+-\)交替。问操作的最大值。那么我们把序列反过来,那就变成了每次向一个栈里面放一个数,正负号不能与栈顶相同,那么我们考虑钦定第\(i\)个的+-\(,然后判断它是否能够放里面。那么如果是\)+\(,就判断栈顶是\)+\(的栈的个数\)+1\(与\)n\(的关系,如果是\)-\(,判断栈顶是\)+$的栈的个数与\(1\)的关系。那么就可以把\(+\)看做\(+1\)\(-\)看作\(-1\),那么问题就转化成了前缀和都在\([0,n]\)中了(这步转化很妙啊喵喵转化)。那么我们设\(f_{I,j}\)表示前\(i\)个元素,前缀和是\(j\)的最大价值,易得转移\(f_{i,j}\leftarrow f_{i-1,j-1}+x_i(j\in [1,n]),f_{i,j}\leftarrow f_{i-1,j+1}-x_i(j\in [0,n-1])\)。但是这样的形式不太好优化。下面两个优化神了。我们先给初始值\(-\sum_{x_i}\),那么转移就变成了\(f_{i,j}\leftarrow f_{i-1,j-1}+2*x_i(j\in [1,n]),f_{i,j}\leftarrow f_{i-1,j+1}(j\in [0,n-1])\),然后令\(g_{I,s}=f_{i,s-i}\)(可能是看到\(i-1+j+1=i+j\)想到的?或者是比较经典?不知道)那么转移就是\(g_{i,s}=\max(g_{i-1,s},g_{i-1,s-2}+2*x_i)\)。并且由于\(f_{i,j}\)\(i+j\)是偶数的时候才有值,所以我们可以写成\(g_{i,s}=\max(g_{i-1,s}+g_{i-1,s-1}+2*x_i)\)这样。然后这个函数就是凹函数,就是斜率都是递减的,这个归纳就可以证明了。我们设\(g_{i-1,j}-g_{i-1,j-1}=a_j\),那么刚才的转移式等价于\(a_j\)\(2*x_i\)比较。这个操作会在\(g_{i-1}\)的函数图像上有什么赢下。由于\(a_j\)单减,因此我们找到第一个满足\(a_j<2*x_i\)的边,那么前面的斜率不变,从这条边开始边,这个边肯定要增加\(2*x_i-a_j\),后面的受这个影响也会增加这么多,考虑\(a_{j+1}\)怎么办,\(g_{i,j+1}\)\(g_{i-1,j}\)之间的斜率应该是\(2*x\),也就是增加\(2*x-a_{j+1}\),但是由于前面的内阁已经加了\(2*x-a_j\),所以这个只需要加\(a_j-a_{j+1}\),也就是变成\(a_j\),以此类推,增加一个\(2x\)的斜率,相当于是在原斜率上合适的位置插入\(x\),把后面的斜率往后延。那么我们怎么维护呢?使用\(multiset\),遇到一个\(x\),把\(2x\)插入,然后,因为\(j\)是有范围的,所以\(s-i=j\)也有范围,所以我们需要把\(set\)中不在范围中的值删掉,注意:我们还要维护函数起点的值。代码如下:

v = 0;
for(int i = 1; i <= m; i ++) cin >> x[m - i + 1], v -= x[m - i + 1];// 初始化初始值
p = 0;// 起点位置
for(int i = 1; i <= m; i ++) {
    s.insert(x[i] << 1);
    int l = (i + 1) / 2, r = (n + i) / 2;// 限制的区间。
    while(p < l) v += *s.begin(), s.erase(s.begin()), p ++;// 更新起点的值,虽然前面的哪些点不能够给后面的dp值有贡献,但是当前函数的每个点的值,都要通过原来的起点推的,所以我们要更新起点的值从而给后面更新
    while(p + s.size() > r) s.erase(prev(s.end()));
}

总结:转移中有加有减,并且加减值之和\(dp\)位置有关,则可以先都减或都加,省掉一个操作;\(g_{i,s}=f_{i,s-i}\)这个,就是把其中某一维换成和差,有时会有比较厉害的影响。

GFP1990

发现一个正方形的限制不太好搞,但是如果把\(y=x\)左边的点对称到右边(答案不变)那么我们只需要找到右上角的点和右下角的点就可以了。因为向左拓展只会取到一个等腰直角三角形之中的点,所以就对了。然后使用扫描线维护就行了。(不过这样只是好看一点,本质上还是扫描线,考场上没有立刻反应过来感觉是暴力拓展\(r\)暴力加入新的点是对的,啊啊啊它放到\(T3\)的位置就根本不想想啊\(T2\)还是一个分讨大题。。)

总结:正方形比较特殊,并且这个左上右下的端点都在\(y=x\)上,所以把点对称过来简化了问题。

GF1991

其实我觉得这道题还挺好的。就是我们把\(a,b\)网格画出来,\(01\)代表先手必胜还是必败,那么易得,对于\((x,y)\),如果存在\(a<x or b<y\)使得\((a,y),(x,b)\)是必败态,那其就是必胜态,否则还是必败态。现在给定了一些点,强制这些点是必败态,最后问是什么\((a,b)\)是什么态。考虑\(V\)比较小的时候,我们就根据这个格子递推一下就行了。比较大呢?我们发现,对于第\(i\)行,我们记录一个\(lim\)表示第\(i-1\)必胜态最多连续拓展到哪里,记一个\(set\)表示大于\(lim\)的散点\(O(n)\)个。那么第\(i\)行,必败态的位置就是\(lim+1\),然后再合并一些散点。不过这样直接做还是爆,不过当一个连续的区间即没有散点也没有询问或加点,那么操作就比较单一了,那么我们就可以加速这个过程,这个也比较好说,那么就大概做完了。

总结:博弈可以设出来必败必胜,通过转移得到其他状态,当必败态比较少的时候记录下来,转移就记新的必败态就好了。

GFP1989

这个题就是内阁分讨大题。场上根本没想分讨。。。这里就不多说了,放一个题解好了:
其实 Subtask 的那张表已经提示你怎么分讨了。

  • \(( |T| = 1 ):判断 ( S ) 中是否存在 ( T ) 即可。\)
  • \(( |T| = 2, T_1 \neq T_2 ):假设 ( T = 01 ),则 ( S ) 最终一定是一堆 ( 1 ) + 一堆 ( 0 )。容易发现,每次操作可以将连续的一段 ( 1 ) 搬到前面去,故答案为非前缀的 ( 1 ) 连续段数量。\)
  • \(( |T| = 2, T_1 = T_2 ):假设 ( T = 00 ),则 ( S ) 最终不能出现相邻的 ( 0 )。先判掉无解的情况(( 0 ) 的个数超过 ( \lfloor n/2 \rfloor + n \bmod 2 ))。否则,每次操作可以视为将一个 ( 1 ) 插到相邻两个 ( 0 ) 中间,因此答案为所有 ( 0 ) 的连续段长度 ( -1 ) 之和。\)
  • \(( |T| = 3, T_1 \neq T_3 ):这样 ( T ) 在所有 ( S ) 中出现的位置一定不交,容易发现一次操作可以破坏一个 ( T ) 的出现位置,所以答案为 ( T ) 在 ( S ) 中的出现次数。\)
  • \(( |T| = 3, T_1 = T_3 \neq T_2 ):假设 ( T = 010 ),则 ( S ) 最终不能出现长度 ( > 1 ) 且不为前后缀的 ( 1 ) 的连续段。一次操作可以合并两个 ( 1 ) 的连续段,记长度( = 1 ) 且不为前后缀的 ( 1 ) 的连续段个数为 ( x ),容易计算得答案为 ( \lfloor x/2 \rfloor )。\)
  • \(( |T| = 3, T_1 = T_2 = T_3 ):假设 ( T = 000 ),则 ( S ) 最终不能出现相邻的超过 ( 3 ) 个 ( 0 )。先判掉无解的情况(( 0 ) 的个数超过 ( \lfloor n/3 \rfloor \times 2 + n \bmod 3 ))。否则,每次操作相当于将两个长为 ( x, y ) 的连续段变为两个长为 ( x', y' ) 的连续段(( 0 \leq x', y' \leq x + y = x' + y' ))。初始状态可以看做,若干个连续段可以增加 ( 1 ) 或 ( 2 ) 个长度,若干连续段需要减少若干个长度。我们需要最大化“一次增减 ( 2 ) 个长度”的操作次数,用堆贪心取即可。\)

没错我让AI写的markdown

总结:当情况比较少的时候可以考虑分讨解决问题。

AT_arc179_c [ARC179C] Beware of Overflow

关注到,最大值加最小值\(\le R\)(注意只有这两个满足,其他的不确定)。并且我们知道大小关系就能够排序。所以我们先排序一下,找到最大值最小值,加起来,然后通过二分插入到序列,然后循环就行了。复杂度\(O(n^2log n)\),查询次数是\(O(2n\log n)\)。就没了。

总结:知道大小关系可以排序。

arc137_c

啊,这个,就是如果最大值>次大值\(+1\),那么\(A\)可以挪到次大值\(+1\),那么\(B\)在移动肯定要挪到前面,如果此时\(B\)有必胜的策略,那么\(A\)可以一开始就走到那里。所以这种情况\(A\)先手必胜。然后再看最大值\(=\)次大值\(+1\),那么双方为了让对方输,会走尽量少的步数,也就是每次把最大值减小\(1\),那么我们分析一下这个奇偶性就行了

总结:这个好像叫决策覆盖,就是如果后手有必胜,那么先手可以到达这个必胜就决定了先手必胜。

agc066_a

这个应该是说是二选一把,就是因为是四个方向的东西,所以我们考虑二染色,\(i+j\)为奇数,考虑让他到达最近的\(%2d = 0\)的点,否则到达最近的\(%2d = d\)的点,这样是能保证\(\ge d\)的。显然还有完全相反的操作。一个点,到达\(%2d = d,%2d=0\)的点所需的代价加起来就是\(d\)\(n^2\)个点的这两个代价和加起来就是\(dn^2\),所以至少有一个方案使代价\(\le \frac{dn^2}{2}\)

总结:我不知道怎么想到的,但是方法是二选一

agc012_c

这个,我们尝试让重复的两个字串有一个明确的分界点,就是让左右两边不出现重复的,让左边去匹配右边。那么我们让左边是\(1\sim k\)的顺序。那么右边就是让\(1\sim k\)的排列恰好有\(N\)个上升子序列。那么考虑增量构造,假设\(1\sim i\)已经有了\(n\)个排列,考虑\(i+1\)的贡献。如果放在最后面,就是变成\(2*n+1\)。放到最前面就变成\(n+1\)。我们通过这个操作得到答案啊。那么我们倒过来考虑,如果二进制最后一个是\(1\),那么就操作\(-1,/2\),否则操作\(-1\),然后这个操作的个数是\(2\log n\)的,可过。(sbhjl明明有两种做法,非要使用正着做的方法调了一个多小时过了,然后换了另一种做法\(-inf\)秒就写完了TAT)

总结:正着写不好写就不写了。。。。

arc105_e

考虑最后的时候一定是\(1\)一个完全图连通块,\(n\)完全图连通块,不连边。考虑\(1\)所在连通块大小\(x\)\(n\)\(y\),那么操作数就是\(\frac{n*(n-1)}{2}-m-xy\),判断奇偶性就能知道谁赢。当\(n\)是奇数是,\(x*(n-x)\)必为偶,所以直接看。如果\(n\)为偶,那么\(x,y\)可能会有影响。在考虑,如果起始时,\(1\)大小为\(x'\),\(n\)大小为\(y'\),如果\(x'y'\)奇偶性相同,那么剩下中奇数点的连通块个数为偶数个,那么如果想改变奇偶性,那么只能拿奇数点,那么后手就可以再拿一个来消耗这个操作,所以奇偶性不改变(如果后手碰到了只有奇数点的局面,那么可以选两个奇数点连一起把局面交给对方),如果不想改变,那么只能拿偶数点,那么现在就变成了后手变成想改变的先手状态,所以奇偶性也不改变,所以最终的奇偶性只与一开始相关;考虑一开始不同,那么先手拿一个奇数点改变,后手就改变不了了,所以先手必胜。

总结:考虑操作抵消。

GFP1983

赛时有点问题,考后破防没有调出来,最终重构代码终于过掉。考虑策略。先考虑都在零食店出发,如果在\(M\)店,就有\(m\)的储量,否则有\(0\)的储量。计算从这里开始的需要的\(N,S\)数量。考虑当前在\(M\)点,那么我们肯定想走到最远的\(M\),没有则最远的\(N\),没有则最远的\(S\),都没有就\(-1\)。然后就转移。同理\(N\),也是。到了\(S\),由于想要这个最少。于是如果\(m\)的储量中有\(M,N\)店,所以我们想要走到最近的其中一个,如果一个\(M\)\(N\)都没有,那就走到最远的\(S\)店。直接做,发现大样例过不了。问题出在哪里呢?因为刚刚我们在一个点的策略是只收集够自己走下一段路的零食,但是我们可以多储备一点,下一个是级别更高的就不全买,利用剩下的走。所以,如果我们走向的是一个级别更高的零食店\(to_i\),我们就记录下\(to_i\)连续走和他类型一样的点1走了多少(设为\(dis\)),然后减去当前可以剩下的,就更优了。注意当前多消耗了当前零食类型,所以要把当前\(dis\)更新一下。

总结:贪心,如果有比较劣的操作,就调整一下策略。

GFP1985

这个,就是分讨,判断有什么情况是合法的,发现情况很少,然后容斥得到答案。
image
啊不管了。。。。好烦。。调了好久。。。感觉自己好唐。

GFP1999

就。发现等于没有传递性,所以不能直接做。现在问题变成了怎么求\(i\)后缀和\(j\)后缀的\(lcp\)。唐唐的使用\(z\)函数。发现假了。但是设\(f_{i,j}\)表示\(i,j\)后缀的\(lcp\),那么就,\(O(1)\)转移就行了。。。。\(O(n^2)\)就好了。剩下的和优秀的拆分相同。

总结:看到字符串不一定一定要使用字符串算法,直接\(dp\)也有可能


7.21 数论

P1829

推式子题。\(\sum_{i,j}\frac{ij}{\gcd(i,j)}\)。枚举\(d=gcd(i,j)\),\(\sum_{d}^{n}d\sum_{i=1}^{\lfloor \frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor \frac{m}{d}\rfloor}ij[gcd(i,j)=1]\)。对后面这个使用\(\mu\)的卷积。\(\sum_{t|i,t|j}\mu(t)\)。考虑求出\(d\)后面的式子。\(\sum_{i}^{n}\sum_{j}^m ij\sum_{t|i,t|j}\mu(t)\)。调换枚举顺序\(\sum_{t}^n\mu(t)t^2\sum_{i}^{n/t}\sum_{j}^{m/t}ij\)。设\(sum_n=\sum_{i=1}^{n}i\),那么后面两项就是\(sum_{n/t}*sum_{m/t}\)。也就是\(\sum_{t}^{n}\mu(t)t^2 sum_{n/t}*sum_{m/t}\)。合并一下就是\(\sum_{d}^{n}d\sum_{t}^{n/d}\mu(t)t^2 sum_{n/dt}*sum_{m/dt}\)。对于\(t\)来说,同样的\(n,m\)我们可以通过二维数论分块求。由于\(d\)会影响后面的\(n,m\),所以外面也是一个二维数论分块。套一下就行了。

总结:推式子。改变枚举顺序时如果不好化简,考虑是不是顺序不对。二维数论分块好久不用了。

QOJ-9619

就是,根据\(\varphi\)的定义把式子改写一下。我们发现值域很小,所以把其含有小于\(\sqrt{V}\)的质因子压到二进制里面。大于的放到\(V_i\)里面。按照\(V_i\)排序,设\(f_{i,S,0/1}\)表示考虑了\(i\),当前乘积中小于\(\sqrt{V}\)的质因子的集合时\(S\),是否含有\(V_i\)的所有方案的贡献和。然后分讨\(v_{i+1},v_i\)是否相等转移。

总结:由于值域比较小,所以比较小的质因子可以状压,比较大的直接记录,根据定义求答案,感觉思路还挺自然的。

agc027_d

构造题,不知道怎么想到的。

agc003_d

注意到我们只关心每个质因子次数在模\(3\)下是多少。根据这个我们可以找到一个互补的数,然后建图,找最大独立集。注意到一个点的度数最大为\(1\),也就是一个连通块最多两个点,所以记录每个数的次数,然后选次数比较多的就行了。值域比较大。大于\(\sqrt[3]{V}\)的质因子最多有两个啊。所以只筛小于\(\sqrt[3]{V}\),考虑筛完剩下的情况\(x\)。如果\(x=p^2\),那么这个好判,然后只需要让互补的数乘上\(x\)即可。如果\(x=p\)\(x=pq\),那么互补的数成上\(x^2\)。所以后两种情况只需要判断互补的数乘上\(x^2\)时候超过值域就行了。接下来就好做了。

总结:感觉建图找最大独立集的转化还挺秒的。

qoj15032

就是,如果\(a^x\equiv b\pmod{2^64}\)成立,那么\(d\le 64, a^x\equiv b\pmod{2^d}\)也是成立的。那么首先我们先判掉\(2\mid a\)的情况,由于是偶数,所以\(a^64\equiv 0\),所以\(x\in [0,64]\)。考虑奇数。按照刚刚的思路,我们让\(d\)从小到大,并且记录\(x\)目前记录到了二进制下的多少位,记录的位置满足当前刚刚好是确定的,就是当这一位填\(0/1\)都能成立,那么更大的位置也是都成立了。然后就递推,当\(d\)增大的时候,看当前这位是否满足就行了。如果\(0/1\)都行,那就不在进行了,如果只有一个行,那么就记录下当前位置,再考虑更大的数,如果都不行,那么就无解。

总结:如果模的是多少的次方,那么比这个次方小的也能满足。


dp

Gym-104373H

这个,感觉一个转化还挺妙的。因为式子是\(\sum_{|p_i-p_{i+1}|}\),转化贡献,我们让\(|p_i-p_{i+1}|\)中间的位置都恰好贡献一次,具体的,就是外层枚举一个\(x\),把\(\le x\)设为\(1\)\(>x\)的设为\(0\),然后记录这个排列中相邻两个不同的位置有多少个。然后怎么做。设\(f_{u}\)表示\(u\)子树的拓扑序个数(因为题意可以看作一个外向树的拓扑序),\(g_{u,i}\)表示\(u\)的拓扑序中第\(i\)位为\(1\)的个数,\(h_{u,i}\)表示\(u\)的拓扑序中\(i,i+1\)不同的方案数,然后通过\(g,h\)合并互相转移,复杂度是树上背包的复杂度。分讨,组合数。

总结:转化很妙,状态不知道咋设出来的

CF1264D2

这个,如果没有问号,那么我们就是枚举一个分割点,设其左边左括号有\(l\)个,右边右括号有\(r\)个,这个分割点的贡献就是\(\min(l,r)\),那么答案就是\(\max(\min(l,r))\)了。继续思考,考虑分割点向右拓展的时候,\(l,r\)会有一个\(+1\)\(-1\),也就是他们差值会\(-1\),直到相等,然后再错开,那么比较自然的发现当\(l=r\)时就是答案,并且这种状态只有一个分割点是满足的。那么就很好了,我们枚举分割点是哪一个,通过分配\(?\)来让\(l=r\),具体的,设一个分割点左边有\(x\)个问号,右边有\(y\)个问号,那么答案就是\(\sum_{i=0}^{x}(l+i)\binom{x}{i}\binom{y}{l+i-r}\)个,这样是保证了\(l+i=r+l+i-r\)了,然后通过拆式子,再合并,利用范德蒙德卷积得到最终的式子,\(O(n)\)

总结:先想一个弱化版,通过弱化版得到的性质推强化版。组合数拆式子感觉很不熟练。

CF1842G

这个,拆式子,\(dp\)\(dp\)乘积的过程,这个可以写成几个多项式相乘的形式。考虑对于第\(i\)个多项式,我们有几个选择:1. 乘\(a_i\) 2. 由于前面有乘\(v\)的,因为是一个后缀加,所以前面能乘的,这里也能乘,设前面选的本质不同的\(v\)(也就是是不同次加上的\(v\))是\(j\),那么就有\(j\)种方案乘\(v\),3. 我们可以再分配一个操作,还剩下\(m-j\)个操作,这个操作一定要作用与\(i\)及以前才能在当前后效。 由上,我们设\(f_{i,j}\)表示第\(i\)个多项式,乘上了\(j\)个本质不同的\(v\),的所有方案的权值和。转移:

\[f_{I,j}\times a_{i+1}\to f_{i+1,j} \]

\[f_{i,j}\times jv\to f_{i+1,j} \]

\[f_{i,j}\times (m-j)\times (i+1)\times v\to f_{i+1,j+1} \]

对应三个转移。然后最后呢,如果还有没有乘的操作,那我们不关心他们,随便就行了。答案就是\(\frac{\sum_{i\le \min(n,m)} f_{n,i}\times n^{m-i}}{n^m}\)

顺便提一下,由于多项式乘法是有顺序的,所以第三个转移保证了不重复,正确性

CF1603C

我说我唐完了。给定\(a,x\)求最小正整数\(k\),使\(\lceil \frac{a}{k}\rceil\le x\)。由于向上取整,所以可以看作\(\frac{a}{k}\le x\),转化一下就是\(k\ge \frac{a}{x}\)。那么就是\(k\ge \lceil\frac{a}{x}\rceil\)。所以\(O(1)\)求就行了。然后就是,因为连续段只会合并,所以我们加答案的时候只需要给整个连续段\(O(1)\)加就行了。不同唐唐的写线段树。。。。然后连续段最多有\(\sqrt{v}\)个,是因为整除分块只有这个多个取值。

总结:能精简就精简,尝试优化复杂度,太冗余了。

CF1608D

太菜了,不会。思考路径是考虑是类似什么样的合法的。先考虑只有\(AB\)\(BA\)\(AA\)\(BB\),那这样一定合法。如果同时存在\(AB,BA\)那么必须需要一个\(AA\)\(BB\),并且\(AA,BB\)数量一定相同,否则不合法(手玩),那么限制就有了1. \(A,B\)数量相同,2. 若\(AB,BA\)同时存在,那么需要有\(AA\)。容斥一下。

arc154_e

场切的已经不是人类了。前面的转化还挺秒的。就是\(\sum_{i<j}[P_i>P_j](j-i)\)考虑拆一下贡献,\(\sum_{i}j\le i[P_j\ge P_i]i-\sum_{i}i<j[P_i>P_j]i\to i(i-\sum_{i}j\le i[P_j\le P_i]i-\sum_{i}i<j[P_i\ge P_j])\to i(i-P_i)\)。这步是真妙。然后后面也挺秒把,本质相当于求\(\sum iP_i\),然后转化一下,设\(P_i\)这个值最后的位置是\(s_i\),那么答案就是\(\sum s_iP_i\)。由于要求所有方案的权值,所以我们可以求\(s_i\)的期望值。考虑一次操作,若\(i\to j\),看其方案,\(i<j\)时,\(\min(i,n-j+1)\),\(i>j\)时,\(\min(j,n-i+1)\)。然后分讨一下发现可以合到一起\(\min(i,n-i+1,j,n-j+1)\),由此知道\(j=j,j=n-j+1\)是方案数相同,所以这两种情况的期望是\(\frac{n+1}{2}\)。由于对于所有的\(j\)都一样,所以一次操作后其位置的期望就是\(\frac{n+1}{2}\),也就是\(m\)次操作,如果有一次覆盖了\(i\),那么其位置的期望就是\(\frac{n+1}{2}\)。接下来就分讨,一次操作都没覆盖到的概率,和至少覆盖一次的概率,得到最终的期望。

总结:把式子转化。总方案的权值,可以等价于求期望值(这个东西感觉好吃操作)

CF1119H

这个应该是黎明前的巧克力的加强版,思路还是考虑解方程。我们想要把每个都\(FWT\)一遍然后点乘再\(IFWT\)。但是爆了。但是发现每个数组\(FWT\)后都是\(\pm x\pm y\pm z\),一共八种情况,太多了,考虑简化一下(不简化 也行稍后再说)让最后的方案先强制选上\(a_i\),然后把集合变成\(\left\{0,b_i\optimes a_i,c_i\optimes a_i \right\}\)。那么\(x\)始终为正了,只有四种情况。考虑求出最后的数组里面四种情况各有多少个。那么我们需要四个方程。\(x+y+z:c_1,x+y-z:c_2,x-y+z:c_3,x-y-z:c4\)。有\(c_1+c_2+c_3+c_4=n\),然后我们只令\(f_{b_i}=1\),\(\sum FWT_i(j)\)就是所有集合中\(-1^{(j\And b_k)}\)的和。那么就是\(c_1+c_2-c_3-c_4\)。同理只让\(f_{c_i}=1\),得到另一个方程。还需要一个。让\(f_{b_i\optimes c_i}=1\),那么这个就是\(y,z\)的符号乘积起来的和,也就是\(c_1-c_2-c_3+c_4\)。这样就得到四个了。观察上面的过程,其实如果多列几个方程,就可以再不简化的情况下做出来。以此类推,我们也可以把这个集合的大小变大,原理一样。

CF1292C

退化了。不会青题了。从小到大加边,\(0\sim i\)一定可以组成一个链,否则不由。在此基础上,发现向右拓展一个的贡献只与子树大小有关。于是设\(f_{u,v}\)表示已经连续到\(u,v\)的最大值。转移就是找是从哪里拓展过来的,然后贡献一下,使用记忆化就行了。

总结:贪心的部分挺好的。

AT_abc340_g

感觉比上一个题简单。就是分别考虑每个颜色,如果在原树上\(dp\)\(O(n^2)\)的,每个颜色都要\(O(n)\)。不过建出虚树来就行了,复杂度就是\(O(n)\)了。

总结:关于树上颜色限制的题目,联想到虚树。

最近好摆啊。。。。。。

GFP2006

就是先确定能确定的,再随便填一个。然后重复。证明正确性。若随便填\((x,y)\),并且填的是\(0\),那么若\((X+1,y+1)\)能够确定,那么\((x+1,y),(x,y+1)\)都是\(1\)\((x+1,y+1)\)也要填\(1\),能知道下一个确定的最多只能是\((x+2,y+2)\),(因为同色限制了),归纳到\((x+k,y+k)\)确定,此时\((x+k,y+k-1),(x+k-1,y+k)\)\((x+k,y+k)\)同色。如果此时矛盾,那么一定与左下角矛盾,和之前填的无关,所以这种请况一开始就应该判掉了。然后就做\(O(nm)\)

GF2007

建出一个\(dfs\)树,然后黑白染色,设白点数量\(>\)黑点数量,并且数量分别为\(a,b\),那么如果\(a\ge \frac{n}{3}\),那么选树上\(a\)度数前\(\frac{n}{3}\)的点,染成\(1\),那么还剩下\(a-\frac{n}{3}\),知道\(a-\frac{n}{3}\le \frac{n}{6}\),并且剩下的点的度数\(\le 2\),所以与\(b\)相邻的点\(\le \frac{n}{3}\)。所以就把剩下的\(a\)染成\(2\),把相邻\(b\)的染成\(3\),然后,把剩下的\(b\)中选一些点使\(2,3\)的颜色都是\(\frac{n}{3}\)。满足\(1\)限制。考虑\(a<\frac{n}{3}\)\(b\)的非叶子节点一定至少有一个\(a\)。那么\(b\)的叶子节点至少有\(b-a\)个。然后能得到\(b-a\ge a\),并且叶子间没有连边,所以把这些点染成\(1\),剩下的点黑白染色就行了。

一场两个nb题目

P10829

这个就是说,这个构造方式比较特殊,如果我们建出圆方树,那么合法的方案就是一个方点连着三个大小相同的好图。然后递归做。发现,一开始的方点就是重心。然后复杂度就对了。注意判重边

P10517

这个就是用到,一个点集,按照\(dfs\)序排一下,然后计算相邻两个的权值和,首尾也算,这样算出来就是路径并(边权和)的两倍。这个点权就上放一下就行了。最后加一下根的贡献,就是\(dfs\)最小和最大的\(lca\)。然后就用一个\(set\)维护一下就行了。

P4334

这个纯板题。知道一个割边是一个方点连两个割点(并且不能有其他点)就行了。

posted @ 2026-07-13 15:38  lghjl  阅读(7)  评论(0)    收藏  举报