牛客-黑白树(树形dp)

题目链接题面:题解:因为是向上染色,所以叶子节点肯定要选。接下来就是两种情况:1.节点 i 能不能被子树中的点染色,那么这个点肯定会被选。2.节点 i 能被子树中的某个点 j 染色,那么就出现了一个问题,i 这个点要不要选,因为我们可以先染 i 点再染 j 点,怎么去处理呢?我们可以将儿子节点附在父亲节点上,然后去更新父亲节点的最远距离:k[fa]=max(k[fa],k[son]-1)。 这样做可以将那些还没用到的点的剩余价值放在祖先节点,如果那些选择的点无法染到节点 i ,那么此时就可以用
分类: 其他 发布时间: 02-26 23:18 阅读次数: 0

Codeforces Round #700 (Div. 2) C. Searching Local Minimum(交互题+二分)

题意:有一个长度为n的全排列,每次可以询问一个位置的值,最多询问一百次,求出 k 满足 a[k]<a[k+1],a[k]<a[k-1]。第一次比赛写交互题,蒙了,然后随机数冲了一发,过了,最后意料之中的fst,o(╥﹏╥)o。思路:假如某个区间(l,r) 存在 a[i]<a[i+1],那么肯定(l,i)这个区间存在 a[i]<a[i+1],反之,假如存在a[i]>a[i+1],那么区间 (i+1,r) 肯定存在a[i]<a[i-1] ,那么一直二分到最后,l=r
分类: 其他 发布时间: 02-26 23:17 阅读次数: 0

Codeforces Round #700 (Div. 2) D1. Painting the Array I (贪心)

题意:给出一个数组,要求将这个数组分为两个子序列。定义子序列的价值为:将连续相同的数合并为一个后,剩下数的个数。求两个子序列价值相加最大。题解:设x为第一个序列的最后一个元素,y为第二个序列的最后一个元素。那么可以分类讨论:1.x==y此时a[i]不管放哪个都没影响。2.a[i]==x&&a[i]!=y此时应该放y后面,为什么?假设我们放y后面,接下来的元素可能使答案+1,也可能不,答案上限可以+2,但如果放在x后面,接下来的元素虽然随便放答案都可以+1,但是上限只能+1,随意
分类: 其他 发布时间: 02-26 23:17 阅读次数: 0

Codeforces Round #700 (Div. 2) D2 Painting the Array II(贪心)

题意:给出一个数组,要求将这个数组分为两个子序列。定义子序列的价值为:将连续相同的数合并为一个后,剩下数的个数。求两个子序列价值相加最小。题解:其实和d1的解法差不多,基本一样。设x为第一个序列的最后一个元素,y为第二个序列的最后一个元素。那么可以分类讨论:1.x==y此时a[i]不管放哪个都没影响。2.a[i]==x&&a[i]!=y此时应该放x后面,才是最优的,因为能消一个是一个。3.a[i]!=x&&a[i]==y同上。4.a[i]!=x&
分类: 其他 发布时间: 02-26 23:17 阅读次数: 0

牛客-筛子游戏 (概率dp)

题目链接题解:
分类: 其他 发布时间: 02-26 23:17 阅读次数: 0

Codeforces Round #701 (Div. 2) D. Multiples and Power Differences(构造)

题意:给出一个n⋅mn \cdot mn⋅m 的矩阵a,构造出一个矩阵b,满足b的大小和a一样,b[i][j]b[i][j]b[i][j]是a[i][j]a[i][j]a[i][j]的倍数,且b中相邻元素之差的绝对值是 k4k^4k4,k为任意整数。题解:先考虑两个数x,y,可以先将他们同时变成变成 lcm(x,y)lcm(x,y)lcm(x,y),再将y变成lcm(x,y)+y4lcm(x,y)+y^4lcm(x,y)+y4,这样就可以满足要求。然后再考虑给哪些数加上4次方:每隔一个加10101
分类: 其他 发布时间: 02-26 23:16 阅读次数: 0

Codeforces Round #701 (Div. 2) F. Copy or Prefix Sum (map优化dp)

