自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(159)
  • 收藏
  • 关注

原创 蓝桥杯 - 游园安排【第十一届】(最长上升子序列 + 线段树)

链接:游园安排【第十一届】题意:思路:首先,读懂题意后发现就是求最长上升子序列,但是数据有1e6,并且要求字典序最小。那么我们可以用线段树维护当前最长上升子序列并且同时维护当前最小串。1 .我们从后往前遍历,对于当前位置,找到后面的长度最大并且名字最小的位置,这样维护出来的串就能保证字典序最小了。2.还需要记录答案,我们只需用一个数组记录每一个名字后面跟的是哪一个名字即可。最后找到长度最大且开头最小的位置,循环一遍即可。代码:.........

2022-06-14 21:51:35 494 1

原创 蓝桥杯 - 第十三届省赛真题-最大子矩阵(线段树 + 双指针)

链接:第十三届省赛真题-最大子矩阵题意:思路:枚举上下边界,将这几行看看成一行,然后就可以双指针跑一遍求最大的合法区间了。最大最小值用线段树或rmq维护即可。复杂度大概 o(n3mlogm)o(n ^ 3mlogm)o(n3mlogm),如果把几行看成一行的过程也用线段树优化一下复杂度就可以是 o(n2(logn)m(logm))o(n ^ 2(logn)m(logm))o(n2(logn)m(logm)).代码:

2022-06-02 10:14:13 675

原创 蓝桥杯-第十三届省赛真题-技能升级(二分 + 优先队列)

链接:第十三届省赛真题-技能升级题意:思路:代码:

2022-06-01 11:27:01 1145

原创 蓝桥杯 - 第十三届省赛真题-选数异或(线段树 + 离线)

链接:第十三届省赛真题-选数异或题意:思路:对于区间[l ,r]中要想找到两个数异或和为x,那么就要存在两个位置pos1,pos2pos1,pos2pos1,pos2满足apos1==apos2⨂xa_{pos1}==a_{pos2}\bigotimes xapos1​==apos2​⨂x,那么问题就变成了对于每一个位置找区间内是否存在对应另一个数。考虑离线,对 r 排序,线段树的权值表示对于当前r,当前位置到r是否存在两数异或和为x。对于某一个位置 pos,如果前面出现过apos1==apos

2022-05-31 09:22:26 498

原创 蓝桥杯 第九届真题-堆的计数(dp)

链接:第九届真题-堆的计数题意:思路:首先,对于当前有n个节点的小根堆,如果我们任意选择l个节点放到左边,左边的l个节点,一定又可以构成小根堆,那么计算这l个结点的小根堆个数就变成了一个子问题。那么我们设dp[i]表示i个结点可构成的小根堆个数,那么可以得出转移方程为 dp[i]=dp[l]∗dp[i−1−l]∗c(i−1,l)dp[i] = dp[l] * dp[i - 1 - l] * c(i - 1 , l)dp[i]=dp[l]∗dp[i−1−l]∗c(i−1,l),l表示左子树的结点

2022-05-29 11:07:30 370

原创 蓝桥杯 第十二届国赛真题-异或变换(规律)

链接:第十二届国赛真题-异或变换题意:思路:打表找规律,变换过程会有一个周期,总会变回初始状态。进一步发现周期为第一个大于等于字符串长的的2的幂次数。然后暴力跑一遍就行了。(可以过100%,但感觉不像正解,有无大佬教教)代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod = 998244353;const ll de = 4e10;const int maxn =

2022-05-18 10:05:21 336 2

原创 蓝桥杯 第十二届国赛真题-巧克力(优先队列 + 贪心)

链接:第十二届国赛真题-巧克力题意:思路:第一眼看上去就像贪心,但具体不知道怎么贪,优先选便宜的,或者优先选保质期短的貌似都不行。仔细想了想 ,因为我们优先选便宜的可能会导致,让这个巧克力在后面选,且让和它价格差不多的巧克力先选可能更优,所以我们不妨从最后一天开始考虑,把符合要求的巧克力都加入备选集合,然后选择价格最便宜的巧克力,用优先队列维护即可。代码:#include<bits/stdc++.h>using namespace std;typedef long long

2022-05-18 09:17:12 1059

原创 蓝桥杯 和与乘积 (前缀和)

