贪心
mayaohua2003
这个作者很懒,什么都没留下…
展开
-
Codeforces gym 101242 F
想了很久才会。这里实际上给出了一棵带权有根树,我们需要给每个点分配一个重儿子,使每个叶子得到一条链。令第iii条河流对应点到根深度为did_idi,显然它的答案为n−f(di)+1n-f(d_i)+1n−f(di)+1,其中f(di)f(d_i)f(di)为最多能分配出的长度≤di\leq d_i≤di的链数目。令S(i)S(i)S(i)为f(i)f(i)f(i)对应的某个方案中所选的≤i\leq i≤i的链的叶子集合。我们断言,对于∀j≥i\forall j\geq i∀j≥i,一定存在某个方原创 2020-12-25 22:34:31 · 363 阅读 · 0 评论 -
Codeforces gym 101239 G
被打爆了,看了claris的题解才会。考虑最终我们想要怎么样的结构:显然我们会从v2v_2v2开始,每ttt长度划一段(最后一段可能不满)。我们可以将模型转化为询问所有相邻两段的分界点,每个时刻可以询问若干个,使得询问时间形成一棵分治树,且对于每个分界点xxx,我们需要在它对应的速度到达lll之前或同时刻询问,否则之后我们会无法区分x−ϵx-\epsilonx−ϵ和x+tx+tx+t了。我们考虑枚举答案kkk。令rkr_krk表示到第kkk次询问我们还需要区分[v1,rk][v_1,r_k][v1原创 2020-12-25 22:00:58 · 258 阅读 · 0 评论 -
Codeforces gym 101612 H
问题相当于最大化最终树的最大匹配。考虑我们如果确定了一个加入连通块的顺序,使每个连通块的根节点指向之前连通块的某个节点。那么每次加入的新连通块如果原本的最大匹配必定包含根节点,显然加入后不会有额外的增量,随便找一个点作为父亲即可;否则如果之前连通块还有不在最大匹配中的节点(也即最大匹配不满),我们将它作为当前连通块根的父亲,可以有额外111的增量。那么现在算法就很明显了,我们显然会优先加入那些最大匹配必定包含根节点的连通块,然后加入那些没被匹配的点数>1>1>1的连通块,最后加入没被匹原创 2020-12-24 12:07:13 · 206 阅读 · 0 评论 -
Codeforces Round 1344 简要题解
A. Hilbert’s Hotel略B. Monopole Magnets略C. Quantifier Question略D. Résumé Review设f(i,x)f(i,x)f(i,x)(0≤x<ai0\leq x<a_i0≤x<ai)表示bib_ibi由xxx变为x+1x+1x+1答案的增量,那么有fi(x)=(x+1)(ai−(x+1)2)−x(ai−x2)=−3x2−4x+(a−1)f_i(x)=(x+1)(a_i-(x+1)^2)-x(a_i-x^2)=-原创 2020-05-26 16:00:01 · 365 阅读 · 0 评论 -
Codeforces Round 1329 简要题解
爆炸的一场,掉分掉傻了。A. Dreamoon Likes Coloring略B. Dreamoon Likes Sequences略C. Drazil Likes Heap被一个div1C题彻底打爆了。注意到我们对一个权值当前所在的点调用fff后,这个权值就被删去了。但是如果直接删去最大的2h−2g2^h-2^g2h−2g个权值,可能导致最后剩下的不是完全二叉树。换个角度,我们考...原创 2020-04-05 11:47:11 · 564 阅读 · 0 评论 -
Atcoder agc040简要题解
补一下最近几场的agc。A - ><略B - Two Contests略C - Neither AB nor BA先考虑没有′C′'C'′C′的情况。注意到如果存在多对′AA′'AA'′AA′或′BB′'BB'′BB′且有解,随便消去一对都可以得到一组合法解。那么考虑将2k−12k-12k−1和2k2k2k分一组,如果相同直接消掉,易证有解当且仅当剩下的′AB′'AB'′A...原创 2020-04-03 11:53:37 · 950 阅读 · 0 评论 -
Codeforces Round 1305简要题解
A:略B:略C:略D:略E:考虑选择合适的kkk,先填111到kkk,补一个k+1k+1k+1到2k2k2k之间的数凑出mmm,剩下部分补上很大的数。#include <bits/stdc++.h>using namespace std;int sum[100005],id[100005];int f[10005];int main() { int n,m;...原创 2020-03-07 14:24:14 · 291 阅读 · 0 评论 -
Atcoder arc102F
完全不会的神仙结论题。我们称一次操作iii是将pi−1,pi,pi+1p_{i-1},p_i,p_{i+1}pi−1,pi,pi+1翻转(pi−1>pi>pi+1p_{i-1}>p_i>p_{i+1}pi−1>pi>pi+1)。首先可以发现一个性质,如果我们做了操作iii,那么永远不可能再做操作i−1i-1i−1或i+1i+1i+1了。考虑反证,...原创 2020-03-05 13:29:05 · 350 阅读 · 0 评论 -
Codeforces 626G
注意到在同一堆中放彩票的贡献是单调递减的,因此如果没有修改,可以用堆贪心求出最大期望收益。考虑修改操作,如果将lkl_klk减小111,在第kkk堆放的数目可能不变,减小111(原先放了lkl_klk张),或是增加若干张。我们断言若增加,只会增加111张,证明是假设原先放了ccc张,现在若放了c+2c+2c+2张以上,那么第c+2c+2c+2张一定替换了其他堆的某张彩票,设那张彩票的贡献为w...原创 2020-03-05 13:09:31 · 326 阅读 · 0 评论 -
Atcoder agc027F
先考虑至少有一个点未操作的情况。我们枚举一个未操作的点rtrtrt,令AAA和BBB以rtrtrt为根,那么需要操作的是在AAA和BBB中父亲不同的点,且合法必须满足未操作的点在两棵树分别形成与rtrtrt相连的连通块。如何判定是否可行呢?考虑我们操作一个点的时候它必须是叶子,于是对于一个需要操作的点,它在AAA中的儿子必须比它先操作,在BBB中的儿子必须比它后操作,用拓扑排序判定即可。再考虑所...原创 2020-03-05 11:40:50 · 296 阅读 · 0 评论 -
Atcoder agc029C
简单题。考虑二分答案后判定,从前往后处理,每次肯定会贪心取能取的字典序最小串,用栈维护进位即可。时间复杂度O(nlogn)\mathcal O(n\log n)O(nlogn)。#include <bits/stdc++.h>#define FR first#define SE secondusing namespace std;typedef pair<in...原创 2020-03-05 10:05:24 · 326 阅读 · 0 评论 -
Atcoder agc036E
不会做的好题。先将连续的相同字符缩起来。不妨设这样得到的SSS中,出现次数按降序排列为AAA,BBB和CCC,显然这样答案的上界是3⋅C3\cdot C3⋅C的出现次数。设CCC有kkk个,那么中间有k−1k-1k−1个非空的仅含交替的ABABAB的段,两端还各有一个可以为空的仅含交替的ABABAB的段。若AAA和BBB出现次数相同,我们发现我们可以每次删掉一对相邻的ABABAB或BABABA...原创 2019-12-11 09:01:19 · 317 阅读 · 0 评论 -
Atcoder agc026E
对于第iii组匹配的aaa和bbb,我们可以将按位置将它们称为(pi,qi)(p_i,q_i)(pi,qi)。将原序列中的aaa看做111,bbb看做−1-1−1,那么前缀和为000的位置就将序列分为了若干段。显然每组pip_ipi和qiq_iqi都在同一段中,且同一段中相应的pip_ipi和qiq_iqi的大小关系不变。我们称pi>qip_i>q_ipi>qi...原创 2019-12-10 20:12:22 · 286 阅读 · 0 评论 -
Atcoder arc095F
考虑逆排列p−1=qp^{-1}=qp−1=q,那么就是对于∀1<i≤n\forall 1<i\leq n∀1<i≤n,qiq_iqi与maxj=1i−1qj\max_{j=1}^{i-1}q_jmaxj=1i−1qj间连了一条边。那么容易发现连出来的树是一个毛毛虫的形状,其中主链上的点是所有qqq的前缀最大值。那么显然将给定的树的直径拿出来贪心算一下即可,注意q1q_...原创 2019-12-06 19:25:16 · 225 阅读 · 0 评论 -
Atcoder agc028C
考虑将所有的AAA和BBB从小到大排序。若前nnn小中全部都是AAA或全部都是BBB容易构造达到下界。否则若同时存在某个AiA_iAi或BiB_iBi也可以构造达到下界(同时存在AiA_iAi和BiB_iBi的iii的个数等于同时不存在AiA_iAi和BiB_iBi的iii的个数,那么我们可以在环上交替放两种数,最后将剩余的只存在AiA_iAi或只存在BiB_iBi的数插在它们之...原创 2019-12-01 16:49:23 · 263 阅读 · 0 评论 -
Codeforces 521D
对于每种技能,我们执行操作的顺序显然是111->222->333,并且最多做一个111操作(做的话会做最大的那个),那么就可以把111操作转化为222操作了。然后将每种技能iii的222操作从大到小排序,设排序后第jjj个操作的权值为bi,jb_{i,j}bi,j,那我们显然会选一个前缀执行。于是我们可以将222操作转化为333操作,具体的,我们可以将第jjj个操作变为乘上ai+∑...原创 2019-12-01 16:39:33 · 236 阅读 · 0 评论 -
Atcoder agc023F
考虑相邻交换的思想,对于两个相邻的段xxx和yyy,若它们交换后仍然合法且s1x⋅s0y≤s1y⋅s0xs1_x\cdot s0_y\leq s1_y\cdot s0_xs1x⋅s0y≤s1y⋅s0x,我们交换它们后答案不会变劣。现在对于树上的情况,我们取出目前没有被选且s1s0\frac {s1}{s0}s0s1最小的连通块,若它的根的父亲已经被选,我们就选了它,否则容易证明它一定会...原创 2019-12-01 16:14:06 · 407 阅读 · 0 评论 -
Atcoder agc024D
注意到若两个点为根的树深度不同一定不同构,因此答案的下界为⌈d2⌉\lceil \frac{d}{2}\rceil⌈2d⌉(ddd为直径长度),并且容易达到下界。若ddd为偶数,我们取原树的中心(直径的中点,在边上)为midmidmid,容易证明以midmidmid为根后,任意一层的点都需要儿子数目相同,于是根据原树可以得到每一层儿子数目的下界,容易求出最小叶子数目。若ddd为奇数也类似,不...原创 2019-11-26 22:08:48 · 262 阅读 · 0 评论 -
Codeforces 526G
这题之前被搬过。考虑以xxx为根,那么我们显然会选kkk个叶子(kkk的值取决于xxx是否是叶子),使得它们到xxx的路径的并长度最大。容易证明一个正确的贪心是以xxx为根做长链剖分后取前kkk大的链。但是这样复杂度太高了,注意到我们一定会选直径的一端。那么我们分别以直径两端建树,取答案的max\maxmax,求出依次选择的方案,如果前kkk大的链覆盖了xxx,那么答案显然一致,否则我们会在...原创 2019-11-23 21:40:19 · 490 阅读 · 0 评论 -
Atcoder agc020D
最大间隔显然是k=⌈max(Ai,Bi)min(Ai,Bi)+1⌉k=\lceil \frac{\max(A_i,B_i)}{\min(A_i,B_i)+1} \rceilk=⌈min(Ai,Bi)+1max(Ai,Bi)⌉。为了达到字典序最小,我们显然会有一个前缀满足交替连续放kkk个AAA后放一个BBB这样的模式(即使是Ai<BiA_i<B_iAi<Bi也...原创 2019-11-23 21:27:22 · 255 阅读 · 0 评论 -
Atcoder agc030E
神仙题。我们可以在000和111之间画一条蓝线,111和000之间画一条红线,开头和结尾都有无限交替的红蓝线,那么两个串相等等价于它们对应的红蓝线相等。我们每次可以移动一条红线或蓝线,要求移动后仍满足串中间相邻的红蓝线距离为111或222。那么我们就可以枚举两个串红蓝线之间的对应关系,对于一组对应关系,下界显然是对应的线之间的距离之和。我们断言下界是可以达到的,大概构造是考虑从左往右第一对不重...原创 2019-11-13 21:23:39 · 274 阅读 · 0 评论 -
Atcoder arc097F
显然如果一个叶子是黑色的,我们一定不会经过它。于是我们可以不断地剥叶子直到所有叶子均为白色,那么我们会经过起点到终点上的边恰好一次,其他边不同方向经过两次。假设我们经过所有的边两次,那么每个节点会自动被反色度数次,不妨设第iii个点此时的颜色为cic_ici。起点到终点路径上的点除了终点以外都会少反色一次,因此如果起点到终点路径上(不包括终点)某个点的cic_ici为白可以减小222的答案,...原创 2019-11-10 23:30:45 · 238 阅读 · 0 评论 -
Codeforces 671D
被n=1n=1n=1的corner case卡了。。。容易想到对子树DP,我们可以设F[i][j]F[i][j]F[i][j]表示只考虑iii子树内的路径,用它们完全覆盖了iii这个子树,并且最远向上延伸到的深度为jjj。注意到转移的时候我们会继承一个子树中的jjj,然后加上覆盖其他子树的最小代价。因此我们可以用可并堆来维护FFF(以FFF的值为关键字),dfs回溯的时候弹出jjj过大的点,就...原创 2019-11-10 23:09:54 · 2396 阅读 · 0 评论 -
Atcoder agc037E
考虑为了字典序最小,我们肯定会先尝试在前面放SSS中最小的字符ccc。我们考虑SSS中所有ccc的极长连续段,如果存在某个不在最后的段长度为LLL,且L∗2k−1≥nL*2^{k-1}\geq nL∗2k−1≥n的话可以构造出全ccc的串,否则有唯一的方法用这个段构造出前L∗2k−1L*2^{k-1}L∗2k−1位都为ccc的串,具体就是先把串翻转一遍,将这个段放到最后,然后第222~k−2k-...原创 2019-11-07 19:46:00 · 225 阅读 · 0 评论 -
Atcoder agc023D
又被神题制裁了。想到了一个策略,结果和正解有偏差,交上去过了一半的点,还以为是写挂了看了半天。。。考虑111号点和nnn号点,一般的,假设X1<SX_1<SX1<S,Xn>SX_n>SXn>S。不妨设P1<PnP_1<P_nP1<Pn,这样我们发现对于111来说,它一定会在nnn之后被送回家,它肯定希望nnn尽早被送回家,然后车就会直...原创 2019-11-03 22:08:02 · 364 阅读 · 0 评论 -
Atcoder agc032E
当时打这场的时候没开,有点亏。考虑两个相交的匹配,我们可以证明交换后一定不会变劣。这个讨论一下就好了。于是我们只讨论匹配相离和包含的情况。然后我们分开考虑加起来<M<M<M和≥M\geq M≥M的,我们发现如果有两个相离的匹配,变成包含的话与MMM的大小关系不变,并且不会变劣。于是可以发现我们最后选的方式一定是分成两部分,前面2k2k2k个和后面2(n−k)2(n-k)2(...原创 2019-11-03 22:00:32 · 281 阅读 · 0 评论 -
Codeforces 506C
神题,对着cty的题解写的。那篇题解已经写得很好了,这里只做一点解释,考虑先算出每一刀允许砍的最早时间,那么可以证明其他刀砍的时间不会有影响,也就是每一刀之间是无关的,只有一个砍的时间的下界,于是直接贪心就行了。#include <bits/stdc++.h>#define last last2 using namespace std; typedef long long...原创 2019-11-02 20:09:41 · 256 阅读 · 0 评论