题意:给定一个数组b,求有多少个数组a,对于任意1≤i≤n1 \leq i\leq n1≤i≤n,满足a[i]=b[i]a[i]=b[i]a[i]=b[i]或∑j=1ia[j]=b[i]\sum\limits_{j=1}^{i}a[j]=b[i]j=1∑i​a[j]=b[i] 。容易看出是dpdpdp,但难在怎么去优化 dpdpdp题解:设dp[i][j]dp[i][j]dp[i][j]表示前 i 项之和为 j 的方案数,那么就可以写出两种状态转移:dp[i][j]=dp[i−1][j−b[i]]
分类: 其他 发布时间: 02-26 23:16 阅读次数: 0

Codeforces Round #702 (Div. 3) G. Old Floppy Drive (二分)

题意:给出一个数组aaa,最开始指针指向a1a_1a1​,每过一秒指针就会向后移动一个,当到达ana_nan​后又会回到a1a_1a1​,每经过一个元素,就会得到这个元素的值,当得到的值总和≥x\geq x≥x时,就会停止,现在给出一些询问 xix_ixi​,问什么时候会停止。题解:一开始看题以为是等于x才停,想了好久,大意了。先求出每个位置的前缀和sum[i]sum[i]sum[i],在对前缀和取前缀最大值,即 dp[i]=max⁡j=1isum[j]dp[i]=\max\limits_{j=1}
分类: 其他 发布时间: 02-26 23:16 阅读次数: 0

2021牛客寒假算法基础集训营4 D题-温澈滢的狗狗

题目链接题解:要解决这个问题,就必须得知道亲密度≤\leq≤d的对数有多少,但不能强行算不同色有多少对,因为会超时,所以要用到容斥。即 不同色数目=所有-同色。所有对数目=d+d+d+....+d−1+d−2+1+0=d+d+d+....+d-1+d-2+1+0=d+d+d+....+d−1+d−2+1+0,可以直接算出来,要计算同色对,先把所有相同颜色的放在一起,可以用vector存一下,然后用双指针去计算出同色对数目。接来下就是二分了,二分出第k个的亲密度是多少,知道了亲密度,直接可以o(n)
分类: 其他 发布时间: 02-26 23:16 阅读次数: 0

Codeforces Round #703 (Div. 2) E. Paired Payment(最短路)

题意:给出一个带权无向图,一次必须走两条边,花费为(w1+w2)2(w_1+w_2)^2(w1​+w2​)2,求1到每个点的最短路。题解:本题的突破口为边权,因为边权大小只有50,所以可以在dijkstradijkstradijkstra上进行一点改动,将原先的一维的disdisdis数组更改为三维,结构体里面多记录一些状态,dis[i][j][odd]dis[i][j][odd]dis[i][j][odd]表示通过边权为 jjj 的边到达点 iii 的最短路,oddoddodd表示点 iii 是否为
分类: 其他 发布时间: 02-26 23:15 阅读次数: 0

Codeforces Round #703 (Div. 2) D. Max Median(二分+前缀和)

题意:给出一个长度为n的数组,要求找到一段区间,满足长度大于等于k,且中位数最大。题解:先考虑二分,我们可以先二分中位数midmidmid,然后再去看能否找到一个区间使其满足要求。接下来的处理比较巧妙:我们把≥\geq≥mid的数记为1,反之记为-1,那么可以发现,如果某段区间和为正数,说明midmidmid满足要求。既然要求区间和,那么必然要求前缀和,记sum[i]sum[i]sum[i]为前缀和,假如以 iii 为区间结尾存在区间满足要求,那么就是要区间最大值>0>0>0即:
分类: 其他 发布时间: 02-26 23:15 阅读次数: 0

Educational Codeforces Round 104 (Rated for Div. 2) E. Cheap Dinner(线段树优化dp)

题意:有n1n_1n1​种主食,n2n_2n2​种副食,n3n_3n3​种饮料,n4n_4n4​种甜点,有m1,m2,m3m_1,m_2,m_3m1​,m2​,m3​对关系,m1m_1m1​的每对关系代表一些主食与副食不能搭配,m2m_2m2​代表一些副食与饮料不能搭配,m3m_3m3​代表一些饮料和甜点不能搭配,每个食物都有价格,问怎么选才能使得价格最少,并且这444类都要有,输出最少的花费。题解:一开始想到了费用流,但是看到数据太大,就果断放弃了,后来想到用线段树维护,但是算错复杂度了,以为是个假
分类: 其他 发布时间: 02-26 23:15 阅读次数: 0

