- 博客(92)
- 收藏
- 关注
原创 Codeforces Round 1049 (Div. 2)
考虑偶数情况,即选择n/2个数的r-剩下n/2个数的l最大,变行一下就是所有数的r-n/2个数的l+r,满足后者最小即可。拓展到n为奇数,如果剩下的一个l比n/2个l的最大值小可以替换,r比n/2个r大可以替换。显然B在第一轮会结束,那么只需满足A在第一轮选最大的收益,选奇偶性相同的就选两端,不同的就是(r-l)+a[r]-a[l]或a[l]-a[r],预处理即可。
2025-09-11 18:29:15
249
原创 Codeforces Round 1048 (Div. 2)
思考什么情况下会出现两种交换不相等的情况,出现一个数它前面有比它大的数,后面有比它小的数,即存在数后面有两个连续递减的数,我们用单调栈处理每个数最近的连续递减的数的位置,然后在给定区间内找到每个位置对应的最小的单调减位置是否在区间内。
2025-09-11 18:18:42
342
原创 Codeforces Round 1042 (Div. 3)
设消除1~i的数的操作次数为f[i],可以推出f[i]=2*f[i-1]+1,那么消除1~i的数的分数乘的数为g[i],g[i]=g[i-1]*g[i-1]*i s虽然很大,但是k只有1e9,先预处理fg,并且得到最大可以消除它和它衍生得到的数m。把所有数放到set,从小到大判断每个数及它的衍生数是否可以完全消去,可以则直接消去计算价值,否则拆乘成小于m的若干个数。注意到每个操作最多执行一次,ifa[i]!=b[i],要么a[i]^a[i+1]要么a[i]^b[i+1]
2025-08-13 17:02:41
257
1
原创 CodeTON Round 9 (Div. 1 + Div. 2, Rated, Prizes!)
我们从大到小填数,考虑对于位置i,j(i<j),如果j%i==0,那么必须保证a[j]%a[i]!=0,那我们填a[j]为a[i]下一个数(从大到小排序),所以从小到大枚举i,再枚举它的倍数j,当枚举到i时此时a[i]就是这个位置的最大值。如果保证了所有对(i,j)j%i==0,都有a[j]%a[i]!=0,那么一定满足题意。
2025-08-09 21:51:34
113
原创 Codeforces Round 967 (Div. 2) D. Longest Max Min Subsequence
建立一个suf数组,代表以i开头的后缀有多少个不同且在b[1~i-1]中未出现过的的个数,预处理suf,发现后续我们怎么选数改变suf,suf都始终单调不递增,我们选择的j位置满足suf[j]>=m-i+1。选择的这个数的最后一个位置之前的所有的suf-1,这个我们用线段树模拟每个位置减去的数,二分时减去这个值即可。每选定一个数,把这个数出现的所有位置包含的线段树的点的最大值改为最小,最小值改为最大,保证不可能再选。假设我们要选a[j]为答案数组b[i],从i从1~m(m为a数组中不同数的个数)
2025-08-09 11:55:52
170
原创 Codeforces Round 987 (Div. 2)
设f[x]表示x的子树的最小层数。下面我们将执行一个还原操作,将这个节点的子树还原为二叉树,此时它的孩子全部还原完成且知道还原完的层数。我们每次还原删去的父亲节点的f值就是它的两个孩子的f值中大的那个+1。相当于我们每次取两个孩子合成一个新的孩子,这个孩子的值为之前两个孩子的最大值+1,然后循环操作,直到就剩两个孩子为止,此时这两个孩子合成的就是原父亲节点。从后向前枚举,如果一个数无法后移,那么答案就是最大前缀,否则答案要不是前缀最大,要不就是这个数先移到前缀最大位置再移到能移到的最大的位置此处的答案。
2025-08-06 22:49:17
198
原创 Codeforces Round 986 (Div. 2)
观察发现我们从第一列任意一个位置出发,找到同一行后面大于这个数的数,跳到这个位置,然后可以上下移动,然后继续上一步操作,问是否可以到达最后一列。外层从小到大枚举每种类型的牌,内层枚举三个人,维护出每个人当前类型之前的最大的数的值和位置与由哪一列跳到这一列,如果当前位置小于维护的这个值,就可以到达,如果这个类型存在一个位置可以到达,那么更新三个人当前类型之前的最大值和位置。答案输出类似与dp中递归输出方案。
2025-08-04 21:31:43
206
原创 Refact.ai Match 1 (Codeforces Round 985)
观察操作数的范围猜测要进行两步操作,先拆再连,如果一个点的度>1,那就选这个点和与他相邻的两个点这样的好处是能把所有点的度数变为1或0,那么每个分量要不是1要不是0,拆的操作数最多为m,连的操作数最多为n,符合要求。难点在于拆时如果快速判断那两个点是否相连,和那两个点的拆和连,这里用set可在log内判断并添加/删除。
2025-08-04 16:55:02
142
原创 Codeforces Round 984 (Div. 3)
先计算l~r的异或和,再异或一遍l~r的非快乐数。后者的非快乐数用算式表示为k+n*2^i(k<2^i),比如k=3,i=4,那么非快乐数为000011,010011,100011,110011,发现后i位一定是k,而把整个数右移i位就是0,1,2......和第一步计算类似,最后判断非快乐数的奇偶决定要不要异或一个k即可。a[i][j]一定>=a[i-1][j],所以已经排好序了。对于>我们用upper_bound找,<用lower_bound-1找,看有没交集。
2025-08-04 10:03:05
208
原创 Educational Codeforces Round 171 (Rated for Div. 2)
l和r太大导致我们只能把它们映射到某个小区间内去求。以a1 a2 ...an开头加一共有n个区间,我们把l和r映射到这个区间求。我们只要确定l和r在区间中的位置,就可以O(1)利用区间的前缀和求出每个询问,区间的和由原数列的前缀和的前缀和求出。最后只需处理不满一个完整区间的情况即可。
2025-08-03 11:17:27
226
原创 Codeforces Global Round 27
将每个数拆成x*2的整数次幂,一个直接的想法是尽量把2的整数次幂给大的数。那么所有乘上2的整数次幂的数构成的序列单调递减,反证法,如果序列中存在i j 使得a[i]<a[j],那么我们不如把给a[i]乘的2的幂给a[j]乘。
2025-08-02 21:53:07
238
原创 Codeforces Round 982 (Div. 2)
比较容易看出来是动规,判断完-1后,状态就是a中前i个被b中第j个删去后的最小代价。转移就是找出最小的k使得a[k]+a[k+1]+....+a[i]<=b[j],f[i][j]=min{f[k-1][p]}+m-j,枚举i j 确定k后还要枚举p超时,考虑使用双指针把枚举k的那一维压掉,那么原本从1~n枚举i再从1~i枚举k变为从1~n枚举右端点后,左端点可直接求出,我们定义f[r]为a的前r个数被b消掉的最小代价,这样可以压一维。
2025-08-02 19:12:34
277
原创 Codeforces Round 1040 (Div. 2)
两个数产生的逆序对只会被计算一次,那么我们算完每个数的逆序对可将其删去避免重复计算。一个数,如果我们从小到大考虑数,那么对于数x,此时全场的数都大于x,x如果不变,x前面的数无论变还是不变都会构成逆序对,而后面的数都不会构成。那我们只需通过一个数前面和后面比它大的数的数量就可以判断它便还是不变。
2025-08-01 20:46:40
105
原创 Codeforces Round 1039 (Div. 2)
中位数的题一个常见做法是二分中位数,把>=这个数的位置赋为1,否则赋为-1,如果一个区间的和>=0那么中位数成立。下面我们检验是否有区间长度大于k满足区间和>=0,等同于找pre[i]-pre[j]的最大值是否>=0(i-j>=k),我们枚举右端点。f[i]表示以i结尾的所有子数组的最长递减子序列长度之和,考虑转移,a[i-1]和a[i-2]一定至少有一个比a[i]大。,左端点我们再找一个前i-k的pre的最小值即可。
2025-07-29 09:45:10
223
原创 Codeforces Round 973 (Div. 2)
如果存在a[i]>a[j],i<j那么一定可以通过操使得a[i]和a[j]的差距变小,我们最后可以构造出一个单调不递减数列,那么答案就是a[n]-a[1],由于序列的和是固定的,那么当最小值取最大时,从1~n-1,a[i]<a[1]时,差的值从前面移的值补,a[i]>a[1]多的值可以作为补后面的值,最后剩下补给a[n]的值是最小的,可见a[1]q取最小值最大时a[n]可取的理论最大值最小。
2025-07-23 20:00:12
182
原创 Educational Codeforces Round 181 (Rated for Div. 2)
从第一个段开始首尾相连到覆盖到最后一个段才符合题意。f[i]表示覆盖完1~i段的概率,发现最后答案还要乘一个没有覆盖的段的概率,计算十分复杂。我们不妨开始就先乘上使所有段都变成不覆盖的概率(q-p)/q,之后我们算覆盖的段的p/(q-p),这样二者相乘就是覆盖段的p/q乘上不覆盖段的(q-p)/q。如果一个数不是好数,那么它一定能被2 3 5 7整除,我们直接算l~r内有多少个数是2或3或5或7的倍数,利用容斥原理可以直接算出。
2025-07-23 16:08:02
226
原创 Codeforces Round 1037 (Div. 3)
如果修改一个点的颜色,那么原来与他颜色相同的点的边权要加上,现在与他颜色相同的点的边权要减去。如果与他相连的点很多暴力修改会超时。先跑一遍树,用map存每个点的子节点不同颜色的边权和,每次修改一个点我们和父节点单独讨论,子节点我们用map修改。首先必须满足p序列p[i]%p[i+1]==0,s序列s[i]%s[i-1]==0,在此前提下如果每个位置i都满足gcd(p[i],s[i+1])=p[n]那么序列存在,反之不存在。
2025-07-19 18:12:55
120
原创 Educational Codeforces Round 170 (Rated for Div. 2)
f[i][j]=max(f[i-1][j],f[i-1][j-1])+这一个0到上一个0中<=j的正数和>=i-1-j的负数的个数。g[i][j]=g[i][j]+g[i-1][k]*f[m][j-k].代表2~i-1层B比A多k个的方案数*第i层B新增的比A多出的j-k个的方案数,后者在第一步已经算出。f[i][j]代表花色为1的前i大的牌A比B多j张牌的方案数。转移为f[i][j]=f[i-1][j-1]+f[i-1][j+1]分别代表等级为j的牌分为A还是B。1.花色为1的如果有剩余,只能是A。
2025-07-14 21:23:04
224
原创 EPIC Institute of Technology Round Summer 2025 (Codeforces Round 1036, Div. 1 + Div. 2)
而大于第k小的数的数如果存在在最后的回文中,那么将他们删去回文一定也存在。且不删不比删去优,所以一开始我们就删去,此时我们只需判断剩下的串是否可以通过删去第k小的数构成回文串且剩下的数最小的数量是k-1,用双指针判断。如果我们能经过一系列操作使得a[1]+a[2]+...+a[id]=a[id+1]+...+a[n],此时一次操作结束。先找到a[1]+a[2]+...+a[id]>sum/2。多出的数设为val,我们要将a[1..id]减去val,那么一端减去val/2即可。
2025-07-07 21:29:29
286
原创 Codeforces Round 979 (Div. 2)
如果存在LR,则这两个位置无法交换,相当于中间断开了。对于a[i],我们要将它换到i,如果中间存在断点,则无法交换成功。我们用差分维护需要没有断点的位置,在每次询问中判断这些没有断点的位置是否存在断点。我们可以把式子化为(....)||(....)||(....)括号里没有||,如果括号全是1那么A赢,A尽量选择把1选在一起。c[1]-b[1]=0,之后每个c[1]-b[1]最大都是maxa-mina,最大和最小放前两个。ans=2^(a+1)-2^s-1,1一个最小。
2025-07-07 17:44:07
241
原创 Codeforces Round 980 (Div. 2)
这个过程一定是由1向后跳的过程中穿插有几次向前一步一步走。直到跳到一个位置后再把前面所有没有走过的位置倒序走一遍。总分就等于最大位置的前缀和-前面所有起跳位置和。前缀和固定我们只需要求到每个位置的最小起跳和即可。对于这个向后跳和向前走的过程我们可以用一张有向图图抽象,具体而言,对于i和i+1连边,边权为0,对于每个位置i,如果b[i]>i那么i到b[i]连边,边权为a[i]。如果出现相同的b[i]可能走重的情况有i和i+1无边权的边可以规避。那么每个位置的最小起跳和就是1到这个位置的最短路。
2025-07-02 20:00:39
250
原创 Educational Codeforces Round 180 (Rated for Div. 2)
首先,长度为1的边的已经有n-1条,那么构造的图中只能存在一条长度为2的好边。我们先构造出一个图只存在n-1条好边,我们发现对于一个点所有连接它的边要不均指向它要不均背离它。我们的目标变为寻找长度为2的边的中点,发现反转相连的一条边后当且仅当这个点的度数为2时可以只新增一条边长为二的边。对于ax+ay+az>max(2*az,an),枚举y z 二分x。
2025-07-01 20:10:41
297
原创 Codeforces Round 1031 (Div. 2)
不需要关心打牌的过程,只需要知道如果最终答案为x,那么A的前x张牌都答应了,B打出了n-x+1张牌,且最后一张牌打了。我们记前A的x张牌最小值为u,B的前n-x+1张牌最小值为v1,要想A至。当炸完第一次后,其余的金块都能得到,现在要找到第一次爆炸的最小损耗,即一个边长为2*k-1的正方形内最少的金块数量,用二维前缀和。少打赢x张牌,u必须大于v。采用反证法,如果u<v,那么当打到u时无法打出。枚举这个x,判断是否满足。
2025-06-19 20:37:33
205
原创 Educational Codeforces Round 179 (Rated for Div. 2)
以字符串的每个位置为对象来看。处理肯定是从低位到高位,我们从低位开始遍历,遇到a不用管,b我们看能不能到a,如果不能看能不能先到c再到a,c看能不能到a,如果不能看能不能到b,如果可以看还能不能到a。当执行两个操作时,要保证后一个操作存在一个位置再第一个操作之后,位置用set存。
2025-06-05 22:30:53
310
原创 第十五届山东省大学生程序设计竞赛
每个零件到加工完的理想时间是n-w[i]+t[i],当两个零件这个数相同时会出现冲突,必然会出现一个零件往后延,从小到大排序后,一个零件的完成时间就是max(它的理想时间,上一个零件时间+1)在保持树形结构的前提下连边,先把边权为0的连了,接下来连边的数量是总连边数量-可以新加的边的数量,因为新加的边都能保持边权为1。每个状态数的大小不重要,相对位置才重要。我们可以又123456789推出所有状态,记录步数。询问时转化直接查询即可。先将每个人的能力从小到大排序,相等情况下按可承受人的从大到小排序。
2025-06-05 20:01:30
388
原创 第九届河北省大学生程序设计竞赛
满足答案的单调性,使用二分答案。二分不整齐度检验方案数是否超过k,检验的方法为双指针,O(n)。最后总不整齐度就是检验的超过k的最小的不整齐度-1的总不整齐度+剩下方案的数量*超过k的最小的不整齐度。当超过n天时,不管最初虫卵在哪,每天产生的新的虫卵都一样多。那么,我们只算前n天的虫卵,假设最初虫卵位置在x,那么对于点i前n天产生的虫卵数量就是:du[i]*(n-dis(x,i)),拆开后只需让后面那一项最小即可,使用树形DP求解。f[i][j]表示以i为起点构成的递增序列中第i+2^j的点的编号。
2025-06-05 19:42:32
383
原创 Codeforces Round 1027 (Div. 3)
首先让x和y除去他们的的gcd,此时x y互质。x经历除去所有它的约数到1,而y从1乘它所有的约数到y。设f[x]表示x最少除以几个满足题意的数到1。这时一定有f[x]=min(f[x],f[x/y]+1)(y为x的约数且y<=k)。采用记忆化搜索,搜到一直接返回0。
2025-05-28 20:23:38
343
原创 Codeforces Round 1026 (Div. 2)
一个很重要的细节是有向边总是由编号小的指向编号大的,那么我们只需要从1到n访问节点即可保证访问到节点i时所有在它之前的节点都被访问到。设f[i]表示合法情况下该节点最多的电池数,二分答案,检验最大电池数是否可以到n。访问每个非零节点时枚举它的每条出边更新f[n],最后f[n]非零就能到。
2025-05-26 18:48:49
342
原创 Codeforces Round 1024 (Div. 2)
奇偶位置分离开看,a[1~n-3]都可以满足在在奇/偶位置上递增。那么只有a[n-2]和a[n]不一定满足a[n-2]<a[n]。会到每次交换的本质上看,可知每次交换后奇偶位置上逆序对的相对性不变,即一个位置逆序对从奇/偶数减为0,另一个位置若想减为零必须满足和第一个位置逆序对的奇偶性相同。
2025-05-14 20:38:30
156
原创 Codeforces Round 1021 (Div. 2)
如果有某天有四个学生,一定可以。2~3个明天确定,一定可以。2~3个,可以确定后天的。1个且明天的确定,也可以确定后天的。
2025-05-09 21:08:58
247
原创 Educational Codeforces Round 178 (Rated for Div. 2)
n*k预处理出s中第i个字符下一个字符j的位置用f[i][j]表示,如果没有就是n+1。此后的每个t都可以O(lengeh(t))得到t匹配的最后一位的位置。先利用刚刚的f预处理出每个位置的之前k种字母的最近位置,然后利用bfs算出每个位置跳到n+1的最短距离。n个数互质,即n个数都是质数,预处理前4e5个质数,原排列从大到小排序求前缀和,质数求前缀和,从后往前循环第一个前者前缀和能大于等于后者就是留下的i个数。
2025-04-29 22:50:18
228
原创 Codeforces Round 1020 (Div. 3)
一个序列a可以满足序列b时满足b按序找到上一个之后第一个>=它的匹配。f[i]表示从1~i可以匹配到b中1~f[i],g[i]表示i~n可以匹配到b中g[i]~m。我们找到a中的一个i和i+1,f[i]和g[i+1]匹配的重合不用填,差一个填一个。top表示对角线及上侧的0结束的最大0连通块,bot表示对角线下侧结束的最大的0的连通块。很容易发现状态转移。
2025-04-29 09:32:43
279
原创 Neowise Labs Contest 1 (Codeforces Round 1018, Div. 1 + Div. 2)
当同一行中相邻的数相等,我们改变列。同一列中相邻的数相等,我们改变行。行和列是相互隔绝的,我们分开考虑。不妨先考虑同一列的相等。用动规,阶段是行,状态是列。相邻的两个数存在三种情况:相等,相差1 -1。f[i][0/1]表现前i行的最小花费,第i行是否+1。如果不考虑开始亮着的灯,那么每列的亮灯都是偶数个,考虑开始的灯,那么哪一列亮灯是奇数,宝藏就在哪列。如果不考虑开始亮着的灯,那么从左上到右下斜线的亮灯都是偶数个,考虑开始的灯,那么哪一斜线亮灯是奇数,宝藏就在哪列斜线由此推出横坐标。
2025-04-27 18:13:45
210
原创 Codeforces Round 1019 (Div. 2)
一,挨着,即12或23部分,二,不挨着 即13。我们枚举每个数,如果大于等于k记为1,否则记为-1,由此可知一段序列的和如果非负,那么它的中位数大于等于k。从前/后枚举找到当前最小的非负的段,然后如果在之后的枚举中找到段的值不小于这个,那么情况一成立。我们很容易想到设定一个上下界l=0,r=n+1,奇数步的--r,偶数步的++l,这样看似可以,但如果从左往右,最右边有两个数相邻要去除,无法保证最右边的数符合。于是想到以-1为中心,奇数步-1左从左到右减,右从右到左减,偶数步-1左从左到右加,右从右到左加。
2025-04-23 21:51:42
264
2
原创 IAEPC Preliminary Contest (Codeforces Round 999, Div. 1 + Div. 2)
顺着来很复杂,考虑逆向思维。从a中两个数相差为1加和转为为b中一个数/2,+1)/2。因为要求a和b一模一样,所以将两个数组插入set中。如果b中最大的大于a中最大的,那么这个数必须转化,插入b。小于则无解,等于把这两个数删去继续操作。转化n-m次后,如果剩下的一模一样就合法。
2025-04-17 20:06:41
118
原创 Codeforces Round 1017 (Div. 4)
这段程序的意思是给一个序列a,有q个询问,每个询问包含l,r,k。发现最多操作logk次,我们只要算出每次操作的位置,就可以一段一段的算出k的累加值。预处理N范围内所有数的因数,a[i]的范围1e5,我们用一个vector记录a中每个数出现的位置。然后i从l到r遍历,枚举这时的k的所有因数,二分找出这些因数再i~r内出现的最小位置,并找到所有因数最小位置的最小值ri,那么接下来k首先在这个位置进行除操作。如果m%k=0,此时,奇数行还按上面的方法填,偶数行,按2 3 ... k 1这样填。
2025-04-16 22:09:06
236
原创 Codeforces Round 990 (Div. 2)
首先可以确定新序列单调不递减。在操作中,a[i]如果存在j>i&&a[j]<a[i],那么a[i]一定会向后移动。我们从1~n依次往一个栈中加数,使这个栈单调,而被踢出的数则+1,等待新的加入。踢出的数我们随意加入可能会导致这些数多次加入,如果从小到大加入就能保证每个数最多加入一次,因为其他踢出的数肯定比这个数大。这样保证每个数最多加入两次,进入队列一次。
2025-04-14 19:13:52
193
原创 Codeforces Round 1016 (Div. 3)
第一个询问我们用dfs传此时我们确定的这个数所在行列的范围,和这个范围中的最大值,通过比对目标格数的行列和目前搜索范围的行列关系锁定田字格的方位,下一步搜索,直到范围为1。第二个询问同理,通过比对这个值和最大值的关系锁定在田字格的方位。二分通过k次分组使得每个组都能出现至少一次0~mid。上下界为0和n-1,判定时不需要map,因为需要判定的数的大小仅考虑在mid以内即可。由于给出了所有字符的长度小于2e5,那么直接暴力判断是否可行,再找到最大的匹配数的神经网络的匹配数t,答案就是n+2*(n-t)
2025-04-10 20:58:42
321
原创 Codeforces Round 1009 (Div. 3)
我们很容易想到f[l][r]代表顺时针l到r间的点的最大得分,再加上枚举顺时针l到r间的三个点,时间复杂度来到了n的五次方,显然还得优化。其实枚举l和r左右端点时可以等价于枚举那个三角形的两个点,在转移过程中找最大值。在一个由1x1组成的矩形,将小正方形合并为大正方形,小正方形的四条边所在的坐标必须是二的整数次幂,问最少剩下多少个正方形。我们可以枚举正方形的边长,从小到大枚举,并判断横纵做多放下几个,因为合并的正方形的原料一定是上一级合并成的大正方形,那么减少的正方形数量就是新和成的正方形数量*3。
2025-04-10 11:40:27
264
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