
题解
文章平均质量分 80
瞎写的一些题解...
CCloth
这个作者很懒,什么都没留下…
展开
-
[思维][打表]Money Game 2022年ICPC杭州站D
首先可以打一个表来找找规律,通过打表可以发现在若干轮迭代后,最终整个数组都趋于稳定,每个数字都不再变化,并且满足a[1] = 2*a[2] = 2*a[3] = ...... = 2*a[n]这个规律,同时操作不会改变数组加和,设sum为数组元素加和,最终就是a[1] = sum/(n+1)*2,a[2] = a[3] = ...... = a[n] = sum/(n+1)。原创 2023-01-11 21:06:42 · 1164 阅读 · 0 评论 -
[trie树]Master of Both 2022年ICPC杭州站K
两字符串比较大小需要看第一个不同的字符,对于任意两字符串可以找到它们第一个不同的字符,设它们为x和y,那么可以用一个二维数组记录一下,令rel[x][y]++,这里的rel[i][j]就表示由i和j大小决定的字符串的对数,如果在某个询问中i的字典序大于j的字典序,因为在记录的时候又是按照i所在字符串出现在j所在字符串之前,那么逆序对个数就可以加上rel[i][j],最终扫描一遍rel数组就能够得到答案。给出n个字符串,以及q次询问,每次询问给出一个字母之间的大小顺序,问在该顺序下这n个字符串的逆序对个数。原创 2023-01-11 20:55:58 · 1239 阅读 · 1 评论 -
[并查集]Number of Groups Codeforces1691E
现在考虑两种不同的颜色,同样是将所有线段2n个点进行排序,然后扫描这些点,遇到右端点就将对应线段删除,遇到左端点就将对应线段加入集合,同时看一下集合中不同颜色的线段,让当前这条线段和不同颜色的所有线段进行连边,不过只保留右端点最长的那条线段,其余线段全部移除,因为多余的线段都被移除了,所以复杂度还是O(n)的,不会进行太多次连边。给出若干个红色或蓝色的线段,每条线段都有一个左端点和右端点,若两线段存在交集且颜色不用,则这两线段属于同一集合,问最终有多少个不同集合。原创 2023-01-11 11:49:40 · 597 阅读 · 0 评论 -
[二分图][拓扑排序]Cars Codeforces1635E
对于二分图上的一条双向边(u, v),如果u车的方向向左且u和v是背道而驰,那么v车肯定在u车左边,也就是v车坐标大于u车,我们用单向边u->v表示v坐标大于u的关系,同样还有u车的方向向左且u和v是相向而行、u车的方向向右且u和v是背道而驰、u车的方向向右且u和v是相向而行这一共四种情况。在一个数轴上有n辆汽车,它们的方向只能是左和右,现在给出m个前提,每个前提有两种类型,要么是x车和y车相向而行,要么是x车和y车背道而驰,问在这m个前提下如何分配每辆车的方向和在数轴上的坐标。原创 2023-01-06 22:11:02 · 523 阅读 · 0 评论 -
[dp][二进制]Infinite Set Codeforces1635D
接下来考虑一个确定的数字x能扩展出多少小于2^p的数字,这个问题其实和一道经典dp题目一样,一个人上楼梯,一次要么上一阶要么上两阶,问最终上到n阶的不同方案数,因为两种扩展区别就在于一个是添加1个数,另一个是添加2个数,所以就和上楼梯的做法一样了。有n个数字构成一个集合,对于集合中的每个数字都可以进行扩展,比如数字x可以扩展出2*x+1和4*x,被扩展出的数字仍然可以被扩展,问这个集合内小于2^p的数字有多少个。原创 2023-01-06 12:49:45 · 504 阅读 · 0 评论 -
[单调栈][st表]Max GEQ Sum Codeforces1691D
找到区间了就该判断这些区间是否满足题意了,在单调栈找到的范围内最大值不变,永远都是a[i],所以可以求一下区间和的最大值,因为区间和能够用前缀和差值来表示,区间和最大也就是最大的前缀和减最小的前缀和,不过这个区间和必须包含i这个位置,所以最大的前缀和要在[i, r[i]-1]中找,最小的前缀和要在[l[i], i-1]中找,因为是不带修改的区间最值查询,直接用st表会更方便。最后要注意用st表的时候f[0]也要进行更新,因为下面在求最小值的时候用到了f[0]的信息。原创 2023-01-03 21:36:36 · 403 阅读 · 0 评论 -
[dp][图论]Node Pairs Codeforces1763E
其实知道了p可达图最少点数就知道了最多的单向连通数了,因为(u, v)之间的关系就三种,要么是双向连通,要么是单向连通,要么是不连通,而(u, v)的总数一共是n*(n-1)/2个,现在已知其中有p个是双向连通,那么单向连通+不连通个数就是n*(n-1)/2-p个,由于要单向连通数尽量多,那么自然就是n*(n-1)/2-p个了。其中p可达即为u < v且从u能到v从v也能到u的(u, v)个数,单向连通即u < v且从u能到v或v能到u的(u, v)个数。原创 2023-01-02 17:15:37 · 220 阅读 · 0 评论 -
[区间dp]Valid Bitonic Permutations Codeforces1763D
加上这两个数的限制其实就是考虑一下n-len+1恰好等于vx或者vy的时候,假设n-len+1恰好等于vx,那么如果x等于i,此时vx只能放在i这个位置了,dp[i][j] = dp[i+1][j],若x等于j,则dp[i][j] = dp[i][j-1],如果x既不等于i也不等于j就说明不存在合法方案,直接dp[i][j] = 0。需要构造一个长度为n的排列,要求这个排列必须先增后减,且a[x] = vx, a[y] = vy,问这样的排列有多少个。原创 2023-01-02 15:25:33 · 192 阅读 · 0 评论 -
[好题][图论][思维]Tick, Tock Codeforces1758E
不妨设最终矩阵上的值全为0,那么任意具有边权k的边(u, v)就需要(val[u]+val[v]+k)%h == 0,在这个限制下只要确定连通块上的某一点的点权那整个连通块点权都确定了。接下来考虑还没加进来的-1边,可以知道这些-1边最终会让这些连通块完全连通,并且若有一条-1边连接(u, v),且u和v分别属于两不同连通块,那么这条-1边的边权可以任取[0, h)中的每一个值,这是因为u和v的点权可以任取[0, +∞)中的任何值,所以边权总能凑出来这h种可能。原创 2023-01-01 18:08:32 · 522 阅读 · 0 评论 -
[笛卡尔树][树形dp]Yet Another Array Counting Problem Codeforces1748E
设dp[i][j]表示i结点值取j时子树中的方案数,设l[i]表示i结点左儿子,r[i]表示i结点右儿子,若两儿子均存在,那么dp[i][j] = sum(dp[l[i]][j-1]*dp[r[i]][j]), i∈[1, m],若只有左儿子存在,那么dp[i][j] = sum(dp[l[i]][j-1]), i∈[1, m],若只有右儿子存在,那么dp[i][j] = sum(dp[r[i]][j]), i∈[1, m],若是叶子结点,那么dp[i][j]均等于1。原创 2022-12-31 23:51:27 · 869 阅读 · 0 评论 -
[思维]Zero-Sum Prefixes Codeforces1748C
不过这里还需要特别注意,如果0出现次数是最多的,那么其实l处的零不需要考虑这一段了,那它就可以考虑前面了,所以此时结果要+1。最后别忘了从下标1到第一个零出现的位置,这段区间还没有统计答案呢,最后加上这段答案就可以了。给出一个长度为n的数组,其中某些位置可能为0,你可以进行若干次操作,每次操作选择一个a[i] = 0的位置,然后将a[i]修改为任意值,最后要求数组a的前缀和数组s包含尽量多的0。原创 2022-12-31 22:52:30 · 378 阅读 · 0 评论 -
[构造]ConstructOR Codeforces1748D
先考虑下什么时候无解,设d的二进制表示下最后一个1的位置是d1,a的二进制表示下最后一个1的位置是a1,b的二进制表示下最后一个1的位置是b1,如果a1 < d1或者b1 < d1那就无解,这是因为d的倍数的最后一个1的位置一定不会小于d1,假设d乘倍数k以后,将k拆成二进制表示,然后再和d相乘,其实可以看出d*k这个结果和d进行若干次左移操作然后加和是一样的,所以d*k的最后一个1的位置不会小于d1。因为每次都加的是d*某个2的幂次,所以最终x一定是d的倍数,并且还能覆盖上c的每一个1。原创 2022-12-31 19:15:09 · 852 阅读 · 0 评论 -
[构造]Range = √Sum Codeforces1758D
首先先考虑n为偶数情况下,可以发现这时候取[n/2, n)和(n, 3*n/2]区间内的n个数字,正好可以凑成一个符合题意的数组。对于n为奇数的情况,可以先按照偶数情况进行构造,比如对于n = 5时,先按照n = 6进行构造,得到3 4 5 7 8 9,然后其中一定会存在一个n-1,将这个n-1删掉,此时还剩下n-1个数字,让这n-1个数字都加1,保证数组加和不变,这时候就构造出来一个符合题意的数组了。给出一个整数n,要求构造一个长度为n的数组,并且这个数组中的最大值-最小值等于整个数组加和的开根号。原创 2022-12-31 11:59:30 · 542 阅读 · 0 评论 -
[记忆化搜索]Hossam and (sub-)palindromic tree Codeforces1771D
现在把这个状态转移拿到树上,设dp[i][j]表示从第i个字符到第j个字符路径上的最长回文子序列,若lca(i, j)既不是i也不是j,这时候比较简单,和线性下的一样,dp[i][j] = d[fa[i]][fa[j]]+(s[i]==s[j])*2,dp[i][j] = max(max(dp[fa[i]][j], dp[i][fa[j]]), dp[i][j]),若lca等于i或者j中的某一个,那么需要先倍增找到lca下的那个点,然后更新过程就和刚才一样了。有n个字符构成一棵树,求树上的最长回文子序列。原创 2022-12-30 23:53:34 · 823 阅读 · 0 评论 -
[构造]Another Array Problem Codeforces1763C
n等于2时,其实就两种情况,要么不操作,要么操作,答案就是max(a[1]+a[2], 2*abs(a[1]-a[2]))。n等于3的时候麻烦一些,但也就三种情况,要么不操作,要么让两侧元素复制为三份,要么让abs(a[1]-a[2])或abs(a[3]-a[2])复制为三份。有一个数组a,你可以进行若干次操作,每次操作选择其中两数字ai和aj,令ai~aj全部变成abs(ai-aj),问最终整个数组加和的最大值。原创 2022-12-30 22:29:38 · 220 阅读 · 0 评论 -
[贪心][dp]Graph Cost Codeforces1731E
每次操作的代价永远比连边条数多1,所以要想代价最少,那么操作次数应该最少。一开始的时候也不会求这个值,后来参考了题解,其实这样的点对数就是1~n/x中互质的数字对数。而1~n中互质的数字对数可以用dp来求得,设dp[i]为1~i中互质的数字对数,那么显然dp[i] = dp[i-1]+phi[i],phi[i]时i的欧拉函数。于是就能求出权值为k时连k-1条边的操作次数了,也就是dp[k]/(k-1)。每次操作可以连k条边,边权和代价都为k+1,同时若u和v进行连边,必须满足边权 = gcd(u, v)。原创 2022-12-30 12:19:51 · 1060 阅读 · 1 评论 -
[容斥][数论]Count GCD Codeforces1750D
根据题意可以得到gcd(gcd(b[1], b[2], ..., b[i-1]), b[i]) = a[i],也就是gcd(a[i-1], b[i]) = a[i],那么a[i-1]%a[i]必须为0,否则无解。给出一个长度为n的数组a,要求构造出一个长度也为n的数组b,满足a[i] = b中前i个数的最大公约数且b[i]小于等于m,问不同的方案数。原创 2022-11-10 23:49:22 · 333 阅读 · 0 评论 -
[构造]Complementary XOR Codeforces1750C
操作偶数次不改变ab串的相同相反性,操作奇数次才会改变。再模拟一下发现,对于ab串相对应的n个位置单独来看,如果a[i]和b[i]开始前是相同的,那么一次操作后a[i]和b[i]变成相反的,如果a[i]和b[i]开始前是相反的,那么一次操作后a[i]和b[i]变成相同的。有两个长度相同的01串ab,每次操作选定一个区间[L, R],对a串中[L, R]内的数字反转,对b串中[1, L-1]和[R+1, n]内的数字反转,问最后能否在n+5次操作内把两串转为全0,如果可以给出操作序列。原创 2022-11-10 18:16:01 · 661 阅读 · 0 评论 -
[树形dp]Hanging Hearts Codeforces1740E
设dp[i][0]表示不选i点时在其子树中能构成的最长子序列长度,dp[i][1]表示选i点时在其子树中能构成的最长子序列长度,可以发现,i点一定是其子树中最小的点,当选中i点后,要想非递减子序列最长,那么前面选的值必须和i点值相同,于是可以将那个最小值放在最长链的叶子结点上,这样整条链都是那个最小值了,所以dp[i][1] = i点的深度。原创 2022-11-09 10:28:19 · 301 阅读 · 0 评论 -
[思维]Knowledge Cards Codeforces1740D
首先最后顺序是降序,所以要先把最下面的数字也就是最大的数字x移动到(n, m),这就需要在(1, 1)位置上的在x上面的数字先移动到棋盘上的其他位置,如果此时棋盘上没有空位容纳其它数字了那就说明误解,而x上面有多少个有效数字可以用树状数组维护出来,就是它上面数字个数减去已经移到终点的数字个数,设这个值为num,那么num应该小于等于棋盘上的空位数,棋盘上能放其他数字的空位数应该是n*m-4,减去的四个点分别是起点、终点、从起点出来的落脚点、用于不断移动的空位。原创 2022-11-09 09:39:34 · 278 阅读 · 0 评论 -
[思维]Yet Another Problem Codeforces1747D
对同一个奇数长度区间无论进行多少次操作,其异或和都不会改变,所以如果询问的区间长度为奇数,那其实很好判断,但如果询问的区间长度为偶数,可以想到应该是将其分为两奇数长度区间,然后分别进行操作使其为0,所以现在问题就是对于偶数区间找一个断点,然后判断断点两侧是否异或起来都为0。有一个长度为n的数组,m次询问,每次询问给出一个l和r,现在你可以进行一种操作,取一个奇数长度区间,然后让其每个元素变成区间异或和,问通过这种操作将区间所有数清0的最小操作次数。原创 2022-11-08 20:06:47 · 380 阅读 · 0 评论 -
[博弈]Swap Game Codeforces1747C
模拟一下游戏过程可以发现,谁先把a[1]减到0谁输,那么双方肯定会尽量挑选一个最小的数放在a[1],这样对方才更有机会减到0。也就是说选数的最优策略是非常机械的,每次都选a[2]~a[n]中的最小值就行了。那么设x为a[2]~a[n]中的最小值,如果a[1]小于等于x,则Bob获胜,否则Alice获胜。Alice和Bob轮流对数组a进行操作,Alice先手,每次操作先对a[1]减1,然后选择a[2]~a[n]中的一个位置i,将a[1]和a[i]进行交换。原创 2022-11-08 11:35:52 · 467 阅读 · 0 评论 -
[扩展欧几里得]Draw a triangle 2022年CCPC桂林站E
给出两点坐标,需要输出第三个点坐标,使这三个点构成一个面积最小的三角形,要求点坐标必须为整数。原创 2022-11-05 19:14:26 · 649 阅读 · 0 评论 -
[找规律]Array Concatenation 2022年CCPC桂林站C
再进一步分析可以发现无论第几次翻转最终答案都不变,这是因为把两个第一次翻转位置不同的最终数组摆到一起,剔除相同位置的相同数值,剩下的一定是2*t个位置,且其中t个位置升序,t个位置逆序,这样两数组最终贡献上的差值就抵消了,所以最终答案就两种情况,一种是不进行翻转操作,一种是最后一次才进行翻转。有一个长度为n的数组,还有m次操作,每次操作可以选择将数组copy一份拼接到原数组后面作为新数组,或者将数组copy一份拼接到翻转后的数组后面作为新数组。原创 2022-11-05 11:18:10 · 720 阅读 · 0 评论 -
[好题][思维]Paimon Sorting 2021年ICPC南京站D
具体做法是看前i-1个数的最大值,如果a[i]小于等于max[i-1],那么第一轮遍历时a[1]就一定是max[i-1]了,所以第一轮两数组操作相同,交换次数也相同,实际上第二轮到第i-1轮都完全一样,差别在于长度为i的数组还需要进行第i论遍历,此时前i-1个数都已经升序排列了,需要交换的次数就是前i-1个数中去重后大于a[i]的数个数,这个值用树状数组很容易获得。题目给出了一段用于排序的代码,现在对于一个长度为n的数组,需要输出n个数,分别表示对前i个数进行排序需要进行多少次交换操作。原创 2022-11-03 22:18:07 · 993 阅读 · 0 评论 -
[树形dp]Crystalfly 2021年ICPC南京站H
之后遍历树一遍,自底向上更新dp值。如果当前点存在3秒点,那么可以先遍历第一步向哪个子节点走,最后所有情况取最大值,当确定第一步走到哪个子节点后,第二步肯定要返回父节点,第三步选择哪个3秒点其实也是固定的,肯定选择具有最大点权的那个3秒点,这里把不同3秒点的贡献列出来就很容易发现了。给出一棵有n个点的树,树上每点权值为ai,每个点还有一个暂存时间ti,当走到某点i时,其所有相邻结点开始计时,当时间达到相邻点的暂存时间后,相邻点的权值就会消失变成0,问从点1出发,能够获得的最大权值。原创 2022-11-03 21:43:09 · 622 阅读 · 0 评论 -
[思维][双指针]Klee in Solitary Confinement 2021年ICPC南京站C
最后需要注意n == 1的情况和k == 0的情况。有一个长度为n的数组a,以及一个参数k,现在要求整个数组中出现次数最多的那个数的出现次数。你可以进行1次或0次操作,操作内容是任选一个区间[l, r]并让每个数+k,问最终答案是多少。原创 2022-11-02 16:30:18 · 652 阅读 · 0 评论 -
[构造]Repetitions Decoding Codeforces1642D
如果数组中某数出现次数为奇数,那此时一定无解,因为无论作多少次操作该数出现次数仍然是奇数次,存在出现奇数次的数时是不可能符合题意的。遍历原数组,对于a[i]向后找第一个等于a[i]的位置j,此时依次在j位置后面添加a[i+1], a[i+2], ......, a[j-1],也就是将a[i]到a[j-1]作为平方串中的第一段,第二段通过加数操作生成,以此类推直到遍历完整个数组,由于每个位置最多向后遍历n次,且每次最少也会前进一个位置,所以总时间复杂度为O(n^2)。原创 2022-10-31 21:41:31 · 422 阅读 · 0 评论 -
[思维]Factorial Divisibility Codeforces1754D
之后开一个500000的桶数组cnt,cnt[i]用来记录i这个阶乘出现的次数,之后对于i从1到x-1,将cnt[i]转为小于等于i的数,也就是如果i!每出现了i+1次就将其凑成一个(i+1)!最后剩下个数一定小于等于i,这么处理完之后a[1]!(m小于等于i),而某些位置m*i!一定为0,也就是只要i从1到x-1中出现了一个非零的cnt[i],那么最后一定模x!给出n和x,接下来给出长度为n的数组a,问a[1]!原创 2022-10-23 18:33:10 · 353 阅读 · 0 评论 -
[构造]Make Nonzero Sum Codeforces1754C
考虑每次都构造长度为2的区间,如果num > 0,那说明贡献太大了,需要让贡献减少,有三种区间会让总贡献减少,分别是[1, 1],[-1, 1],[0, 1],并且都使总贡献减少了2,所以只需要在原数组中找到num/2个不相交的数对(x, y),满足y == 1即可,剩下的位置都各自成段即可。给出长度为n的数组,在easy版本中仅由1和-1构成,在hard版本中仅有1、-1和0构成,现在可以将该数组划分成若干段,每段的贡献为a[1]-a[2]+a[3]......,问如何分段使所有段权值加和为0。原创 2022-10-23 18:11:24 · 480 阅读 · 0 评论 -
[树形dp]Weight the Tree Codeforces1646D
首先需要想到相邻两点不可能同时被记为good点,这样这道题目就有点像经典树形dp题——没有上司的舞会了,设状态dp[i][0/1]表示在以i为根的子树中且i点不是good点/i点是good点的最大总good点数,为了统计最终方案还需要记录dp2[i][0/1],dp2[i][0/1]表示在以i为根的子树中且i点不是good点/i点是good点的总权重最小值。最后特判一下n == 2的情况,因此此时不符合前面说的相邻两点间只有一个点能是good点。原创 2022-10-23 09:33:27 · 299 阅读 · 0 评论 -
[思维]GCD Guess Codeforces1665D
根据这点就可以求出最低位是否为1,将这个方法扩展至判断第i位,只需要构造a、b让x+a和x+b后i-1位全为0且第i位的结果是x的第i位+1,如果x的第i位为1,那么x+a和x+b的后i位都是0,也就是说x+a和x+b的gcd是2^(i+1)的倍数,如果x的第i位为0,那么x+a和x+b的第i位为1,后i-1位都是0,这说明x+a和x+b的gcd一定是2^i。用这种方法对每一位分别判断就能够得到最终x的数值了。每次询问需要给出不相等的两个数a和b,然后系统会返回gcd(x+a, x+b)给你。原创 2022-10-19 07:54:03 · 272 阅读 · 0 评论 -
[二分][贪心]Tree Infection Codeforces1665C
可以想到应该先处理出来树上所有组兄弟节点,然后优先选择点数多的组进行感染,设组数为t,前t秒一定将所有t组先进行感染,否则显然不优,有了这个思路后就可以二分求出最短时间了,在check中可以求二分出的时间x内最多感染的节点个数,如果这个值大于等于n,那么return true。有一颗有根树,根节点为1,现在每秒可以按顺序做如下两个操作,第一个操作:对于每一组兄弟节点,如果其中某个节点被感染,那么可以将感染传播给其某一个兄弟节点。第二个操作:选择树上任意一个健康的点感染它。问将整棵树感染的最短时间。原创 2022-10-18 22:56:58 · 242 阅读 · 0 评论 -
[构造]Reverse Sort Sum Codeforces1659D
通过对第一个非零的数进行扩展可以将答案向后填若干位,然后再对pos+1位置进行扩展,同样可以将答案向后填若干位,以此类推就能将答案填满。另外由于在不断排序的过程中开头0的个数是不减的,所以在一个固定的位置上其数字变化一定是+0 若干次,+1若干次到达a[i],然后再+0若干次,而从不断+1过渡到不断+0的时刻,一定是该位置前面全是0的时刻,所以只要知道一个位置pos开始不断+1的时刻,就能知道其终止+1开始+0的时刻t,而这时就能确定前t个数中必须恰好有pos个0存在,这样才能终止其不断+1。原创 2022-10-18 18:29:25 · 231 阅读 · 0 评论 -
[线性dp]Sending a Sequence Over the Network Codeforces1741E
设状态dp[i]表示区间[1, i]是否能通过某个数组得到,初始化全部为false,dp[0]为true,然后遍历b数组,对于每个位置其实就两种情况,一种是b[i]作为左侧区间的长度,一种是b[i]作为右侧区间的长度,对于b[i]是左侧区间长度情况,如果不会越界且dp[i-b[i]-1] == true,那dp[i] = true,对于另一种情况,如果不会越界且dp[i-1] == true,那么dp[i+b[i]] = true。原创 2022-10-12 18:10:09 · 701 阅读 · 0 评论 -
[线性dp]Burenka and Traditions Codeforces1719D1&&D2
设dp[i]表示将前i个元素全部置0的最小代价,状态转移就是选择一个最大的j,使得[j, i]的区间异或和为0,令dp[i] = min(dp[i-1]+a[i]!=0,dp[j-1]+j-i),选择最大的j其实是个优化,理论上是要对于所有右端点为i的异或和为0的区间进行统计,但是由于左端点小于最大的j是不优的,所以直接选最大的j就行。对区间[l, r]内的数字可以全部异或上一个数字x,代价为区间长度除2上取整,x值可以任取,求让整个数组全0的最小代价。原创 2022-09-28 23:38:02 · 243 阅读 · 0 评论 -
[思维][找环]Edge Split Codeforces1726D
这样问题就可以转化为如何选出一个无环的边集A,使得剩下的边集B仍然无环,比较容易想到构造出一棵树作为A,这样剩下的边数可能为0、1、2和3,只要剩下边数不为3,那它们一定不可能构成环,可以达到最优解,而对于剩下边数为3的情况,如果三边构不成三角形,那同样能得到最优解,如果三边构成了三角形,那就选择其中一条边e加入树A,树中多了一条边肯定会出现环,所以还需要在树A的环路中删除一条非e的边,这样最终树A和剩下边集B中均无回路,可以达到最优解。原创 2022-09-28 08:47:32 · 264 阅读 · 0 评论 -
[建图]2+ doors Codeforces1715D
类似第46届icpc沈阳站的一道题目,也是将30位分开单独来看,建30张图。对于每位都进行这样的处理,就能求出这n个数在这一位上取值是多少了。给出q个条件,需要你构造出满足这些条件的字典序最小的长度为n的数组。每个条件由i j x构成,表示第i个数按位或第j个数结果为x。原创 2022-09-25 10:11:16 · 417 阅读 · 0 评论 -
[前缀和]Tokitsukaze and Strange Inequality Codeforces1678C
可以维护一个前缀和数组num,num[i][j]表示前i个数中大于j的数有多少个,这样对于确定的区间[a+1, c-1]中满足p[b] > p[d]的个数就是num[c-1][p[d]]-num[a][p[d]],不过d的位置也是未知的,也需要枚举,时间复杂度就是O(n^3)了,接下来考虑优化掉最内层循环。有一个数组p,求有多少个四元组(a, b, c, d)满足p[a] < p[c] 且 p[b] > p[d],并且a < b < c < d。原创 2022-09-25 09:48:44 · 328 阅读 · 0 评论 -
[拓扑排序][二分]Toss a Coin to Your Graph... Codeforces1679D
二分答案,首先二分出一个x,check中检测是否能不经过大于x的点走完k-1步,而check的具体实现则需要重新建图,只考虑那些点权小于等于x的点,如果新图中出现了回路,那么显然一定可以return true,如果没有回路那新图就是一个DAG(有向无环图),直接拓扑排序求最远距离,如果最远距离大于等于k-1,那就可以return true,否则return false。给出n个点,m条有向边,以及一个参数k,每个点有一个点权,可以任选一个起点,并从该起点走k-1步,输出路径上最大值的最小值。原创 2022-09-22 22:57:47 · 265 阅读 · 0 评论