思维题
文章平均质量分 66
sophilex
kidlut
展开
-
奇怪的数位dp CF908G New Year and Original Order
然后我们看一下每一行的1的个数,其实也不难发现,第i行的1的个数=大于等于i的数字的个数,手模一下就可以验证了。所以在第d行,计数字x中>=d的数字的个数为k,则x在第d行的贡献就是(10^k-1)/9(其实就是在构造k个1)在此基础上,我们分9次来计算每一行的贡献。首先这种题目是存在一定套路的,但是没见过基本是想不出来的(估计也是其rating高的原因)所以此题的关键就是用1来组成数字,剩余的工作就都是很基础的了。求区间[L,R]内每一个数字在各数位排序后得到的数的和,答案对1e9+7取模。原创 2023-06-25 20:43:55 · 98 阅读 · 0 评论 -
逆天思维题 CF741C
我们会发现,每一个点都被两种边连接,一个来自它的伴侣,一个来自它的其中一个相邻点,所以最后如果有环的话,一定是两种边交替出现的,所以不可能有奇环(一个特殊情况是情侣相邻坐,但不难发现此时也不是奇环)。有2n个人围成一圈坐在桌子边上,每个人占据一个位子,对应这2n个人是n对情侣,要求情侣不能吃同一种食物,并且桌子上相邻的三个人的食物必须有两个人是不同的,只有两种食物(1或者是2),问一种可行分配方式。因为只有两种颜色,所以是要我们构造一张二分图,其中情侣之间要连边,关键就是如何处理任意三个点之间的关系。原创 2023-04-06 21:40:29 · 306 阅读 · 0 评论 -
树上启发式合并+点分治思想 CF741D
再加上字母数不是很多,我们直接按位状压,某一位为1就代表改字母出现了奇数次(特意强调只有22个字母,摆明了就是要状压),那么,如果点对u,v之间的路径的异或和等于0或者是2的幂次,这条路径重排之后就是一个回文串了。显然,如果u,v之间的路径满足条件的话,我们同样可以O(1)的得到路径长度=dep[u]+dep[v]-2*dep[lca]其实就是第一种情况,只不过过的根是u的子孙节点,我们只要在dfs的时候让父节点的答案更新一下就可以了。的话,会发现这种树上点对异或的东西还是比较套路的。原创 2023-04-06 21:04:31 · 377 阅读 · 0 评论 -
另类推柿子 Crypto Lights
不难发现,si表示在第i次,第i+1次,...第n次结束的概率之和,这其实也就等于第i-1次无法结束的概率(这个应该不难想)n-(i-1)-(k-1)(i-2)个小球,这些相同的小球要放进i个位置里,可以有位置为空,所以直接隔板法即可。中间的i-2个位置每一个至少要有k-1个小球,所以我们先放进去(k-1)*(i-2)个小球,还剩下。不妨先将i-1个小球摆好,这样整个集合被分成了i个位置,我们还有n-(i-1)个小球可以放进去。现在有n个小球,要求选择i-1个小球,两两之间有至少k-1个小球。原创 2023-04-02 13:32:56 · 303 阅读 · 0 评论 -
妙妙子树上好题 XOR, Tree, and Queries
每一个连通块内,我们从任意一个起点出发(不妨假设它的pi值为0,这当然是合理的,因为想要修改它为x的话,我们只要让连通块内的点的p值都异或上x就可以了),可以推出其余点的p值,然后,如果里面有环,并且发现某一个点从不同路径走有不同值时,意味着该情况无解,这题就结束了。如果某一个连通块的大小是偶数,意味着我们要修改的值x会异或上偶数次,相当于没有操作。所以,看起来是一道很伤脑筋的构造题,其实最后的结果只有三种情况:无解,0,一个常值。所以我们把所有度数为1的节点找出来,它们的异或和,就是我们的答案。原创 2023-03-16 11:33:42 · 577 阅读 · 0 评论 -
Codeforces Round 857 (Div. 2) 题解
我们就需要维护从1走到n的过程中的卖艺收入最多的点,中间更新的时候就直接拿该点的权值除一下就好了。枚举到第i个位置的时候,对于第i个数组的每一个元素j,我们看一下前面i-1个数组丢弃掉一些之后,在最大值不大于j的情况下,最大贡献是多少,然后我们再加上j到该数组结束能产生的贡献,就可以更新到第i个数组位置的最大值了。然后我们枚举放在第一堆的最大值,枚举到第i个物品的话,假设当前第一堆的最大值是ai,i+1~n的位置都只能选第二个价值,1~i-1的位置就可以选第一个价值,也可以选第二个价值。原创 2023-03-15 17:49:03 · 878 阅读 · 0 评论 -
Codeforces Round 843 (Div. 2) VP题解
如果当前的数字a大于0,我们至少要a次--操作,那么我们就留给了后面的第一个数字a次++操作,同时也会消耗掉之前的数字留给我们的a次--操作。那么在这个过程中,如果需要的次数不够了,我们就直接加,因为这就是我们不得不额外做的操作。对于一个正数来说,如果某一次操作能让他--,我们肯定会做,如果是让他++,我们肯定不会做,这是显然的,因为这里不会有比直接减更好的策略,毕竟我们每次操作改变的值是固定的。如果没有,就可以构造。选出一个子序列,将奇数位 +1,偶数位 −1,或将奇数位 −1,偶数位 +1。原创 2023-03-08 16:37:20 · 538 阅读 · 0 评论 -
Educational Codeforces Round 143 (Rated for Div. 2) 题解
如果能向上走的话(父亲没有需要走的步数),就是将父亲的所需步数更新为该点所需步数-1.注意,一个父亲只能让一个儿子踩一遍,第二个儿子再过来就不能走了。hj原创 2023-02-21 21:34:24 · 575 阅读 · 0 评论 -
cf851 E. Sum Over Zero
仔细观察一下,在更新的时候,其实i是固定的,变的是dp[j]-j,所以我们可以想办法找到i之前的前缀和比当前小的点的前缀最大值。那么就可以令si从小到大作为id,来维护一个前缀最大的树状数组,因为我们是按1-n的顺序更新的,所以查询的时候树状数组里的最大值就是刚好满足条件的最大值。注意一点,一开始我们的树状数组肯定初始化为-inf,但是对于一个前缀和>0的点来说,它前面没有可以更新的前缀最大值,但是它可以直接从开始算一个。可以选,dp[i]=max{dp[j]+i-j},1原创 2023-02-13 21:24:33 · 456 阅读 · 0 评论 -
ABC 289 G - Shopping in AtCoder store 数学推导+凸包
我们将ci表示成x,那么原本要求的值 max{j*(bj+ci)}(1原创 2023-02-13 19:01:00 · 971 阅读 · 5 评论 -
AtCoder Beginner Contest 289 题解
更进一步,在不改变横坐标的情况下,如果连续两次选择的点的纵坐标相差=1,那么最后的实际效果是纵坐标变化=2,这是改变的最小差值。一张简单图,每一个点有一个颜色(1或0),两个点从分别从1和n出发,同时走下一步,且两者下一步的颜色必须不同,问能否实现分别到达n和1.如果可以,求最小步数。因为如果我们只改变纵坐标的话,第一次选(a,c),第二次选(a,c+1),可以发现横坐标会回到原位。规则如下,每次在一个选定区域内选择一个坐标均为整数的点C,移动到关于点C对称的点。初始状态是(1,n),最终状态是(n,1)原创 2023-02-12 11:01:29 · 1076 阅读 · 0 评论 -
AtCoder Beginner Contest 288 题解
按照一开始讲的思路,从i=l~r-k+1,以i为左端点执行一次使其值为0的操作,那么这样之后除了最后k个元素,其余元素都为0,考虑到条件为所有sum[i]都相等,一番操作之后最后k的元素也必然相等,再执行一次操作就可以了。从第二步转移到第三步的时候,我们发现,当j=i-1时,j+1>i-1,X[j+1:i-1]是非法的,所以我们直接略去这种情况,那么此时第二步展开的前半部分就等于10*dp[i-1]了,那么我们就可以O(1)转移了。对于一个遍历到的物品,我们的选择是买或者不买,以及要买的话,什么时候买。原创 2023-02-08 16:20:15 · 686 阅读 · 0 评论 -
Codeforces Global Round 14 E Phoenix and Computers
看完上面之后,我其实是存疑的。为什么第一种情况可以认定每一个连通块都有左右两个位置可以放?为什么该情况下插入一格不会导致两个连通块的合并?因为如果两个连通块之间间隔为2的话,放入一个会导致合并,但第一种情况并没有与第三种情况进行去重。以及第二种情况,为什么随便找一个空插进去不会导致连通块合并而一定导致产生新的连通块?这里给出我自己的解释:我之所以会产生这样的疑问,是因为我默认这n台电脑的位置是固定的,它们就摆在那里了,第一台就是第一台,它左边一定没有别的电脑了。这很合理。但是该方法其实是假设有无数台电脑原创 2023-01-04 10:46:01 · 313 阅读 · 0 评论 -
Cf Round #838 D. GCD Queries 有趣交互题
所以我们可以转换一下思路,看看有哪些位置一定不是0,这样的话就也就不用费心0的具体位置了。考虑三个数a,b,c,我们询问x=gcd(a,c),y=gcd(b,c),如果b是0,则y=c,而x=gcd(a,c)原创 2022-12-19 00:21:18 · 179 阅读 · 0 评论 -
AtCoder Beginner Contest 280 老年人复建赛
这里,如果A到B有两条路径,且一条的权值为a,另一条的权值为b的话,如果a!=b,那么会发生什么?这就意味着a-b不为0,所以这两条路径产生的环,从某一个方向走的话,总权值就是正的了,那么我们就可以一直走来刷分,那么结果就是inf,考虑到连通块上的其他点也能从环上任意一点到达,所以这整个连通块上的点的答案就都是inf了。如此我们得到一个结论:从A到B的答案不为inf当且仅当A到B的所有路径的总权值都是相等的,这就是说这里不存在dis更新的问题,因为能更新就意味着inf,这个我们可以在最后直接判掉。这原创 2022-12-04 09:53:43 · 536 阅读 · 0 评论 -
trie树+思维 Xor-MST
既然如此,那么任意两个数字之间的异或值就是它们到根节点路径上的对应节点的异或值的累加,那么我们就不难发现,trie树上两个叶子节点的lca深度越深,它们的异或结果也就越小。我的一开始的思路其实是ok的,就是trie,毕竟关于异或的题,很多都可以跟trie扯上关系。另外,如果我们将数字按顺序插入trie树中,那么每一个节点对应的范围也就是原序列里一段连续的区间了,那么我们就可以很轻松地每次去查找两个子树合并的最小代价了,只要遍历左子树对应的数字,然后在右子树里找到它的最小异或值就好了。当然反一下也是可以的。原创 2022-11-14 16:21:15 · 254 阅读 · 0 评论 -
AtCoder Beginner Contest 272
又因为数字个数多于n/2,也就是一定存在i,a[i]和a[i+1]都对m同余,那么我们就可以O(n)暴力枚举可以用的因子了,而且这里只用枚举质因子,这样最多只会有9个(2*3*5*...*23就爆ll了)。对于每一个i,第k次操作,只有当0原创 2022-10-09 16:02:09 · 324 阅读 · 0 评论 -
2021年巴西icpc重现赛补题
所以首先用树上倍增找到初始点到根的路径上的满足权值要求的深度最浅的点RT,那么不难发现能被加入该集合的所有点一定都在RT的子树内,否则,其与RT的lca就会是一个深度更浅的点,但RT已经是能找到的深度最浅的点了,所以矛盾。稍微转化以下题意,不难发现,对于每一个区间以及其初始点,我们其实就是要找一个包含该初始点的连通块,其中连通块内的每一个点的权值都在该区间内,然后里面的每一个点的答案就可以+1了。首先连通块内的点的权值都是满足条件的,并且它们与初始点的路径上的每一个点都被加入了集合,所以A原创 2022-10-08 21:20:23 · 375 阅读 · 0 评论 -
一道有意思的题 洛谷P2647 最大收益
但是,但是,再深入地想一下,其实选择顺序只会影响减少的收益ri,而wi并不会受影响,所以我们的选择顺序实际上是要满足Σri*(j-1)最小,而转移时j-1一定是升序的。因为说了n件里面可以选任意数量个,所以我们可以设dpi,j表示前i件里面选j件,这个是显然的,然后最后n个里面取max就可以了。但其实这样的话还并不是很合理,因为物品的选择顺序很明显会影响最后的答案,但是我们的转移方程其实意味着我们的枚举顺序就决定了物品的选择顺序,只不过是倒序的而已,但仍然是不合理的。如此的话,其实dp方程就列出来了,原创 2022-10-01 18:42:42 · 534 阅读 · 0 评论 -
奇思妙想构造题 ARC145 D - Non Arithmetic Progression Set
不妨想一想,一个合法数a的两倍在三进制表示下肯定只有0/2,那么如果它是等差数列的中间项的话,就意味着另外两个合法数b,c的所有三进制下含1的位置都是重合的,这样才能刚好凑出2,并且这些2的位置也要与2*a的位置重合,稍加思索,不难发现,在这样的前提下,我们还发现,对序列的所有元素同时加上/减去相同的值,对序列的“无等差数列”性质并没有影响(废话,那么要让sum变成m,我们只要保证abs(sum-m)%n=0即可,这样就可以把差值均分到每一个元素的头上。三个合法数能够组成等差数列,当且仅当a=b=c。...原创 2022-07-31 12:29:16 · 303 阅读 · 0 评论 -
牛客多校1 C Grab the Seat!
首先,对于每一个有人的位置,它能覆盖的区域就是它与讲台两点的连线对应的在他背后的区域(红色斜线部分),对于每一个点都做出这样一个区域之后,我们就得到了一个完整的覆盖区域,我们的目标自然就是描绘出它的边缘(图中黑线),那么每一行黑线之前的点(图中绿点)就是ok的部分。仔细观察的话不难发现,如果我们只考虑斜向上的斜线的话,从下到上它们的斜率是依次增大的,而对于每一行,一个斜率大的斜线肯定会覆盖斜率小的斜线,所以我们只需要动态维护从(0,1)点出发的最大斜率即可,每次更新最值。别的也没了,这题也并不是很难~...原创 2022-07-19 13:24:07 · 164 阅读 · 0 评论 -
四边形不等式优化区间dp
四边形不等式是一个很强有力的武器,往往可以在原本dp推导式中优化掉一个n的时间复杂度区间dp里,假如dp[i,j]和cost函数满足四边形不等式的话:dp[i][j]+dp[i+1][j+1]原创 2022-07-14 10:02:12 · 394 阅读 · 0 评论 -
[COCI2015-2016] VUDU
COCI大意:给定一个序列和一个值,求区间平均值不小于该值的区间个数思路:可以先考虑前缀和一个区间满足条件当且仅当即左右形式一样,所以写一个树状数组就可以啦但是数字范围有点大,所以还得做个离散化...原创 2022-07-12 20:15:41 · 109 阅读 · 0 评论 -
[COCI2012-2013] POPUST
COCI大意:问能否确定1-n的一个排列满足所有条件思路:按题意确定每一个点和每一个位置对应的范围大小,如果能够找到一个满足条件的排列,也就意味着点与位置的约束不会互相矛盾,且能够一一匹配,所以跑一个匈牙利就可以了。(其实赛时也有想过这个,但是经验太少,还是不知道怎么建图。。。)确定numr,numl数组,表示每一个数字能放置的最远和最近的区间再确定qr,ql数组,表示每一个位置能放的最大的数和最小的数 然后按关系建边即可...原创 2022-07-12 19:44:13 · 167 阅读 · 0 评论 -
神奇快速幂
思路;纯模拟肯定是送,有很多人都是打表找规律,找循环节然后过去的。在网上看到一个秀翻我的思路:把一次传染过程看作乘法操作,操作对象为标记数组,那么经历了k次操作,也就是乘了k次,这就是一个变形的快速幂那么只要按照快速幂敲一下就好了整体复杂度大概是m^2*log(k),4e7的水平,理论上是能过的but,时间还是卡的很死的(可能常数有点大),必须得把所有杂七杂八的优化全部加上去:快读,register,inline。。。优化到极致了,才能过。。。(亲身体会)虽然但是,这个思路确实是我第一次见,很优秀...原创 2022-07-06 20:07:02 · 108 阅读 · 0 评论 -
abc229 总结(区间最长连续字符 图的联通分量计数)
D - Longest X 前缀和+双指针大意:一个字符串由"X"和"."组成,给定n次操作机会,每一次可以将一个"."变成"X".求最长连续的"X"的个数思路:前缀和统计"."的个数,然后双指针跑一下,在操作次数大于等于区间内的"."的个数的情况下尽可能更新区间长度,然后取最值就可以了。G - Longest YG跟D是很像的两个题,所以我想先讲G大意:同样也是一个字符串,问题跟D也一样,但是G题的操作变成了只能交换相邻两个位置的字符,这是两题唯一的区别。思路:官方题解的思路很巧妙:如果s[i]原创 2022-07-03 21:08:38 · 496 阅读 · 0 评论 -
AtCoder Beginner Contest 237 VP补题
E大意:给定一张无向图,两点间的边权:较高点到较低点的边权等于高度差较低点到较高点的边权等于高度差的负二倍求:图中的最大dis值思路:按题意建边即可;但是有负权,所以一般的dij不行。赛后又加强过数据,所以我跑了spfa,T烂了。。。(但是我看有一个哥们还真用spfa冲过去了。。。【崩溃】)官方题解的思路是dij考虑“势”的思想(绝):对数据进行预处理,高点到低点的边权等于0,低点到高点的距离等于高度差(>=0)那么就全是非负权边了。跑完dij后只要把数据还原回去就可以了,dis[i]=h[i]-h[1原创 2022-07-02 10:26:28 · 152 阅读 · 0 评论 -
Codeforces Round #803 (Div. 2) VP补题
D. Fixed Point Guessing大意:有一个1-n的升序排序,从中选n-1/2对不相交的数字进行交换,会有一个数字是没有动的。操作过后会得到一个最终序列。交互问题。每次询问l,r,返回最终序列的l到r元素的升序排列15个问题内找到没有改变位置的元素思路:做倒是做出来了,只是过程有点艰辛。。。(又是读不懂题的一天n的范围有1e4那么大,但是只能问15个问题,差不多就是1/log的级别,那么自然就可以想到二分.每次处理一个区间的话,就可以将区间分成两个部分,不妨先查左半部分,如果左半部分没问题,原创 2022-06-30 13:19:33 · 180 阅读 · 2 评论 -
AtCoder Beginner Contest 252(dijkstra,逆向思维)
E - Road Reduction大意:给定一张简单无向图。求任意一颗生成树,使得从点1到其他所有点的距离之和最小思路:在生成树中,1到任意点的距离肯定大于等于原图中1到该点的距离。所以,如果两个距离相等,那就是最优解。换句话说,对于每一个点,找到能使他到1点距离最小的边都应该是保留的。如果再仔细想一想,就会发现在这一条路径上的所有点,它们对应的也应该是原图中的最短路径。那么就很简单了,跑一遍dijkstra,对每一个点的dis值被更新时,记录对应的边的id,最后遍历输出即可。因为每一个点被更新时对应原创 2022-06-20 15:36:41 · 345 阅读 · 0 评论 -
AtCoder Regular Contest 142
A题不用说,C题之后不会。。。B - Unbalanced Squares大意:构造一个n阶矩阵(元素从1~n^2),对于矩阵中的每一个元素,它周围的元素中大于它的数目和小于它的数目不能相等。思路:想了二十多分钟才有的思路。。。脑子是越来越不行了。我的思路:如果直接按从小到大的顺序做矩阵的话:1 2 3 45 6 7 89 10 11 1213 14 15 16很明显是不行的。但是仔细观察一下,如果对每一行的元素改变一下顺序的话,可能是有希望的(总比全部重新构造好)。第一行和最后一行的每一个元素都是满足条原创 2022-06-20 12:49:13 · 348 阅读 · 0 评论 -
CF130 C. awoo‘s Favorite Problem
一开始想到贪心去了,结果果然连样例都过不去。。。结果卡了有二十多分钟(菜)思路还是比较有意思的,观察一下两次操作,都是以b作为一个支点,操作1将a向后推,操作2将c向前推,并且我们可以发现,这两种操作并不会改变字符串中a和c的前后关系。那么不妨就只考虑a和c把两个字符串中的a和c都单独拉出来,要保证对应的两个新的字符串相等。然后比较一下两个字符串每一位在原字符串的位置的大小关系即可。...原创 2022-06-13 13:38:44 · 507 阅读 · 0 评论