2021牛客寒假算法基础集训营 6 F题-组合数问题(复数快速幂)

题目链接题解:代码:#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<queue>#include<map>#include<stack>#include<set>#include<ctime>#define iss ios
分类: 其他 发布时间: 02-26 23:15 阅读次数: 0

2021牛客寒假算法基础集训营6 E题-网格(dp)

题目链接题解:因为每个数可以在行方向选一个,列方向选一个,所以行和列其实是独立的,也就是说,我们可以对左右和上下分开算贡献。先考虑算左右的贡献,不难发现,每行的第一个数只能选右边的数,那我们可以设出dpdpdp数组,dp[j][1]dp[j][1]dp[j][1]表示某行第 jjj 个数选择左边的数,dp[j][0]dp[j][0]dp[j][0]表示选择右边,那么可以写出转移方程:dp[j][0]=max(dp[j−1][0],dp[j−1][1])dp[j][0]=max(dp[j-1][0]
分类: 其他 发布时间: 02-26 23:14 阅读次数: 0

2021牛客寒假算法基础集训营6 B题-系数

题目链接题解:因为最后结果对3取模,所以可以在原先的式子上减去3x3x3x,变为 (x2−2x+1)n(x^2-2x+1)^n(x2−2x+1)n,然后可以再化简变成:(x−1)2n(x-1)^{2n}(x−1)2n,那么第kkk项系数就是C2nk∗(−1)2n−kC_{2n}^k*(-1)^{2n-k}C2nk​∗(−1)2n−k,只要讨论2n−k2n-k2n−k的奇偶性即可,求组合数取模可以用LucasLucasLucas算法。代码:#include<cstdio>#incl
分类: 其他 发布时间: 02-26 23:14 阅读次数: 0

平衡二叉树的插入调整(C语言)

平衡二叉树(C语言)平衡二叉树的插入与调整左右单旋左右单旋avltree Lrotation(avltree A) { /*左单旋*/ avltree B = A->left; A->left = B->right; B->right = A; A->height = getheight(A); B->height = getheight(B); return B;}avltree Rrotation(avltree A) { /*右单旋*/
分类: 其他 发布时间: 02-26 23:14 阅读次数: 0

二叉搜索树的操作(c语言实现)

二叉搜索树的操作(c语言实现)二叉搜索树(Binary Search Tree), 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。 typedef struct treenode *Bitree;st
分类: 其他 发布时间: 02-26 23:13 阅读次数: 0

最大堆的顺序存储操作集

最大堆的顺序存储操作集typedef struct hnode { int *data; int size; int maxsize;}*heap;最大堆的根结点比所有子树节点都大空堆的建立#define maxdata 1000#define false 0#define true 1heap create(int N) { heap h = (heap)malloc(sizeof(struct hnode)); h->data = (int *)malloc(N *
分类: 其他 发布时间: 02-26 23:13 阅读次数: 0

huffman树的建立

huffman树的建立Huffman树:所有结点带权路径长度之和最小的树将权重结点(left right设为null)输入堆的指针数组中,再排成最小堆,每次取出两个,建立新结点t,把两个最小结点挂在t上,再将t插入最小堆,每个结点合并一次,共需h->size次typedef struct treenode { int weight; huffmantree left; huffmantree right;}*huffmantree;typedef struct hfnode {
分类: 其他 发布时间: 02-26 23:13 阅读次数: 0

# File Transfer

File Transfer正常思路struct setnode { int data; /*data好像没啥屁用还要来一遍遍历,赶紧滚吧*/ int parent;}set[maxsize];int findp(setnode s[], int x) { /*找到根结点*/ int i; for (i = 0; i < maxsize&&s[i].data != x; i++); //严重增加时间复杂度 if (i >= maxsize)
分类: 其他 发布时间: 02-26 23:13 阅读次数: 0