链接:和与乘积题意:给定一个长度为n的数列,求有多少个区间 [L, R] 满足区间内元素的乘积等于他们的和。思路:首先我们知道乘积的增长比和要快很多,唯一比较特殊的就是当前数为1时,乘积不变,和单调增大。所以可以得出两个结论:1.对于一个固定的起点,在一段连续的 1 中,至多只有一个位置满足要求。2.当乘积超过一定的值时,后一段区间都不可能满足要求。所以我们只需将不为1的位置存起来,对于每个左端点,遍历这些位置,同时判断这些位置之间的连续1是否存在一个接即可。因为乘积增长很快,我们最多遍历lo

2022-05-17 14:57:25 581

原创 Codeforces Round #778 D. Potion Brewing Class(数组模拟 lcm)

链接:D. Potion Brewing Class题意:给一颗树,知道相邻节点权值的比值,求树的所有节点的权值和的最小值(每个节点权值都是整数)。思路:如果确定1号节点的权值为 1 , 那么所有节点的值都可以求出来,但要求是整数,所以我们只要求出把每个权值化为最简分数后所有分母的lcm,最后把每个节点的值都乘这个lcm即可。这个思路不难想,但实现起来有点麻烦(比赛写了个爆ll的自暴自弃,现在写完发现好像也不难写),因为分母的范围是会超过 long long的,所以我们用数组记录没遍历完一个节点

2022-03-21 16:40:00 721

原创 优先队列实现

学习了一下堆排序,记录一下实现优先队列的代码:#include<bits/stdc++.h>#define ll long long#define fi first#define se second#define pii pair<int,int>using namespace std;const int maxn=1e5+5,mod=1e9 + 7;class Priority_queue{public: int a[maxn] , sz = 0;

2022-03-03 21:53:12 90

原创 蓝桥杯国赛 奇偶覆盖(线段树 + 扫描线)

链接:奇偶覆盖题意:思路:扫描线模板,维护有一点区别,分别维护当前节点下被覆盖奇数次和偶数次的长度。然后离散化一下(注意把数字离散化实质上是把每一段区间看成一个点)。代码:#include<bits/stdc++.h>#define ll long long#define fi first#define se second#define pii pair<int,int>using namespace std;const int maxn=1e5+5,mod=9

2022-02-25 22:07:09 654

原创 2021牛客暑期多校训练营7 K - xay loves sequence(主席树 + 三分)

