自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Codeforces B. Jumps (Round 99 Rated for Div.2) (思维 & 数学)

传送门题意: 初始值为0,第 i 次操作你可 +i 或 -1。试问要得到数x至少需要多少次操作。思路:对于第 i 次操作,若选择 +i 便可增加 i 个数,若选择 -1 便相当于减少了 i+1 个数。对于 i 是从1开始取值,那么能减少的数值情况就是从2开始的。于是先利用前缀和存在sum数组里面,找到以一个大于或等于x的前缀和sum[k]。若该sum[k]==x+1,那么答案就是k+1;若sum[k]==x,答案就刚好是k;其他情况都可通过中间减值得到。代码实现:#include &lt

2020-12-03 22:18:24 84

原创 Codeforces A. Add Candies (#683 Div.2 by Meet IT) (思维 / 水题)

传送门题意: 有n包糖果,第i包里有i颗,目标是要让所有糖包里的糖果一样多。可进行m次操作,第j次操作将j颗糖果添加在所选糖包外的糖包里。输出操作次数及每次操作的a[j]。思路: 直接输出1到n即可。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<int, int>#def

2020-11-18 20:40:07 310

原创 Codeforces B. Numbers Box (#683 Div.2 by Meet IT) (思维)

传送门题意:有一个 n*m的矩阵,其中元素有负有正,每次可选任意相邻的俩元素将它们的符号取反,可进行任意次操作,求出可实现的整个矩阵最大矩阵和。思路:既然可以任意次操作,那么如果负数为偶数个,直接俩俩一起取反,最后整个矩阵都会是正数。若负数为奇数个,将负号留个绝对值最小的数即可。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int lon

2020-11-18 20:24:44 41

原创 Codeforces C. Knapsack (#683 Div.2 by Meet IT) (思维 / 数学)

传送门题意:在n个物品中选出部分放入承重量为W的背包,使得放入的重量C满足 W/2 ≤ C ≤ W (其中W/2上取整)。若无可行方案输出-1,否则输出所选物品个数及每个物品重量。思路:首先判断是否有个物品重量刚好在 W/2到W之间,若有直接选该物品即可(可二分也可暴力找)。反之,直接从最小开始连续选择重量在1到W/2之间的物品,若C能满足条件即可。(因为已经证明不存在刚好在W/2到W的物品,所以在1到W之间的物品间选择能实现的C除了能满足条件以外就只有小于W/2)。代码实现:#inclu

2020-11-18 20:14:25 87

原创 Codeforces C1. Binary Table (Easy Version) (#684 Div.2) (思维&模拟)

传送门题意: 有一个nm的01矩阵,每次操作可选其中22子矩阵的任意3个元素取反,要求将所有元素变成0,且操作次数在3nm以内(保证存在答案)。输出操作的总次数及每次操作对应的元素下标。思路: 分两个部分处理先暴力处理前(n-1)*m个位置,即每次把’1’放在正反L的’头’(即上一层单出来那个)。再单独处理最后一层,每次都看第j和j+1个位置。将是’11’型,'10’型和最后一个元素’01’型分类讨论。这样修改次数约为n*m+次(最后一行的操作次数较多)。代码实现:#include&

2020-11-18 19:46:25 98

原创 CodeforcesA. Array Rearrangment (思维 / 水题)

传送门题意: 给出两个数组a和b,将它们重新排序,如果满足每个a[i]+b[i] <= x则输出Yes,否则输出No。思维: 不难想到这肯定得最大的和最小的相匹配,所以一个数组升序一个数组降序再判断一下即可。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<int, int&g

2020-11-04 22:19:43 114

原创 Codeforces C. Circle of Monsters (思维贪心 / 前缀和)

传送门题意: 有n个怪兽围成一圈,第i个怪兽都有一个a[i]的生命值和一个b[i]的危害值。你只能选一个起点开始按准时针挨个击杀它们,每次击打伤害值为1。当某个怪兽的生命值<=0时就会爆炸对下一个怪兽产生b[i]的伤害,依次发生连锁反应。试问将所有怪兽击毙至少需要多少次攻击。思路:根据题意可知,只有挨着挨着按顺序击杀怪兽,而击杀所有怪兽的基本差值和是一定的,攻击次数主要取决于起点的选择。所有我们对起点进行枚举就好,记得在枚举是要先减去之前该点的差值再加该点的怪兽生命值a[i]。代码实现

2020-11-04 22:14:35 85

原创 CCPC 2020威海站 H. Message Bomb (差分&前缀和)

PTA重现赛入口题意: 有 n个组(初始都为空组), m个学生, s个事件。每次事件输入t, x, y。t == 1: 将学生x加入y组,保证之前不存在。t == 2: 将学生x从y组中删除,保证之前存在。t == 3: 学生x向y组中其他成员宣布一则事件。试求每个学生接收到的事件数。思路:直接利用前缀和与差分的思维处理组员数的变化带来的改变。数组 vg[i]表示第i组总共接收过的事件数,数组vs[i]表示第i个学生总共接收到的事件数,再利用m个set集合存 每个学生加入的队伍情况

2020-10-29 01:32:05 96

原创 Codeforces C. Array Splitting (Round 69 Rated for Div.2) (思维 / 贪心 | 差分)

传送门题意: 试图将一个非递减数列分成k段,使得每段的max-min的和最小,并求得最小值。思路:个人觉得是个贪心,过题后去看博客大多数都是差分思维。将所求的式子整理下就会发现每次的消耗都是每段的段尾减段首,而换个思维就是求 |整个数列的段尾减段首| 再减去期间k-1个缝隙的差的绝对值。那么我们就需要减经量多才会使得最后消耗min。于是我们将所有n-1个可能缝隙的差值排序,取绝对值前k-1大的数进行计算即可啦。代码实现:#include<bits/stdc++.h>#de

2020-10-27 01:41:05 71

原创 Codeforces B. Prime Square (#678 Div.2) (思维构造 / 素数与和数)

传送门题意: 需要你构造一个n*n的矩阵,满足其下三个条件:每个数都在1e5以内每个数都不是素数每一行或列的和都是个素数思路:刚开始一直在想简便的特殊方法,结果一直wa1,最后才想到数据范围这么小应该可以暴力尝试过了(′д` )…彡…彡。我们只需要找n个数满足其和是素数且每个数不是素数即可。那么我们让其中n-1个都是1,只需要再找到一个和数 x 满足 x+n-1 是个素数即可。后期构造的时候让x后移轮换即可。代码实现:#include<bits/stdc++.h>

2020-10-27 01:11:59 155

原创 Codeforces A. Reorder (#678 Div.2) (数学思维 / 水题)

传送门题意: 给出数列长度n与正整数m,试问该数列是否满足正好等于m,且除法过程中不是整除(即 5/2 == 2.5)。思路: 仔细观察不难发现其实该题问的就是是否数列和正好等于m。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<int, int>#define low

2020-10-27 01:01:26 100

原创 Codeforces C. Stripe (Round #18 Div.2 Only) (前缀和水题)

传送门题意: 看了半天没看懂那个平方数的意思,理解就是求有几种方法可以一刀将数组切成两半,使得左右两半的和相等。思路: 利用前缀和就很容易求得左右两段分别的和。代码实现:#include<bits/stdc++.h>#define endl '\n'#define ll long long#define int long long#define IOS ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);using namespac

2020-10-27 00:50:55 78

原创 Codeforces B. Barrels (Round 96 Rated for Div.2) (思维)

传送门题意: 现有n个无限大的杯子,第i个杯子中有a[i]升水。你有k次操作,每次能将一个杯子里的水倒入另一个杯子,试问k次操作结束后,含水量最大与最小之间的差值max为多少/思路: 水题嘛,意思搞那么复杂,不就是求前k大数的和咩。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<

2020-10-24 00:26:23 75

原创 Codeforces C. Numbers on Whiteboard (Round 96 Rated for Div.2) (思维 / 贪心)

传送门题意: 现有1到n的n个数字,需要进行N-1次操作,每次选出两个数a与b删除,并把 (a+b)/2新加入集合中。求最后只剩一个数时的最小值。思路: 用一个优先队列,每次取出最大的两个数,并把他们和的1/2上取整新加入集合。真没想到这样能行(#.#),神奇鸭。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#def

2020-10-23 17:25:14 77

原创 Codeforces E. Two Round Dances (#677 Div.3) (思维 / 暴力)

传送门题意: 求将偶数n (2 <= n <= 20) 个人排成两个圈的方法有多少种。思路: 排列组合问题,先组合数选出n/2个人,剩下的人也就确定了,再考虑两个圈的全排列。代码实现:#include<bits/stdc++.h>//#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<int, int>#define l

2020-10-23 16:43:17 81

原创 Codeforces A. Copy-paste (#673 Div.2) (思维)

传送门题意: 给你一个数列a,将a[i]的值加在a[j]上(i != j)且使得a[j] <= k。试问最多能操作多少次?思路: 找到一个最小的数一直作为加数,试其他n-1个数都不超过k即可。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<int, int>#def

2020-09-29 00:05:13 95

原创 Codeforces C. k-Amazing Numbers (#673 Div.2) (思维 / 区间枚举 / 最小前缀)

传送门题意: 给出一个序列a,试问对于 1~n 的所有k,是否所有k长度的连续区间里的数都有共同的数交集,并输出这个数集中的min,否则输出 -1.思路:考虑相同数之间最少需要多长的k才能都包含到。枚举一个数和序列开头,中间数之间的差,最后一个数和序列结尾。用一个ans[k]记录最少需要长度的k中最小的数字是哪个。ans[k]=min(ans[k],i)。最后再维护下ans的最小前缀即可。代码实现:#include<bits/stdc++.h>#define endl '

2020-09-28 23:36:35 177

原创 Codeforces D. Make Them Equal (#673 Div.2) (思维 / 构造)

传送门题意: 给出一个数列,你可对其进行3n次操作,每次将位置i的数值减去 ix (0<=x<=1e9),然后另外一个位置j加上 ix。试问是否能在3n次操作内将所有数变成一样的数。输出每次操作相应的 i, j, x.思路:由于要将数值均分,那么我们可以将所有权值加到同一个数上之后再来分配。第一遍n-1次操作,将 2~n 的 a[i] 变成i的倍数。(比赛的时候没有想到该操作,还以为这是不满足条件的,┭┮﹏┭┮)第二遍 n-1 次将 2~n的数值全部转移到a[1]上。第三遍n-

2020-09-28 21:45:39 116 2

原创 L. Working Plan (优先队列 & 贪心思维 & 课表安排) ICPC Seoul 2018

思路:现有m个人和n天的课表,要求安排一个可行方案,满足第j天有d[j]个人工作,第i个人总共工作w[i]天。且每个人一开始工作就必须连续工作w天,然后至少休息h天才能工作。如果有可行解第一行输出"1",然后输出m行,每i行含w[i]/w个数,表示第i个人每次工作的开头那天;无解直接输出"-1"。从头按顺序开始安排每一天工作的任选,首选工作量最大的且可以工作(既没有在进行上一次工作,也休息了至少h天;且后w天都需要人工作)的人。这个时候就用一个优先队列来存m个人的当前工作量情况,且用一个队列过渡。.

2020-09-05 22:06:00 32

原创 D. Go Latin (模拟 / 简单) ICPC Seoul 2018

思路: 就是那么个意思,就像英语单词的词性转换,模拟判断一下就好。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<int, int>#define lowbit(x) (x &(-x))#define ls(x) x<<1#define rs(x) (x.

2020-09-05 20:13:23 30

原创 J. Easy Integration (逆元 & 分部积分) 2020牛客暑期多校训练营(第一场)

传送门思路:题意就是给你n,让求出下下列式子的结果:很明显这就是数学方面的问题啦,这么菜的我在数学方面就更菜,反正最后看题解博客得知结果就是 (n)! / (2n+1)!。代码实现:#include<bits/stdc++.h>//#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<int, int>#define low

2020-09-05 16:58:44 38

原创 F. Infinite String Comparision (字符串 & 字典序) 2020牛客暑期多校训练营(第一场)

传送门思路:一般的思路无非就是模拟判断一下,当然就需要考虑到s和t的长度已经对应字符的字典序大小问题。但是我看见一篇大佬博客写得妙啊!代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<int, int>#define lowbit(x) (x &(-x))#

2020-09-05 16:38:28 30

原创 Codeforces1401D Maximum Distributed Tree (树dfs & 贪心)

传送门题意: 给出一棵n个点的树,想让给每条边赋值,使得所有边权的乘积为k。因为k非常大,所有将k拆分成m个因子,换而言之就是n-1条边权的乘积得等于m个因子的乘积。定义f(x, y)为点x到点y的简单路径所经过的所有边的权值和,现问怎么安排边权,才能让所有简单路径的 f 值和 (即下图所示公式)最大,并得到该max值。思路:若m < n-1,那么剩下的边用1来填充。dfs找到每条边的经过次数,然后贪心一下将大的因子赋值给经过次数最多的边贡献就最多。至于经过次数的计算,可以将 u -

2020-09-02 23:22:02 38

原创 Codeforces D Rarity and New Dress (二维dp & 菱形寻找)

传送门题意: 给出n*m的矩形,相同字符的表示同一种颜色,找出矩阵中有多少个斜正方形(如下图所示)。思路:设dp[i][j]表示(i,j)为止以上能最多得到的"斜正方形",答案就是所有位置的dp值之和。而对于位置(i,j),只需要考虑(i-1,j-1),(i-1,j),(i-1,j+1),(i-2,j)位置是否与其同色。若同色则(i,j)位置构成一个图形,直接dp[i][j]=1。反之就dp[i][j] = min(dp[i-1][j-1],dp[i-1][j+1],dp[i-2][j])+

2020-08-30 00:04:48 37

原创 Codeforces E1. Weights Division (easy version) (树dfs & 边的利用次数)

传送门题意: 给定一棵以 1 号点为根的带权有根树。每次可选择一条边将其边权除以2(下取整),试问至少经过多少次选择,才能使得所有根节点到叶子节点的路径权值和不超过S?思路:利用有限队列每次选择权值最大的边处理,直到sum <= S。(我只想得到这么多了,莫得法太菜了呜呜呜。细节部分还一直处理不好,嗐。)看了大佬博客才知道,原来还得将经过次数和权值分别存取,如果直接存cnt*val会有错(这个在大佬2博客中有提到)。大佬1博客代码比较简洁清晰,大佬2博客思路比较详细。代码实现:#i

2020-08-29 22:47:42 35

原创 Codeforces E. Tree Queries (树 & dfs & 特定路径判断)

传送门题意: 给你一个以 11 为根的有根树。每回询问 k 个节点v1 ,v2 ⋯vk。​求出是否有一条以根节点为一端的链使得询问的每个节点到此链的距离均≤1.只需输出可行性, 无需输出方案.思路:这棵树以 1 为根,那么,这条路径要么经过给定点,要么经过给定点的父亲,要么经过给定点的至少一个儿子。这时我们发现,经过以上三种点都必须经过给定点的父亲,于是我们就把题面转化为了:给定若干个点,求是否有一条从 1 开始的路径经过这些点。按照深度排序后依次判断后一个点是否在前一个点的子树内即可。

2020-08-23 00:26:20 42

原创 Codeforces C. Uncle Bogdan and Country Happiness (树型递推)

传送门题意: 给出一颗根节点为 1 的树,对于每个节点 i,有 p[i] 个人的家在节点 i 上。一开始所有人都在根节点上,然后每个人会往家沿着最短路走。每个人出发时有一个心情,可能是好心情也可能是坏心情,在经过一条边时,心情可能由好变坏,但是不可能由坏变好。每个点有一个幸福检测器,最后的检测结果为:所有经过该节点的人中,好心情的人数减坏心情的人数。现在给出每个 h[i] ,问有没有可能最后每个节点的检测结果恰好为 h[i] 。思路:刚开始看完题就一头懵,有点点思路但还是太菜,码力不得行啊。

2020-08-22 21:26:12 53

原创 Codeforces D. Maximum Distributed Tree (树dfs & 边的利用次数)(Round #665 Div.2)

传送门题意: 给出一棵n个点的树,想让给每条边赋值,使得所有边权的乘积为k。因为k非常大,所有将k拆分成m个因子,换而言之就是n-1条边权的乘积得等于m个因子的乘积。定义f(x, y)为点x到点y的简单路径所经过的所有边的权值和,现问怎么安排边权,才能让所有简单路径的 f 值和 (即下图所示公式)最大,并得到该max值。思路:比赛的时候相叉了,后面快结束了才行到 idea, 但对树的相关操作不熟就这么错过了上高分分的机会,呜呜太菜了~若m < n-1,那么剩下的边用1来填充。dfs找

2020-08-22 19:48:02 88

原创 Codeforces A. Distance and Axis (思维 / 暴力) (Round #665 Div.2)

传送门题意: 在坐标轴OA上找到一个点B,使得| |OA| - |OB| | == k。若无法等于k,就将A向左后右移动一个单位,试问最少经过多少次操作可以找到符合条件的B点。思路:简单粗暴点,可直接先将B点放在原点位置。若 |OA| == k,那么可以直接选择原点(或二倍A点的位置)为B,操作数为0。若 |OA| < k,那么将A加到k即可。若 |OA| > k,就需要在OA间安插B点的操作数比较少,且若 n-k为奇数,还需要将A向右移动一步即可。代码实现:#inclu

2020-08-22 17:55:21 67

原创 Codeforces B. Ternary Sequence (思维 / 贪心) (Round #665 Div.2)

传送门题意: 给出两个只由0,1,2组成的数组a,b;可通过一种计算规则得到相应的数组c:c[i] = a[i]*b[i] , a[i] > b[i]c[i] = 0 , a[i] == b[i]c[i] = -a[i]*b[i], a[i] < b[i]现可将a,b进行特定的排序,使得sum©得到最大值,并求出该max。思路:正贡献(+2)的情况,a[i] > b[i],那么就要认a中的2尽量多的对应b的1.无贡献的情况,a[i]

2020-08-22 17:34:35 738

原创 Codeforces C. Mere Array (思维 / gcd) (Round #665 Div.2)

传送门就先不说了,咱先上代码,明早再来写思路吧。#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<int, int>#define lowbit(x) (x &(-x))#define ls(x) x<<1#define rs(x) (x<<1+1)#d

2020-08-22 01:18:17 75

原创 Codeforces D. Secret Passwords (并查集 / 字符串分组)

传送门题意: 给定n个字符串。如果存在一个或多个字母同时在字符串a和b中出现, 这a和b就被分在同一组如果a和c在同一组 b和c在同一组, 则aa和bb也在同一组问所有的字符串最后被分成几组?思路:基本原理:利用并查集维护下字符集合。把每一个字母当成一个点,对于每一个给出的字符串,把字符串中的所有字母之间都连上边。这样,若两个字符串有公共的字母,他们就一定在一个连通块内,最后求出连通块个数就是答案。代码实现:#include<bits/stdc++.h>#defin

2020-08-22 01:06:09 48

原创 Codeforces E. Tree Painting (树形dp & 换根)

传送门题意: 给定一棵有 n 个结点的无根树,所有结点都是白色的。第一次操作可以随意使一个结点染成黑色,之后每次操作可以使一个与黑色结点相邻的白色结点变成黑色。每次操作可以获得的权值为被染成黑色的白色结点所在的白色连通块的结点数量。求可以获得的最大权值。思路:最开始我以为选哪儿都一样,都是n到1的和,后面才知道是俺太菜了。只要确定第一个黑点后权值就确定了,所以这就是个选择根节点的树形dp题。但显然如果要每个节点都dfs求答案绝对超时,于是需要推算下换根公式预处理下。这里可以参考大佬博客,讲得

2020-08-21 22:26:41 45

原创 P3379 【模板】最近公共祖先(LCA)

传送门思路:所谓LCA即两点的最近公共祖先,暴力的思维当然是一步一步往上爬寻找相交的第一个祖先,但这么暴力显然会超时。这个时候就可考虑以2的倍数来加速向上爬,且是从……32,16,8,4,2,1这样从大往小的选择跳跃步数(这样方便对大数悔棋)。大概操作即先爬最深的点x,让x与y位于同一深度时再开始一起往上爬。首先要记录各个点的深度和他们 2^i 级的的祖先,用数组d表示每个节点的深度,用 fa[i][j] 表示节点 i 的 2^j 级祖先。具体思路操作参考大佬博客,真的超详细,超nice!

2020-08-21 01:26:52 36

原创 Codeforces E. 1-Trees and Queries (树 & LCA & 定长路径)

传送门题意: 给定一个含有n个节点的树(相邻两点间的距离为1),以及q个询问。每一个询问给出5个整数:x,y,a,b,k。指如果像树中的x节点和y节点之间加一条边,问是否存在一条路径从a到b长度为k的路径?(注:每一次询问添加的边不会互相干扰,即只在该次询问有效)思路:首先我们看a与b之间的连通性,有三种有意义的最短路径L:a -> b,即不需要x与y之间的边a和b也能连通,距离记录为dist_ab。a -> x -> y -> b,记作dist_axyb。a

2020-08-21 00:37:09 37

原创 Codeofrces C. Omkar and Waterslide (模拟 / 暴力) (Global Round 10)

传送门题意: 给出一个序列a,每次可以选择一个非递减序列将每个元素+1,试问将整个元素变成非递减需要多少次操作?思路: 简单的模拟题,直接找到每次出现降低地方非递减序列中的min取操作数即可。代码实现:#include<bits/stdc++.h>//#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<int, int>#defin

2020-08-19 23:46:39 76

原创 Codeforces E Necklace Assembly (暴力 / 循环因子)

传送门题意: 店铺里有n颗珠子,现让你串一条最长的项链,满足将项链逆时针旋转 k 个位置后依然和原位置一样(被定义为k-beautiful项链)。思路:首先最小的答案是最大的字符个数,然后考虑项链中字符不全相等的情况。如果环转k的因子次是美的,那么k次也一定是美的,那么k也一定是美的。设某个字母有x个,x/循环节个数就是该字母能填充的循环节长。把所有字母填充的循环节长加起来,如果大于循环节长度就是符合的。代码实现:#include<bits/stdc++.h>#define

2020-08-19 23:30:20 46

原创 Codeforces E. Polygon (思维 / 判断)

传送门题意: 对于一个n* n的一个全为0的初始矩阵,矩阵上方和左侧均有一排炮台,矩阵的下侧与右侧是边界。炮台可以发射子弹,子弹只能直线行走,且遇到边界后会停止,遇到一个停止的子弹也会停止,子弹停止后的坐标里面的值记为1。现给出一个结果矩阵,试问是否可以由初始矩阵(全为0)通过炮台打出来;能则输出“YES”,否则输出“NO”。思路: 很简单的思维题,显然对于边界上的炮弹是一定可以打到的,而对于中间的炮弹必须满足其下方或右侧有停留的炮弹即可。代码实现:#include<bits/stdc+

2020-08-19 21:43:05 40

原创 Codeforces F. Maximum White Subtree (树形dp)

传送门题意: 给定一棵 n 个节点无根树,每个点都有一个颜色,非黑即白。现在问对于每个点 i 而言,选出一个 包含i的 连通块,使其白色点与黑色点的个数差最大(注意不是绝对值)。1 ≤ n ≤ 2e5 ,0 ≤ a[i] ≤ 1 (a[i]为0表示黑色,为1表示白色) 。思路:因为我们需使cntw-cntb尽量大,可设定每个白色节点贡献值为1,黑色节点贡献值为-1。这样就转换成两次dp求出最大子连通块的权值和,分别为自底向上和自顶向下。自底向上的话可直接维护dp[ i ],表示以点 i 为根

2020-08-19 00:02:52 63 2

原创 Codeforces C. Ehab and Path-etic MEXs (树 / 构造 / MEX)

传送门题意: 给定一个 n 个节点 n−1 条边的树,要求给边重新标注边权,分别为 0,1,2…n-20,1,2…n−2 。然后使得树上任意两点 u,v的 MEX(u,v) 的最大值最小。MEX(u,v) : u 到 v 的简单路径没有出现的自然数中最小的数。思路:当这棵树是一条链时,便可随机构造,ans(min)都是n-2。会发现无论如何构造,边权为 0,1 的两条边总能出现在某条路径上;所以我们只需要考虑如何使得边权为 0,1,2 的三条边不同时出现在某一路径上。因为当这棵树不为一条链时

2020-08-18 22:32:37 51

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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