![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
codeforces
文章平均质量分 77
小酒窝.
大三菜鸡一只,欢迎来交流讨论,一起进步!
展开
-
CF- Sheikh(思维,异或,位运算)
所以,干脆二重循环遍历前 31 个非零数,后 31 个非零数,把这些位置作为子区间的左右端点,看区间价值是否是最佳价值,取所有子区间长度的最小值。当且仅当 x 的二进制表示中所有 1 所在位置在 y 二进制表示中都是 0,这样 x 的每一位都有贡献,那么异或的贡献就和加法的贡献一样。这题场上一点思路都没有,想着要选一段区间,既要让 sum 尽可能大,又让 xor 尽可能小,让两者之差尽可能大,没有想法。如果区间最左端或者最右端的一些数没有贡献的话,可以把这些位置删掉,把区间缩短。还是不太好想的,多思考吧。原创 2022-10-24 17:08:09 · 321 阅读 · 0 评论 -
CF - D. Counting Arrays(gcd)
给定 n,m,问如果 a[i] 的范围为 1~m 的话,对于数组长度 1~n,满足至少有两个删除序列的数组一共有多少个?也就是说,能构造出多少至少有两种删除方案的数组?选择 n 次位置编号将整个数列的所有位置删除,选择的 n 个位置编号构成删除序列。用总的数组数减去只有一种删除方案的数组数便是至少有两种删除方案的数组数。种,把所有位置能放的种类乘起来,便是满足只有一种删除方案的数组个数。的话,那么第 i 个位置可以删除,后面的位置往前移动一个位置。的,而且每次删掉第一个位置,后面的位置前移之后,仍然满足。原创 2022-10-22 11:28:44 · 708 阅读 · 1 评论 -
D. Paths on the Tree(树形dp)
一共 k 条路径,那么根节点 1 就被经过了 k 次,为了让总价值最大,并且满足兄弟节点被经过次数之差不超过 1,假设根节点有 cnt 个儿子,那么每个儿子初始要被经过 k/cnt 次,还有 k%cnt 个儿子多经过一次。如果一个儿子多经过一次之后,相比于原来得到的增量最大,那么这个儿子要被多经过一次。,这里只是额外多经过一次,也就是取模之后剩余的多了一个。根节点经过 k 次,那么所有节点至少被经过的次数就被确定了,假设为。次之后,以该节点为根的子树得到的最大价值。个儿子,因为儿子至少经过的次数是。原创 2022-10-16 21:49:54 · 584 阅读 · 0 评论 -
CF #781 - C. Tree Infection(贪心,二分)
除了第一秒,每次指定感染都能扩散感染一个节点,所以指定感染 x 次的话,就能扩散感染 x-1 个,sum 减去 x-1,然后对于剩下没感染的节点,每一秒钟可以感染两个,花费除 2 上取整秒。而现在每次操作 1 都可以作用于每个节点块,也就是说,假设一共有 x 个节点块,对于第 i 个进行指定感染的节点块,在 x 个节点块都被指定感染过之后,可以扩散感染 x - i 次。而 x 个节点块是肯定要指定感染的,就相当于第 i 个进行指定感染的节点块可以免费扩散感染 x-i 个节点。给定一棵树,根节点为 1。原创 2022-10-14 22:39:44 · 381 阅读 · 0 评论 -
CF #826 (Div. 3) - D(思维,模拟),E(DP)
然后把两个合并成为一个,下标为偶数的那个节点/2,然后再两个两个考虑,如果不是升序的话,互换一次变成升序。问,最少需要多少次操作,能把整个全排列变成升序?给定一个长度为 n 的全排列,保证 n 为 2 的幂次。分别表示为一个深度为 n 的完全二叉树的叶子节点的点权。现在给出数列 b,判断其是否可以由一个数列 a 得到?贪心,先把小子树的顺序改变好,然后去改变大子树的顺序。先两个两个考虑,如果不是升序的话,互换一次变成升序。如果发现考虑的两个不是相邻数字的话,那就不合法。一直合并,直到合并成一个。原创 2022-10-12 13:35:36 · 498 阅读 · 0 评论 -
CF - C. A Tale of Two Lands(绝对值,双指针/尺取)
对于每个位置 i,每次找到最后满足的位置 j,和当前位置之差便是满足的以 i 为左的点对数,累加求和。一开始就是化公式,分正负讨论,后面还要二分找区间,然后就很麻烦。来说,就能保证 |x| 为区间左端点,|y| 为区间右端点。无论 x 和 y 的正负,|x+y| 和 |x-y| 都是。而这个最后满足的位置是单调往后走的,就可以用一个指针往后指。发现对于 -3,5 和 3,5 种数对,得到的。所以就不需要考虑正负,直接取绝对值。可能在往后走的一段区间内满足。,问其中一共有多少个数对。是相同的,那么就说明。原创 2022-09-21 00:22:12 · 162 阅读 · 0 评论 -
CF - D. Ehab and the Expected XOR Problem(前缀异或)
所以对于每个位置,可以从小到大枚举前缀异或 s[i],如果当前值在之前没有作为前缀异或出现过,并且其异或上 x 也没有出现过,那么这个值就可以作为前缀异或。发现如果当前枚举的值不满足要求的话,这个值在后面的位置一定用不到,因为一直要保证这个值在前面没有出现。所以可以用一个指针指向枚举的数,单调往后走。只能有一个作为前缀异或出现在答案数组中,两两配对,和其他值互不影响。所以这些作为前缀异或的值的顺序没有要求,随意确定一种顺序即可。假设当前位置的前缀异或为 y,那么一定要保证。个数的话,复杂度很高。原创 2022-09-19 11:51:28 · 196 阅读 · 3 评论 -
CF - D. Extra Elemen(multiset)
把所有公差存在 multiset 里,遍历所有删除的位置,把在 set 里的公差删掉,然后加进去新的公差,然后通过判断最大值和最小值是否相同来看是否所有公差都相同了。还是挺麻烦的,写了几十行不对。其实,第一次想的思路是对的,但是判断所有数是否相同不是 O(n),而可以 O(logN),把所有数存到 multiset 里,然后判断最大值和最小值是否相同。一开始想的很简单,遍历删掉的位置,然后判断剩余所有数的公差是否相同,然后又想,判断所有数是否相同要 O(n),整体复杂度就是。原创 2022-09-06 23:30:42 · 101 阅读 · 0 评论 -
CF - D1/2. Burenka and Traditions (DP,异或,思维)
发现,当区间长度为 1 的时候花费为 1,长度为 2 花费为 1,长度为 3 花费 2,长度为 4 花费 2(长度为 2 的花费的两倍),长度为 6 花费为长度为 3 花费的两倍。如果两个相同的值异或会变为0,所以可以维护前缀异或,如果 [1~y] 的异或值异或上 [1~x] 为0,那么 [x+1, y] 这段区间的异或值就为 0,可以 O(1) 判断一段区间异或值是否为 0。的,唯一减少花费的机会就是,将当前位置放到一段区间异或为 0 的区间将花费 -1。表示,前 i 个位置变为 0 的最小花费。...原创 2022-08-18 11:51:05 · 500 阅读 · 4 评论 -
D. Chip Move(DP,优化时间和空间)
第 1 次移动可以跳 k 的倍数距离,第 2 次移动可以跳 k+1 的倍数距离,…当前步数用到了当前层和上一层,为了方便数组交替,将枚举位置和枚举步数的两重循环互换,先枚举步数再枚举位置。如果只用到了上一层的话可以用滚动数组优化,现在也用到了当前层,所以可以再开一个数组交替更新。走到上一位置跳了 j 步,再到当前位置跳了 j 步,就相当于从一开始的位置跳了。当 k 最小为 1 时,每次跳只跳距离的一倍,n 最大为 2e5,,走到上个位置跳了 j-1 步,再跳 1 倍的距离到当前位置。,遍历上一次跳的倍数。.原创 2022-08-07 16:38:45 · 513 阅读 · 1 评论 -
D. Tournament Countdown(交互题)
如果朴素询问的话,从最底层每次询问两个,分别询问每一局的胜者是谁,一共 n-1 局,得到最终胜者的询问次数为 n-1。这样将初始的 n 人四个四个求出初胜者,得到 n/4 个胜者,再不断进行下去,最终剩下 2 个或者 1 个。注意题目给的询问次数限制有提示作用,不是平白无故给你的,如果把这个看懂的话,题目也就差不多了。三局一共 4 人,分别记为 a, b, c, d。例如图中的 1, 2, 3, 4。每次可以询问系统两个人胜利的场次。次询问的条件下,求出最终的胜者。进行两两决斗,胜者进入下一轮。......原创 2022-08-07 11:03:27 · 332 阅读 · 0 评论 -
Codeforces Round #474 (Div. 1 + Div. 2) - C, F
但是遍历所有指向x的边找权值小于w的f[i]来转移复杂度太高,当有1e5个边相互指向两个点时,每给出一个边就要遍历其余所有边,复杂度是n^2的。但是注意权值wi可能为0,也就是说树状数组中下标0的位置也有对应值,但是在插入和询问的时候,无法处理0的情况,所以需要搞个偏移量,将所有边的权值都+1。因为路径中所有边按照输入顺序相连,权值严格上升,所以每输入一条边,就可以转移得到以该边结尾的所有路径中最长的长度。,找所有指向节点x的边,用这些边中权值小于w的来转移。...原创 2022-07-27 18:43:35 · 114 阅读 · 0 评论 -
Codeforces Round #809 (Div. 2) - C, D1
维护前i组的答案sum,遍历到当前组的时候,如果选第2个位置,就直接把sum+加上后缀和跟答案取min,否则就把当前第1个位置的值加上,继续往后走。从前往后遍历每个组,如果当前组选第1个位置,那么后面的所有组还有活动的余地,如果选第2个位置,那么后面所有组都只能选第2个位置,答案就定下来了。只有两个连续的位置是没有增高的,其前面都是偶数位置增高,后面都是奇数位置增高,那么可以预处理出偶数位置前缀和奇数位置后缀。将位置23,45,67,…奇数好搞,直接加就行。...原创 2022-07-19 18:29:14 · 221 阅读 · 0 评论 -
Codeforces Round #808 (Div. 2) - A,B,C
既然是选择一些,如果考虑选哪些选哪些就太复杂了,这时就应该考虑特殊情况或者最终状态,寻找共性。关键在于贪心思想,既然都会花费代价,不妨留到最后再花费,中间还可能会有贡献。那就是看是否有i的倍数在区间[l,r]中,O(1)得出答案。如果给定的钱数对于某个位置到末位置能花费完的话,那就是最后的位置了。做题时提高专注力,把一个思路想到底,看看最后会怎么样。注意看清题目,是选择一些位置,不是对所有位置。,这样n个位置就互不相同了。多刷题,多总结,多动脑。问,最多拿多少位置?那就直接考虑特殊的,.........原创 2022-07-17 12:11:59 · 186 阅读 · 0 评论 -
Codeforces Round #806 (Div. 4) D(DP,特判大数)
题意给定 nnn 个箱子,每个箱子里金钱 aia_iai。每个箱子可以选择用好钥匙开还是用坏钥匙开:钥匙花费可以赊账,每个钥匙只能用开一个箱子。问,这些箱子中的金钱最多能得到多少?1≤n≤105, 0≤k≤109, 0≤ai≤1091 \leq n \leq 10^5,\ 0 \leq k \leq 10^9,\ 0 \leq a_i \leq 10^91≤n≤105, 0≤k≤109, 0≤ai≤109思路用 DP 的思路:定义状态 表示,前 个箱子,用 个坏钥匙,能拿到的最大金钱数。状原创 2022-07-16 00:00:46 · 172 阅读 · 0 评论 -
Codeforces Round #583 (Div. 1 + Div. 2) - A, D, E
注意,在此题中因为是棋盘,两次搜索遍历方向的!可以按照相同的遍历次序走走两遍,第一遍走到终点后,将路径上的所有点标记,第二遍走的时候不能走到标记点。如果第二遍不能到达终点了,则说明存在必经点。还有一种情况就是,从起点到终点的路程中有一个必经点,将这个必经点堵上之后便不能到达终点,这种情况下操作次数为1。发现只要把起点要走到的两个位置设为障碍物便能阻止其到达终点,所以操作次数最多为2。问,最少增加多少障碍物能阻止从起点到达终点?不用添加障碍物就不能到达终点,操作次数为0;.........原创 2022-07-15 15:09:32 · 1257 阅读 · 0 评论 -
Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) - B, C, D
所以根据当前位置的s[i]便能求出集合中和为s[i]的最小的若干值,那么集合中比这些值大的第一个数便是p[i]。所以如果当前位置填x,那么集合中比x小的数必定都在前面,那么当前的s[i]要是这些数的和。走到一个位置,如果当前数x在整个数列中出现个数mp[x]不为1,说明该数有重复,将该数删掉,该数的重复次数mp[x]-1,重复数的个数sum-1。将该位置后面所有位置上的数s[i]都减去当前数1,最后一次出现的0的位置便一定是全排列中2所在位置。...原创 2022-07-14 23:18:05 · 269 阅读 · 1 评论 -
Contest 2050 and Codeforces Round #718 (Div. 1 + Div. 2) - D (棋盘式DP)
题意给定一个 n*m 的棋盘,相邻两个位置之间移动有对应花费 wi,jw_{i, j}wi,j。问,从每个位置出发,走 k 步回到该位置的最小花费?位置可以重复走。2≤n,m≤500, 1≤k≤20, 1≤w≤1062\leq n, m\leq 500,\ 1\leq k\leq 20,\ 1\leq w\leq 10^62≤n,m≤500, 1≤k≤20, 1≤w≤106思路走 k 步回到原位置有两种走法:1,走到一个位置之后原路返回到起点;2,绕一圈回到起点。对于第二种走法,可以证明其一定不原创 2022-07-12 13:56:43 · 168 阅读 · 0 评论 -
Codeforces Round #805 (Div. 3) - E, F, G
题意给出两个 multiset AAA 和 BBB,判断能否将集合 BBB 经过若干次操作变为集合 AAA?如果可以,最少操作多少次?思路假设集合 A 中的一个偶数元素为 x,其对应在集合 B 中的元素为 x/2,那么元素 x 除以2 就相当于元素 x/2 乘以 2,仍然是相互匹配的。那么操作就可以转化为:问,能否将两个集合变为相同?因为每次操作都会使元素变小,所以每次取出两个集合中的最大元素,判断这两个元素是否相同。注意其实只要判断能否将两个集合变为相同,只需要判断是否 A 集合中所有元素的奇因子原创 2022-07-12 00:02:28 · 540 阅读 · 0 评论 -
Educational Codeforces Round 131 (Rated for Div. 2) - A, B, C, D
题意给定一个长度为 nnn 的 b[]b[]b[] 数组,其中 bi=⌊iai⌋b_i = \left\lfloor \frac{i}{a_i} \right\rfloorbi=⌊aii⌋。找到原来的全排列数组 a[]a[]a[] 并输出。思路由 bi=⌊iai⌋b_i = \left\lfloor \frac{i}{a_i} \right\rfloorbi=⌊aii⌋ 可知,a[]a[]a[] 数组每个位置元素 aia_iai 有取值范围:ibi+1≤ai≤ibi\frac {i}{b原创 2022-07-09 17:02:01 · 162 阅读 · 0 评论 -
Codeforces Round #778 (Div. 1 + Div. 2) - B, C
比赛链接:https://codeforces.com/contest/1654题意有一块蛋糕经过下面 n−1n-1n−1 次操作被切成了 nnn 块:现在给定最终的 nnn 块小蛋糕,判断其是否能由上面的操作得到?1≤n≤2⋅105, 1≤ai≤1091 \le n \le 2 \cdot 10^5, \ 1 \le a_i \le 10^91≤n≤2⋅105, 1≤ai≤109思路一开始一直在想,到底怎么合并,依次哪两个合并能把所有的合并成一个。。想了几种策略之后发现都不行,被卡住。。后面又原创 2022-07-08 09:21:13 · 229 阅读 · 0 评论 -
CodeTON Round 1 (Div. 1 + Div. 2) - B, C, D
题意给定一个长度为 n 的非负整数数列,可以进行若干次如下操作:问,是否能将数列中所有元素变为相同的?思路忽略到一点:可以模上元素本身!!每次操作可以让模上数列中的最大值,让数列中的最大值变为 0。这样,所有大于等于 2 的元素都可以变为 0。但如果数列中有 1 存在的话,就无法将 1 也变为 0。Code经验场上一直在想,到底是模几啊,是 2, 3, 5, 7 就行么?想了半天发现有反例,然后就卡住了。。一直没想到可以模上自己。。一定要先考虑特殊的情况啊!题意给定一个数 nnn,判断是否可以原创 2022-07-07 12:54:01 · 195 阅读 · 0 评论 -
Codeforces Round #792 (Div. 1 + Div. 2) - A, B, C, D
题意给定一个 n∗mn*mn∗m 的矩阵,判断能够通过对调 i,ji, ji,j 两列实现矩阵中的每一行元素都是从左到右非递减的。(i,ji, ji,j 可以相同)如果能,输出 i,ji, ji,j;否则输出 -1。1≤n,m≤2⋅105, n∗m≤2⋅1051 \le n, m \le 2 \cdot 10^5, \ n*m \le 2\cdot10^51≤n,m≤2⋅105, n∗m≤2⋅105思路对调两个元素使得整行元素非递减,一开始想的做法是,找到两个和相邻位置不匹配的位置:一个比左右相邻位原创 2022-07-06 17:25:45 · 231 阅读 · 0 评论 -
Codeforces Round #804 (Div. 2) - A, B, C
C. The Third ProblemB. Almost Ternary MatrixA. The Third Three Number Problem原创 2022-07-05 10:22:07 · 149 阅读 · 0 评论 -
B. GCD Problem(互质),C. Paprika and Permutation(模数)
B. GCD Problem题意:给定正数 n(10≤n≤109)n(10≤n≤10^9)n(10≤n≤109),找到三个互不相同的数 a,b,c,满足:a+b+c = n;gcd(a, b) = c;分析:对于一个较小的数和很大的数,很容易互质。所以构造 c=1,从小到大枚举a,b=n-a-1,找到第一个互质的数退出。Code:#include<bits/stdc++.h>using namespace std;#define Ios ios::sync_with_原创 2022-03-19 22:20:20 · 325 阅读 · 0 评论 -
CF769 - C. Strange Test(思维,位运算)
C. Strange Test题意:给出两个数 a, b。(1≤a<b≤106)(1≤a<b≤10^6)(1≤a<b≤106)每次执行下面一种操作,问最少经过多少次操作能够使得 a=ba=ba=b。a++;b++;a |= b;分析:对于 取或 操作,执行之后 a 的值就不小于 b 了,那么后面就只需要执行 b++,而用不到 取或 操作了。所以 取或 操作最多只会用一次。如果不用取或操作:那么操作次数为 b-a;否则,用一次取或操作,在什么时候用呢?设当 aaa原创 2022-03-19 21:56:23 · 310 阅读 · 2 评论 -
CF #774 ——C(二进制枚举),D(树形dp)
C. Factorials and Powers of Two题意:如果一个数为 2的幂次 或者是 阶乘数,那么定义这个数为漂亮数。现在给定一个数 n,问最少可以由多少个不同的漂亮数构成?1≤n≤10121 ≤ n ≤ 10^{12}1≤n≤1012分析:已知任何一个数都可以用若干个 2的幂次数 相加而成,2的那些幂次数 可以用将这个数化为二进制后,1的位置和个数确定。观察到 n 的范围不大,在这个范围内的阶乘数一共14个,所以可以遍历这些数到底用了哪几个。(二进制枚举)然后减去这些阶乘数之原创 2022-03-10 17:33:43 · 278 阅读 · 0 评论 -
3月6日被虐记录
D - ABC Transform题意:给定一个包含ABC的字符串,对于每一次扩展,一个字符会变为两个字符。A →BC, B →CA, C →AB.Q次询问,扩展ti次之后,第ki个字符是什么?Q ≤10^5, ti<10^18, ki<min(1e18, the length of S(t))思路:对于较高的层数来说,每次找到其来时的路径,就像一个完全二叉树,对于当前层数的第x个节点,其父节点是上一层的第x/2(上取整)个。因为x不会超过1e18,所以照这样每次除2,不超过6原创 2022-03-06 23:25:26 · 249 阅读 · 0 评论 -
CF 711 B(思维),C(性质);ARC 136 B(性质,逆序对)
B. Odd Swap Sort题意:给出一个数列,判断是否可以经过若干次下列操作使其变为非降数列?操作:如果相邻的两个位置相加为奇数,可以互换。思路:那么对于一个数想要移动就必须穿过和其奇偶性不同的数。移动时两个数交换,所以只需考虑较小的数往前移动:从前往后遍历每个位置,该想要往前移动就必须穿过所有比其大的数。但是如果前面出现过和其奇偶性相同的比其大的数,那么这个数是穿不过去的,就无解。所以分别维护前面位置中,奇数和偶数最大值即可。Code:const int N = 200010,原创 2022-03-01 21:59:07 · 169 阅读 · 0 评论 -
CF 770 B(奇偶性), C(规律)
B. Fortune Telling题意:两个人进行游戏,起初手中分别有一个初始值 t1,t2t1, t2t1,t2。有一个长度为 n 的数列,对于每个位置 a[i],可以选择让 t += a[i] 或 t ^= a[i]。 (1≤n≤105)(1≤n≤10^5)(1≤n≤105)给出 x, y。人物 A 的初始值为 x,人物 B 的初始值为 x+3。现在知道有且仅有一个人最终的答案 y,请判断是A还是B?思路:可以看出,A 和 B 的初始值的奇偶性不同,加上该题的模拟过程过于复杂,所以应该是原创 2022-03-01 21:57:29 · 3333 阅读 · 0 评论 -
CF Edu 123,D(前缀和,思维),E(思维,组合数)
C. Increase Subarray Sums大意:一共 n 个数,定义 f(k)f(k)f(k) 为:将 k 个不同位置上的值都加上 x 后,能够得到的最大的连续子串和。求 f(0...k)f(0...k)f(0...k)。 (n≤5000)(n ≤5000)(n≤5000)思路:将 k 个不同位置上的值都加上 x 后,最大的连续子串长度不一定为 k。可以分别找到所有长度子串的最大和(前缀和处理),所用到的子串一定是这些中的一个。从小到大枚举增加 x 的位置个数 k:如果这 k 个原创 2022-02-23 23:28:46 · 249 阅读 · 0 评论 -
C. And Matching(二进制,构造,思维)
C. And Matching题意:给定 n 和 m,保证 n 为 2 的幂次数。现在要找到 n2\frac{n}{2}2n 对关系 (ai,bi)(a_i, b_i)(ai,bi),保证 ∑i=1n/2ai&bi=m\sum_{i=1}^{n/2}{a_i \& b_i} = m∑i=1n/2ai&bi=m。输出这 n2\frac{n}{2}2n 对关系。无解输出 -1。(4≤n≤216,0≤k≤n−1).(4≤n≤2^{16}, 0≤k≤n−1).(4≤n原创 2022-01-28 21:45:01 · 740 阅读 · 0 评论 -
Codeforces Round #767 (Div. 2)——C、D
Codeforces Round #767 (Div. 2)C. Meximum Array(贪心,模拟)题意:给出长度为 n 的数列a,现在要经过下面操作构造数列 b:选出数列 a 中前 k 个数,将前 k 个数的 MEX 值插入到数列 b 末尾。然后删除 a 中的这前 k 个数。问,如何操作使得构造的数列 b 的字典序最大?思路:为了使得字典序最大,就要每次都挑选当前整个数列 a 能够达到的最大 MEX 放到数列 b 后面。同时,为了让 b 的长度尽可能长,从前往后走的过程中,走过原创 2022-01-23 16:41:35 · 279 阅读 · 0 评论 -
CF 1262C. Monsters And Spells(区间合并)
Linking题意:有 n 个怪兽,每只怪兽在第 kik_iki 个时间点出现,每个怪兽有血量 hih_ihi。k1<k2<⋯<kn(1≤ki≤109),h1,h2,…,hn(1≤hi≤ki≤109)k_1<k_2<⋯<k_n (1≤k_i≤10^9),h_1,h_2,…,h_n (1≤h_i≤k_i≤10^9)k1<k2<⋯<kn(1≤ki≤109),h1,h2,…,hn(1≤hi≤ki≤109)对于一个时间点,如果前原创 2022-01-22 15:32:31 · 308 阅读 · 0 评论 -
Cow and Fields(最短路,贪心)
Linking题意:给出一个 n 个点 m 条边的无向图,起点为 1,终点为 n。其中有 k 个特殊的点,现在要加一条边连接两个特殊的点,使得从 1 到 n 的最短路最长。输出这个最短路长度。思路:容易想到其朴素做法,两重循环找出两个点 ,使得起点到一点的最短距离 + 终点到另一点的最短距离 + 1 最大。因为是最短路,所以这个最大值要和原来1到n的最短距离取min。假设找出的两个点为 i 和 j,起点到两个点的距离为xi, xj,终点到两个点的距离为yi, yj,那么加这一条边之后的最短距原创 2022-01-20 22:42:33 · 359 阅读 · 0 评论 -
CF 1625C. Road Optimization(DP)
Linking题意:在一条直线道路从A到走向B点,A点位于0位置,B点位于m位置。道路上有n个时速牌,第i个牌上标有ai,表示从该时速牌到下一时速牌这段距离中,每走一个位置耗时ai分钟。(初始位置0上有时速牌)现在要移除k个时速牌(0位置不可移),问移除之后从A到B的时间最少为多少?思路:状态表示:dp[i,j]:删除j个标志,到前i+1个位置所用的最少时间。状态转移:当前位置的标志不删除:上一位置的删除j个的状态加上当前这段距离所需要的时间:dp[i][j] = dp[i-1][j原创 2022-01-12 23:56:07 · 497 阅读 · 0 评论 -
Beautiful Decomposition(贪心,二进制)
Linking题意:将一个数n,通过 2k2^k2k 或者 −2k-2^k−2k 之和表示。问至少需要多少二次幂数?n 通过二进制串 s 给出。1 ≤ ∣s∣ ≤ 1061 ≤ |s| ≤ 10^61 ≤ ∣s∣ ≤ 106.思路:如果有一位是单个1的话,那么直接用这一位表示的二次幂数加上。如果有一段连续1的话,就相当于前面补个1表示的数-1所得,于是就可以用一次+1操作将这一串1变成最前面补的一个1。这个1如果不能和其前面的1连到一起的话,可以用一个操作数将其消掉;如果能和前面连到一起,原创 2022-01-11 23:40:16 · 407 阅读 · 0 评论 -
CF 1023D. Array Restoration(构造模拟)
Linking大意:给定一个长度为 n 的序列。现在有 q 次操作,对于第 i 次:选定长度不为 0 的一段区间,把区间中的所有值变为 i。现在对于给定的序列,判断是否由上述 q 次操作得到。序列中可能有 0,0 可以变成 1~q 中的任意数。思路:注意几个点:不存在中间的元素比两端的小(除去0): 单调栈,维护单调递增的栈。遍历每个位置,如果该元素之前出现过,判断第一个小于等于该元素的值是不是和其相等。 如果不是,说明中间有比其小的,NO。元素的最大值一定要为 q:把一原创 2022-01-07 11:31:42 · 345 阅读 · 0 评论 -
CF 1609D. Social Network(并查集,集合合并)
Linking大意:一共n个人,m个连接操作x y,让x和y成为朋友。现在对于 i 从1到m,可以选择 m 种操作中的 i 个进行,但是要使得前 i 个操作都要被满足。求朋友最多的那人的朋友个数。(2≤n≤103,1≤m≤n−1)(2≤n≤10^3,1≤m≤n−1)(2≤n≤103,1≤m≤n−1)思路:对于 i 从1到m遍历:如果当前的操作已经满足了,那么就可以连接其他的集合,使得某人的朋友个数最多,也就是使得一个集合最大。当前操作满足了,就多了一个连边的机会,k++。(k初始为1)如原创 2022-01-06 11:27:39 · 621 阅读 · 0 评论 -
CF1609C. Complex Market Analysis(质数)
Linking题意:给定一个长度为 n 的数列和数字 m,判断有多少个数对 (i,k)(i,k)(i,k) 满足:a[i]∗a[i+m]∗a[i+2m]∗...∗a[i+km]a[i]*a[i+m]*a[i+2m]*...*a[i+km]a[i]∗a[i+m]∗a[i+2m]∗...∗a[i+km]为质数。思路:若干个数相乘为质数,那么只有一个数为质数,其余数都为1。所以对于 a[i] 为质数,就需要计算后面连续的 a[i+km] 为1的个数。对于 a[i] 为1,那么需要找到后面连续的原创 2022-01-06 11:03:17 · 297 阅读 · 0 评论