题意:每次可以选择一个子区间使其+1或-1后对k取模,问把区间内所有数变为0的最小操作次数。思路:感觉碰到过很多次,最近的沈阳 J 题,还有西安邀请赛的B也是类似的题。如果不考虑取模,那么求出差分数组 d,问题转换为每次操作对d数组的一个数+1,一个数-1。那么肯定是对正数+1,负数-1,那么答案就是所有数的绝对值之和除2.考虑取模,那么相当于对每个数 + k或者 - k,要使贡献减小,必然是对负数 + k ,整数 - k 。此时每个数的贡献变化量为 k−2∗∣d[i]∣k - 2 * |d[

2021-11-24 22:02:17 254

原创 Gym 103373 - problem - F. Flip (线段树区间合并)

链接:F. Flip题意:给出一个01串,有两种操作:查询区间内01交替的子区间的数量。将区间内的01反转。思路:线段树维护区间左右端点分别是什么,该区间的合法子区间的数量,以左右端点为起点的最长合法区间的长度。区间合并的时候如果两个端点不同可以增加贡献。注意查询的时候用类似于pushup的操作,没找到一个小区间合并到答案里。代码:#include<bits/stdc++.h>using namespace std;#define ll long longconst i

2021-11-09 22:05:48 199

原创 洛谷 P6300 悔改(FFT)

链接:洛谷 P6300 悔改题意:思路:取min类型的卷积到普通乘法卷积的转化:具体参考下面大佬的博客:洛谷 P6300 悔改题解代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e6 + 5;const double Pi = acos(-1.0);int r[maxn];int T, n , m , k ,d[maxn] , vis[maxn]

2021-11-02 10:42:07 181

原创 Codeforces 528 D. Fuzzy Search (FFT)

链接:D. Fuzzy Search题意:给出一个母串S和一个模板串T,求模板串在母串中的匹配次数。匹配时,如果用s[i]匹配t[j],那么只要s[i-k]-s[i+k]中有字母与t[j]相同即可算作匹配成功。思路:对于普通的字符串匹配,我们考虑每一个字符,只要把模板串倒过来,两个串中是该字符的位置设置为 1 ,跑一次 FFT , 求出每一个字符对模板穿移动 i 位的贡献,如果所有字母的贡献 如果等于模板串的长度,答案就+1.对于此题,如果母串中第 i 位为该字符,那么我们就把 [i - k

2021-10-13 21:54:39 177

原创 Gym 102920 problem J. Switches(线性基)

链接:J. Switches题意:有 n 栈 灯 , n 个开关 , 每个开关控制一些灯的状态,求对于第 i 栈灯,按下哪些开关可以使得第 i 栈灯亮,其他灯熄灭。思路:这题本质上是求从n个数中选一些数异或得到目标数。而线性基可以有以下两个性质:线性基的元素能相互异或得到原集合的元素的所有相互异或得到的值。线性基中每个元素的二进制最高位互不相同。线性基可以构造出集合中一些元素相互异或的值,所以我们求出这 n 个数的线性基,然后一位一位构造就行了,因为线性基中每一个元素的二进制最高位不同,

2021-10-05 20:58:25 200

原创 HDU 6992 Lawn of the Dead (线段树)

链接: Lawn of the Dead题意:有一个大小为n∗m(1≤n,m≤1e5)n * m(1\leq n,m\leq1e5)n∗m(1≤n,m≤1e5)的网格图,初始在点(1,1)(1 , 1)(1,1),只能向下和向右走 , 现给出 k 的点的坐标 , 代表这 k 个点不能走 , 求图中有多少个点可到达。思路:如果一个点不可达 , 那么它上方和左边的点一定不可达 ,所以我们从上到下维护每一行可达的点有哪些 , 对于如果当前在第 i 行 , 点ai,ja_{i ,j}ai,j​和点ai,ka

2021-07-30 14:38:52 253

原创 Codeforces 827 E. Rusty String(FFT + 字符串 + FFT的一个小优化)

链接:E. Rusty String题意:给出一个字符串,只包含三种字符 V, K , ?。? 可以替换为 V 或 K,求字符串可能的周期有哪些。思路:对于该字符串,如果所有的字符往右移动 t 位后都与原来相同 , 那么它就可以以 t 为周期。所以我们对于每一个字符都计算出右移后与原来形同的步数 , 也就是所有相同字符之间位置的两两之差,可以用FFT求出 。 如果最后所有字符都可以移动 k 位与原来形同,k就可能是周期。但这里存在问号,可能存在一种情况 Si≠Si+2tS_i\ne S_{i+2t

2021-07-28 20:26:05 217

原创 HDU 6975 Forgiving Matching (FFT + 字符串匹配)

链接:Forgiving Matching题意:给出两个字符串 S , T。长度分别为n , m(1≤m≤n≤2000001\leq m \leq n\leq 2000001≤m≤n≤200000),现定义两字符串的 ans[k]为 :字符串S中包含多少个子串与T相似(相似的定义为两字符串最多k个位置不同)。现要求出所有的 ans[k] (0≤k≤m0\leq k \leq m0≤k≤m)。思路:我们先来考虑如何暴力求解 , 如果我们固定 S 串,让T串往右匹配S的每一个子串 , 如果在匹配当前子

2021-07-28 15:25:10 360

原创 2021牛客暑期多校训练营1 H Hash Function (FFT + 数学)

链接:H Hash Function题意:给定一个长度为 n (n≤500000n\leq 500000n≤500000) 的数组 a,数组中元素互不相同 , 现要求出一个最小的 x , 使得所有的数模 x后仍互不相同。思路:根据同余定理,这个数 x 肯定不能是数组a中任意两个数的差值和他们的因子。所以我们要求出数组中所有数两两之间的差值,如果直接求肯定要o(n2n^2n2),可以用 FFT 加速这个过程。FFT本身是求出两个多项式相乘后的系数,那么怎么用它来求数组a中两两的差有哪些呢。假设我们

2021-07-27 22:06:53 157

原创 2021牛客暑期多校训练营4 E - Tree Xor(合法异或区间)

链接:E - Tree Xor题意:有一颗节点数为 n 的树 , 现给出每个节点权值的范围 [li,ri][l_i , r_i][li​,ri​],以及每条边两端点的异或和。求点的权值有多少种不同的取值。思路:首先我们可以发现确定一个点的权值后,所有的的权值就都确定了 , 所以我们先让1号节点的权值为 0 , 求出其它所有点的权值wiw_iwi​。这样我们给1号节点异或上 a 后,就相当于给其它每个节点也异或 a 。这样我们就可以求出 a 的 n 个限制 wi⨁a∈[li,ri]w_i\bigop

2021-07-27 09:56:52 499

原创 HDU 6962 I love tree (线段树 + 树链剖分)

链接:I love tree题意:给一棵树 , 初始所有点的点权为 0 ,现有两种操作 :给出 a , b,把a 到 b路径上的点依次加上 1 ^ 2 , 2 ^ 2 , 3 ^ 2。给出一个 a 求点 a 的权值。思路:如果是一个普通的数组进行上述修改操作 , 我们有两种方法 , 观察上述操作,发现加上的值差分后是一个等差数列 , 所以我们把原数组差分,把操作数也差分一下,就变成区间维护一个等差数列,一个点的答案就是前缀和。但是这是在树上 , 感觉就不太好操作了,多校的题解说是要分块。

2021-07-23 10:45:01 449

原创 Codeforces 766 E. Mahmoud and a xor trip(树形dp + 按位运算)

链接:E. Mahmoud and a xor trip题意:给一棵树,每个点有一个权值 ,定义任意两点间的距离为:两点间所有点权的异或和 。求树中所有路径的距离和。思路:对于每个节点开一个数组记录当前节点二进制每一位 1 的个数 , 然后dp 从下往上转移即可 , 但要注意子树外的贡献很容易算重复,所以边跑边记录答案。代码:#include <iostream>#include <cstdio>#include <queue>#include <

2021-07-22 09:50:05 121

原创 洛谷 P3193 [HNOI2008]GT考试 (矩阵快速幂优化dp + kmp)

链接: [HNOI2008]GT考试题意:给出一个长度小于20的数字串 s,问有多少种长度为 n(n <= 1e9) 的数字串中不包含 s 。思路:首先不考虑数据范围,可以用dp[ i ][ j ]表示枚举到第 i 位当前后缀匹配 s 的最大前缀。最后dp[n][0 , m - 1]就是答案。具体怎么转移呢,如果新加的这一位可以与 s 的下一位匹配,那么就可以转移到 dp[i + 1][j + 1]。如果不匹配就往回找第一个能匹配的位置,这里可以利用kmp的next数组往回跳,匹配一个新的

2021-07-21 19:41:25 179

原创 HDU 6955 Xor sum (字典树 + 前缀)

链接:Xor sum 题意:给一个长度为 n 的数组 , 要求出一个最短的连续子段,使它的异或和大于等于 k。思路:首先我们要知道 [1 , l]的前缀异或和与 [l , r]的前缀异或和 的异或为 [l + 1 , r] 的异或和。所以我们对于每一个右端点,用字典树查询左边的每一个前缀异或和 , 同时字典树存当前01串出现的最右位置。代码:#include <iostream>#include <cstdio>#include <queue>#incl

2021-07-21 09:25:28 268

原创 HDU-6959-zoto(莫队 + 分块 / 数状数组)

链接: HDU-6959-zoto题意:给出一个数组 a[i] , 表示平面内有 n 个点,每个点的坐标为(i, a[ i ]),再给出 m 次查询,每次查询给出一个(x0 , y0) , (x1 , y1)的矩形区域 , 问矩形区域内有多少个不同的 y 坐标。题意简化一下: 求区间 [x0 , x1] 内大于等于 y0,小于等于 y1的不同的数有多少个。思路:对于不同的区间 [x0 , x1]可以用莫队来移动,先确定一个区间,每次移动我们需要修改对应点的个数, 如果这个数的个数从无到有 ,或者从

2021-07-20 20:50:51 293 5

原创 Codeforces 1550-E. Stringforces(二分 + 状压dp)

链接:E. Stringforces题意:给一个长度为 n 的字符串,包含’ ? '和前 k(k <= 17) 个小写字母现要求把问号替换成字母,使得字符串的价值最大。对于一个字母的价值为 : 完全由该字母组成的最长子串的长度。该字符串的价值为所有字母价值的最小值。思路:1.首先答案肯定是有单调性的,如果能构造出长度 l 答案,那肯定也能构造出比 l 更小的答案,所以我们先二分答案。2.主要是怎么判断能不能构造出这个答案,假设我们现在二分的答案为 x .我们可以先预处理出从位置 i 往后得

2021-07-15 20:43:30 205

原创 Gym-103145-problem-D. Lowbit (吉司机线段树)

链接:D. Lowbit题意:给一个长度为n的数组a,有以下两种操作:给出l , r 把区间[l , r]内的每一个ai变成 a[i] + lowbit(a[i]).查询区间[l , r]的权值和。思路:对于某个数加上它的lowbit,如果这个数是 1000000(2)的形式,它的lowbit等于本身,那么等价于乘2。所以我们对区间打一个标记,如果全是上述形式,那么直接区间乘,否则就暴力更新。代码:#include <iostream>#include <cstdio

2021-07-14 20:57:59 551

原创 Gym - 102220 - problem H. Skyscraper (差分数组 + 线段树)

题意:有 n 座大楼排成一排,第 i 座大楼的预期高度为 ai,有m次操作:1.把区间[l , r]内的大楼的预期高度增加 k.2. 给定[l , r],查询仅对[l , r]区间内的大楼从0开始施工,到完成大楼修建至少需要多少个阶段。(每个阶段可以选择一个区间使得这个区间的大楼高度加1)思路:如果不考虑修改,j假设a的差分数组为数组b, 那么完成[l , r] 区间内的大楼修建需要 a[l] + b[l + 1 , r]中大于 0 的值之和。对于修改,其实我们只需要单点修改就行,每次区间修

2021-07-14 11:31:44 269

原创 HDU-5726-GCD(GCD预处理 + 线段树维护区间)

链接: HDU-5726-GCD题意:给你n个数(n<=1e5)然后m个询问(m<=1e5),每个询问一个区间,问你这个区间的GCD是多少,并且输出从1到n有多少个区间的GCD和这个区间的相同。思路:第一部分可以用线段树维护区间的GCD,第二部分,我们可以固定一个右端点,找出每一个gcd值变化的左端点,这个区间的长度就是区间gcd出现的次数。类似于递推的思路,具体看代码。代码:#include <iostream>#include <cstdio>#inc

2021-07-13 14:54:15 434 2

原创 Codeforces Round #721 (Div. 2) E. Partition Game(线段树优化dp / 决策单调性优化)

链接:E. Partition Game题意 :给出一个长度为 n 的数组 , 要求把它分成 k 段 , 每一段的权值为 当前这一段中每个不同的数 最后一次出现的位置与第一次出现的位置之差 的和。例如[2 3 2 2 3 1]的权值为 4 - 1 + 5 - 2 + 6 - 6 = 6.现在要求这个权值和的最小值。思路 :1.如果用 dp[i][j]表示把前 i 个数分成 j 段的最小权值 ,那么不难想到一个 n2n^2n2k 复杂度的dp方法 , fi,j=min⁡k=1i{fk,j−1+wk

2021-05-24 09:06:57 173

原创 AtCoder Regular Contest 116 D - I Wanna Win The Game(二进制 + dp)

链接: D - I Wanna Win The Game题意:给定一个 n , m (1 ≤\leq≤n , m ≤\leq≤ 5000) , 求有多少个长度为 n的A序列满足,a[i] ≥\geq≥ 0 ,所有 a[i]的和为 m ,异或和为 0 .思路:最暴力的思路就是n三方dp,但肯定是不行的 , 所以我们可以考虑二进制,异或和为 0 其实就是n个数的每一个二进制位,每一个二进制位都有偶数个 1,这样就能保证异或和为 0 .所以我们可以用sum[i][j]表示到第 i 个二进制位的权值和为

2021-04-07 23:33:55 173

原创 Gym 101667 Problem I.Slot Machines (kmp + 最小循环节)

链接:I.Slot Machines题意:每次给出数组 a 。问要满足从第k+1个数开始,数组T开始以p个数为一个循环,k+p最小是多少。如果存在多个k+p最小,输出p最小的方案。思路:枚举每一个 k 求出 [k + 1 , n] 的循环节长度就好了 , 可以用 kmp 求出循环节长度 , 我们先求出nex数组 , 对于后 i 个数的 p 值 就是 i - nex[i].代码:#include<cstdio>#include<iostream>#include&l

2021-04-01 21:18:07 153

原创 Gym 101667 Problem F Philosopher’s Walk (分形 + dfs)

链接 Philosopher’s Walk题意:给出如下图 n * n 的网格 ,n 一定为 2的幂次(n ≤\leq≤ 2 ^ 15),给出运动轨迹,求第 k 步所在网格的位置。思路:蓝桥被考过一道类似的题目 , 大概就是找出这个图形的几个基本形状,然后dfs就可以了 , 例如 最大的 W3图形,我们可以对步数除 16,判断在四个格子中的哪一个格子,并判断其基本形状 ,dfs的时候维护 当前位置 , 网格大小 ,基本形状,剩余步数就可以了。这个图形一共四种基本形状代码:#inclu

2021-04-01 20:00:02 153

原创 Leetcode 5696. 统计异或值在范围内的数对有多少 (字典树)

链接: Leetcode 5696题意:给出一个 num 数组 , 和 low ,high,求数组中有多少个点对(i , j)满足 num[i] ^ num[j] ≥\geq≥ low && num[i] ^ num[j] ≤\leq≤ high.思路 :求异或值满足一个范围,肯定是字典树 , 我们可以对每一个数单独考虑。对于每一个数,从高位开始,如果某一位的运算结果大于 low 那后面的 就可以随便是什么了,high也同理 , 所以只要递归往后找每一位,并维护 两个条件 ,当前是

2021-03-25 22:16:28 202 3

原创 洛谷 P4839 P哥的桶 (线段树维护线性基)

链接:P哥的桶 题意:给你 m 个位置和 n 次操作,操作有两种类型 :操作一 : 表示在区间[l , r]中选择任意个位置,使这些位置中的数的异或和最大。操作二 : 在位置 k 加入一个数x(每个位置可以有多个数)。思路:单点修改 + 区间查询首先考虑线段树 , 异或和最大考虑线性基。我们可以用线段树的每个节点表示这个区间的线性基,在修改的时候把每个包含这个位置的区间都插入一遍这个数就好了。然后查询可以把小区间的线性基合并到大区间,再根据这个大区间的线性基求解。代码:#include&lt

2021-03-17 19:19:34 124

原创 HDU 6579 B - Operation (线性基 + 贪心)

链接: B - Operation题意:给你 n 个数和 m 次操作,操作有两种类型 :操作一 : 表示在区间[l , r]中找出任意个数,使这些数的异或和最大。操作二 : 在数组末尾插入一个数x。思路 :对于区间异或和最大的问题,首先要想到线性基。我们可以先了解一下什么是 线性基。我们可以维护一个前缀线性基 , 用val[i][j] ,表示区间[1 , i]的第 j 位线性基的值。用 pos[i][j] 表示区间[1 , i]的第 j 位线性基的位置,如果我们贪心的让pos[i][j]

2021-03-17 01:22:58 201

原创 线性基学习

线性基线性基是一个数的集合,并且每个序列都拥有至少一个线性基,取线性基中若干个数异或起来可以得到原序列中的任何一个数。线性基的性质原序列里面的任意一个数都可以由线性基里面的一些数异或得到线性基里面的任意一些数异或起来都不能得到 0线性基里面的数的个数唯一,并且在保持性质一的前提下,数的个数是最少的线性基中每个元素的二进制最高位互不相同。构造方法对于要插入的数x,可以从大到小枚举每一个二进制位,如果这一位为 1 ,并且如果这一位的p[ i ]不存在,我们直接让这一位的p[ i ]等于 x

2021-03-17 01:07:51 92

原创 Codeforces Gym 102956 C. Brave Seekers of Unicorns(位运算 + dp)

链接 :C. Brave Seekers of Unicorns题意:给你一个数 n (1 ≤\leq≤ n ≤\leq≤ 1e6),要求出有多少个严格单调递增的序列满足任意三个相邻的数满足 a[ i - 1] ⨁\bigoplus⨁ a[ i ]⨁\bigoplus⨁a[ i + 1] ≠\neq​= 0 .思路:考虑dp , dp[ i ]表示有多少个以 i 为结尾的合法序列,那么不难得到转移方程 dp[ i ] = ∑j=1i−1\sum_{j=1}^{i - 1}∑j=1i−1​ dp

2021-03-16 09:08:51 267

原创 Codeforces gym 102956 J. Burnished Security Updates (二分图染色)

链接:J. Burnished Security Updates题意:给你一个图 n 个点 m 条边(不一定联通),要求对图上的点染色,使得每条边有且只有一个端点被染色。求最少需要对多少个点染色才能达到要求,若没有答案输出 - 1.思路:先判断图是不是二分图,若不是则输出 - 1,否则选择染色数量小的颜色,注意图不连通,对每个块取较小颜色即可。二分图染色 即直接 dfs 对相邻的点染不同的颜色,若出现矛盾则不是二分图,否则最后找到颜色数量少的颜色即可。代码:#include<bits

2021-03-09 20:53:59 237

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除