
codeforces
文章平均质量分 74
丰川样子小孩姐
阿里嘎多扩赛以马斯
展开
-
【题解】CF1213G:Path Queries
原题传送门这个题目就比较套路了此前做过三个比较相似的题目就是并查集的同时维护一些信息,这题只要维护结点个数按照边从小到大连对于目前一条(x,y,l)(x,y,l)(x,y,l),找到xxx的祖先s1s1s1,yyy的祖先s2s2s2,ansl+=sizes1∗sizes2ans_{l}+=size_{s1}*size_{s2}ansl+=sizes1∗sizes2Code:#include <bits/stdc++.h>#define maxn 200010#define原创 2020-10-20 16:47:37 · 253 阅读 · 0 评论 -
【题解】CF1154D:Walking Robot
原题传送门贪心模拟分类讨论如果蓄电池没电了,那么肯定走干电池,如果走到一条1线段,蓄电池电量可以+1如果蓄电池还有电,那么如果干电池没电,或者下一条线段为0,又或者蓄电池目前满电,走蓄电池,否则才走干电池Code:#include <bits/stdc++.h>#define maxn 200010using namespace std;int n, a, b, c;inline int read(){ int s = 0, w = 1; char c = getc原创 2020-10-20 16:30:56 · 158 阅读 · 0 评论 -
【题解】CF1175C:Electrification
原题传送门二分最优值,然后O(n)O(n)O(n)验证对于每个iii,就是看[i,i+k][i,i+k][i,i+k]这段区间能不能达到这个最优值就是[ai+k−ai+12]<=mid[\frac{a_{i+k}-a_i+1}{2}]<=mid[2ai+k−ai+1]<=mid,可行的话,答案就是[ai+k+ai+12][\frac{a_{i+k}+a_i+1}{2}][2ai+k+ai+1]Code:#include <bits/stdc++.h>#d原创 2020-10-19 09:16:35 · 248 阅读 · 0 评论 -
【题解】CF1157B:Long Number
原题传送门根据字典序的方便性质找到第一个可以更优的就换换到第一个会更劣的为止Code:#include <bits/stdc++.h>#define maxn 200010using namespace std;int n, a[maxn], b[maxn];inline int read(){ int s = 0, w = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') w原创 2020-10-19 08:54:54 · 261 阅读 · 0 评论 -
【题解】CF1143B:Nirvana
原题传送门数位dpdpi,0/1dp_{i,0/1}dpi,0/1表示第i位,是否退位了dpi,0=dpi−1,0∗aidp_{i,0}=dp_{i-1,0}*a_idpi,0=dpi−1,0∗aidpi,1=max(9dpi−1,1,dpi−1,0∗(ai−1))dp_{i,1}=max(9dp_{i-1,1},dp_{i-1,0}*(a_i-1))dpi,1=max(9dpi−1,1,dpi−1,0∗(ai−1))可以把第一维弄掉然后初始化dp0=a1,dp1=max(1,原创 2020-10-18 14:15:16 · 207 阅读 · 0 评论 -
【题解】CF1131C:Birthday
原题传送门套路贪心先排序,成为一个有序数列a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an像这样子摆放,如何证明正确性呢首先可以感性得知,如果是最优解,那么任意交换两个数的位置肯定比最优解劣那么如果一种方案可以使得无法交换两个数来更优,那么这种方案是不是最优的,我觉得是的所以可以任意交换,比如交换a4,a6a4,a6a4,a6,那么这一部分的最大值从max(a8−a6,a6−a4,a4−a2)max(a8-a6,a6-a4,a4-a2)max(a8−a6,a原创 2020-10-18 13:56:03 · 176 阅读 · 0 评论 -
【题解】CF933A:A Twisty Movement
原题传送门就是按顺序先找一段全是1的子序列,再找一段全是2的子序列,再找一段全是1的子序列,再找一段全是2的子序列这样我们就找出了一段诸如111122221111222111122221111222111122221111222的子序列,把第二段和第三段翻转,得到111...111222...222111...111222...222111...111222...222,就是答案就是找出长度最长的四段和令sum1isum1_isum1i表示前缀1的个数sum2isum2_isum2i表示后缀2原创 2020-10-18 10:41:51 · 286 阅读 · 0 评论 -
【题解】CF547B:Mike and Feet
原题传送门求出每个点向左延伸到lil_ili,向右延伸到rir_iri表示aia_iai是ali到aria_{l_i}到a_{r_i}ali到ari最小的对于ansri−li+1=max(ansri−li+1,ai)ans_{r_i-l_i+1}=max(ans_{r_i-l_i+1},a_i)ansri−li+1=max(ansri−li+1,ai)ansi=max(ansi,ansi+1)ans_i=max(ans_i,ans_{i+1})ansi=max(ansi原创 2020-10-05 09:19:12 · 222 阅读 · 0 评论 -
【题解】CF993D:Compute Power
原题传送门01分数规划∑a∑b<=mid\frac{\sum a}{\sum b}<=mid∑b∑a<=mid∑a<=mid∗∑b\sum a<=mid*\sum b∑a<=mid∗∑bwi=ai−mid∗biw_i=a_i-mid*b_iwi=ai−mid∗bi问是否存在∑wi<=0\sum w_i<=0∑wi<=0先根据aaa从大到小分组,相同的aaa一组,组内按照bbb升序这样满足严格小于的那个条件可以dpi,jdp_{i原创 2020-09-20 11:12:24 · 237 阅读 · 0 评论 -
【题解】CF922E:Birds
原题传送门这是一道背包问题dpidp_idpi表示共打了iii只鸟剩余最大魔法值每次走一棵树,所有dpdpdp值+X+X+X每次把鸟看成物品,二进制拆分做01背包Code:#include <bits/stdc++.h>#define maxn 1010#define maxm 10010#define LL long longusing namespace std;LL W, B, X, cost[maxn], power[25], c[maxn], dp[maxm],原创 2020-09-18 21:32:20 · 269 阅读 · 0 评论 -
【题解】CF915D:Almost Acyclic Graph
原题传送门如果枚举删边,然后拓扑判环,会小T一点然后发现其实可以枚举哪个点入度-1,在判环,等价于删边优化到了O(n2)O(n^2)O(n2)Code:#include <bits/stdc++.h>#define maxn 500010using namespace std;struct Edge{ int to, next;}edge[maxn << 1];int num, head[maxn], d[maxn], deg[maxn], n, m, flag原创 2020-09-17 21:32:36 · 162 阅读 · 0 评论 -
【题解】CF906C:Party
原题传送门状压01状态中所有1表示互相认识staista_istai表示初始iii的交际圈,如果iii在状态JJJ中,可以直接把staista_istai的状态直接并入JJJ,表示选择iii,把他认识的人都互相认识一遍然后记录路径,idJid_JidJ表示该状态是通过选择idJid_JidJ这个人来的,preJpre_JpreJ表示上个状态Code:#include <bits/stdc++.h>#define maxn 5000010#define maxm 25u原创 2020-09-16 21:26:33 · 275 阅读 · 0 评论 -
【题解】CF915F:Imbalance Value of a Tree
原题传送门∑i=1n∑j=1nI(i,j)\sum_{i=1}^{n}\sum_{j=1}^{n}I(i,j)∑i=1n∑j=1nI(i,j)=∑i=1n∑j=1nMax(i,j)−∑i=1n∑j=1nMin(i,j)=\sum_{i=1}^{n}\sum_{j=1}^{n}Max(i,j)-\sum_{i=1}^{n}\sum_{j=1}^{n}Min(i,j)=∑i=1n∑j=1nMax(i,j)−∑i=1n∑j=1nMin(i,j)分别算出两部分的值,考虑并查集合并对于一条边,这条原创 2020-09-10 21:18:23 · 297 阅读 · 0 评论 -
【题解】CF455C:Civilization
原题传送门对于两个连通块连起来,肯定是在两个直径中点之间连一条边使得新的直径最短并查集维护连通性,同时记录连通块的直径大小令两个连通块的直径分别为lens1>lens2len_{s1}>len_{s2}lens1>lens2则新的直径是max(lens1,lens1+12+lens2+12+1)max(len_{s1},\frac{len_{s1}+1}{2}+\frac{len_{s2}+1}{2}+1)max(lens1,2lens1+1+2lens2+1+1)原创 2020-09-09 21:20:41 · 248 阅读 · 0 评论 -
【题解】CF813C:The Tag Game
原题传送门分别以A,BA,BA,B为起点遍历一遍求出树上各点与A,BA,BA,B的距离disai,disbidisa_i,disb_idisai,disbiBBB希望久一点,AAA希望快一点那么枚举点iii,若disbi>=disaidisb_i>=disa_idisbi>=disai,说明之前BBB肯定被AAA抓到了所以对于所有的disbi<disaidisb_i<disa_idisbi<disai,答案是max(2disai)max(2disa_i原创 2020-09-03 21:29:52 · 210 阅读 · 0 评论 -
【题解】CF238C:World Eater Brothers
原题传送门大意是改变最少的边的方向使得选两个点,能遍历完整棵树考虑枚举两个起点。对于一个起点,用树形dp计算出dpudp_udpu表示以uuu为根的子树的答案然后若以uuu作为真正的起点,那么答案就是dpudp_udpu如果选择uuu子树中的某个点vvv作为起点,那么答案是dpu−(u−>v反向的边)+(u−>v正向的边)dp_u-(u->v反向的边)+(u->v正向的边)dpu−(u−>v反向的边)+(u−>v正向的边)发现所以维护−(u−>v原创 2020-09-03 21:25:20 · 217 阅读 · 0 评论 -
【题解】CF538F:A Heap of Heaps
原题传送门按照权值从小到大排序找的是儿子中小于自己的有几个,这样我们就顺着枚举,满足权值递增,用树状数组维护个数,对于一个xxx,kkk叉树,儿子区间为[xk+1−k,xk+1][xk+1-k,xk+1][xk+1−k,xk+1]注意要稳定排序Code:#include <bits/stdc++.h>#define maxn 200010using namespace std;struct data{ int val, id;}a[maxn];int tree[maxn],原创 2020-09-02 20:21:53 · 260 阅读 · 0 评论 -
【题解】CF587C:Duff in the Army
原题传送门注意a<=10a<=10a<=10可以倍增的同时,暴力记录每个点往上跳2j2^j2j步范围内前10小的点集倍增跳的时候暴力合并Code:#include <bits/stdc++.h>#define maxn 100010using namespace std;struct Edge{ int to, next;}edge[maxn << 1];struct data{ int num[15], tot;}ans, node[ma原创 2020-09-02 19:42:31 · 376 阅读 · 0 评论 -
【题解】CF846C:Four Segments
原题传送门ans=2(sumi+sumk−sumj)−sumnans=2(sum_i+sum_k-sum_j)-sum_nans=2(sumi+sumk−sumj)−sumn对于每个jjj,算出最优的i,ki,ki,k,枚举jjjCode:#include <bits/stdc++.h>#define maxn 5010#define LL long longusing namespace std;int n;LL sum[maxn], pre[maxn], nxt[m原创 2020-09-02 16:47:12 · 278 阅读 · 0 评论 -
【题解】CF1031C:Cram Time
原题传送门贪心,能用小的不用大的满足∑i=1ni<=a+b\sum_{i=1}^{n}i<=a+b∑i=1ni<=a+b最大的iii,一定可以用完1−n1-n1−n对于aaa,直接从大到小枚举是否可以看,剩下的给bbbCode:#include <bits/stdc++.h>#define LL long longusing namespace std;LL a, b;int flag[1000010];int main(){ scanf("%lld%原创 2020-09-01 21:11:27 · 266 阅读 · 0 评论 -
【题解】CF1025D:Recovering BST
原题传送门首先会想到一个朴素的暴力dpi,j,kdp_{i,j,k}dpi,j,k表示区间[i,j][i,j][i,j]根为kkk是否可行,枚举两边子树的根复杂度O(n4)O(n^4)O(n4)这是逆推dp,一般逆推不行,可以想一想顺推对于一个区间[i,j][i,j][i,j],它的父亲只能为i−1或j+1i-1或j+1i−1或j+1,可以枚举区间[i,j][i,j][i,j]以及区间的根kkk,往[i−1,j],[i,j+1][i-1,j],[i,j+1][i−1,j],[i,j+1]两个状态原创 2020-09-01 20:41:07 · 211 阅读 · 0 评论 -
【题解】CF1085D:Minimum Diameter Tree
原题传送门贪心,只给与叶子结点相连的边赋值,平均分假设有cntcntcnt个叶子,每条叶子边的权值为scnt\frac{s}{cnt}cnts答案是2scnt2\frac{s}{cnt}2cntsCode:#include <bits/stdc++.h>#define maxn 100010using namespace std;double s, cnt;int n, d[maxn];inline int read(){ int s = 0, w = 1; cha原创 2020-08-31 21:29:21 · 223 阅读 · 0 评论 -
【题解】CF1081C:Colorful Bricks
原题传送门kkk个颜色不同,就是在n−1n-1n−1个间隔中插入kkk个板子,每一段内部颜色相同,方案数Cn−1kC_{n-1}^kCn−1k枚举每个块的颜色,第一个块有mmm中选择,之后都有m−1m-1m−1种选择所以答案就是Cn−1k∗m∗(m−1)kC_{n-1}^k*m*(m-1)^{k}Cn−1k∗m∗(m−1)kCode:#include <bits/stdc++.h>#define LL long longusing namespace std;const LL原创 2020-08-31 21:21:54 · 186 阅读 · 0 评论 -
【题解】CF1101D:GCD Counting
原题传送门发现要是两个数gcd>1gcd>1gcd>1,其实只需要关注他俩是否有质数公因数对于每个数暴力分解质因数,树形dpdpu,idp_{u,i}dpu,i表示点uuu为根,第iii个质因数的最长链ans=max(dpu,i+dpv,j)(fav=u,primeu,i=primev,j)ans=max(dp_{u,i}+dp_{v,j})(fa_v=u,prime_{u,i}=prime_{v,j})ans=max(dpu,i+dpv,j)(fav=u,primeu,原创 2020-08-31 21:04:34 · 204 阅读 · 0 评论 -
【题解】CF1180B:Nick and Array
原题传送门若一个数x>=0x>=0x>=0,则∣−x−1∣>∣x∣|-x-1|>|x|∣−x−1∣>∣x∣若一个数x<0x<0x<0,则∣−x−1∣<∣x∣|-x-1|<|x|∣−x−1∣<∣x∣所以把所有大于等于0的数变成负的,如果有奇数个数,乘积是负的所以把绝对值最大的负数变成正的,易证最优Code:#include <bits/stdc++.h>#define maxn 100010using name原创 2020-08-27 08:15:04 · 168 阅读 · 0 评论 -
【题解】CF631C:Report
原题传送门如果我先做了一个[l,r][l,r][l,r]的操作,又做了一个[l,r+1][l,r+1][l,r+1]的操作,那么一开始的那个操作就没用了可以记录每个点最晚的操作,从后往前逐位确定即可Code:#include <bits/stdc++.h>#define maxn 200010using namespace std;int n, m, a[maxn], pos[maxn], type[maxn], Max, ans[maxn];inline int read()原创 2020-08-25 16:12:13 · 184 阅读 · 0 评论 -
【题解】CF1209D:Cow and Snacks
原题传送门对于同一只动物喜欢的两种点心,用并查集连边建好图后,对于一个点数>1的连通块,假设大小为xxx,用最优策略必定能满足x−1x-1x−1只动物,因为第一个来的必须取走两个,剩下的可以使得他们都只取走一个再转换一下思路,对于一个动物,如果他喜欢的两种点心尚未在同一个连通块里,那么他在最优策略下是一定能被满足的,那就答案+1,并且并查集合并然后我们求的是不能被满足的有多少Code:#include <bits/stdc++.h>#define maxn 200010us原创 2020-08-23 18:37:18 · 278 阅读 · 0 评论 -
【题解】CF1188B:Count Pairs
原题传送门推式子(ai+aj)(ai2+aj2)≡k(a_i+a_j)(a_i^2+a_j^2) ≡ k(ai+aj)(ai2+aj2)≡k mod ppp(ai+aj)(ai−aj)(ai2+aj2)≡k(ai−aj)(a_i+a_j)(a_i-a_j)(a_i^2+a_j^2)≡k(a_i-a_j)(ai+aj)(ai−aj)(ai2+aj2)≡k(ai−aj) mod pppai4−aj4≡kai−kaja_i^4-a_j^4≡ka_i-ka_jai4−aj4≡k原创 2020-08-23 12:01:16 · 218 阅读 · 0 评论 -
【题解】CF1107E:Vasya and Binary String
原题传送门令dpi,j,kdp_{i,j,k}dpi,j,k表示区间[i,j],j[i,j],j[i,j],j的右边还可以一起删kkk个dpi,j,k=max(dpi,j−1,0+ak+1)dp_{i,j,k}=max(dp_{i,j-1,0}+a_{k+1})dpi,j,k=max(dpi,j−1,0+ak+1)dpi,j,t=max(dpk+1,j−1,0+dpi,k,t+1(sk=sj))dp_{i,j,t}=max(dp_{k+1,j-1,0}+dp_{i,k,t+1}(s_k=s_原创 2020-08-21 16:01:45 · 273 阅读 · 0 评论 -
【题解】CF1348E:Phoenix and Berries
原题传送门首先要发现一个性质令suma=∑i=1nai,sumb同理suma=\sum_{i=1}^na_i,sumb同理suma=∑i=1nai,sumb同理答案的上界=[(suma+sumb)k]=[\frac{(suma+sumb)}{k}]=[k(suma+sumb)]下界=[sumak]+[sumbk]=[\frac{suma}{k}]+[\frac{sumb}{k}]=[ksuma]+[ksumb]上界<=<=<=下界+1,即要么上界=下界,要么上界=下界+原创 2020-08-20 21:28:45 · 285 阅读 · 0 评论 -
【题解】CF883I:Photo Processing
原题传送门先排个序最大值最小,用二分然后用dp验证dpidp_idpi表示当前到iii,最后一个分组是否可以以iii结尾dpi∣=dpj−1(j<i,ai−aj<=mid)dp_i|=dp_{j-1}(j<i,a_i-a_j<=mid)dpi∣=dpj−1(j<i,ai−aj<=mid)但是这个是O(n2)O(n^2)O(n2)的,可以优化发现对于一对(i,j)(i>j)(i,j)(i>j)(i,j)(i>j),若[j,i][j,原创 2020-08-20 16:24:19 · 222 阅读 · 0 评论 -
【题解】CF1203D2:Remove the Substring (hard version)
原题传送门CSP初赛题,直接模拟,开两个数组记录第一个串每个位置能覆盖的第二个串最右的位置和最左的位置Code:#include <bits/stdc++.h>#define maxn 200010using namespace std;char s1[maxn], s2[maxn];int ans, f[maxn], g[maxn];int main(){ sca...原创 2019-10-24 21:25:31 · 234 阅读 · 0 评论 -
【题解】CF37B:Computer Game
原题传送门模拟题……每一秒都选符合要求且攻击力最大的卷轴没有就算了但是若是BOSS的生命力只增不减且已没有可用的卷轴,输出NOCode:#include <bits/stdc++.h>#define maxn 1010using namespace std;struct data{ int p, atk;}a[maxn];struct node{ int se...原创 2019-08-29 18:04:46 · 266 阅读 · 0 评论 -
【题解】CF460C:Present
原题传送门最小值最大当然是二分答案然后O(n)O(n)O(n)扫,如果当前数未达到midmidmid,就加到midmidmid,并且这个数是作为区间左端点的如何实现区间加法,差分数组就行了Code:#include <bits/stdc++.h>#define maxn 1000010#define LL long longusing namespace std;LL...原创 2019-09-08 21:27:52 · 354 阅读 · 0 评论 -
【题解】CF463D:Gargari and Permutations
原题传送门确实是一道不错的题目发现k特别小可以先O(n2)O(n^2)O(n2)枚举x,yx,yx,y,若xxx在每个数列中都在yyy前面,那么xxx就可以向yyy连一条边,这样建图建好以后整个图是一个DAGDAGDAG,跑一个拓扑DP就好了Code:#include <bits/stdc++.h>#define maxn 1000010#define _ 0using...原创 2019-09-10 20:17:53 · 230 阅读 · 0 评论 -
【题解】CF570E:Breaking Good
原题传送门比较好的最短路题目需要求最短路情况下修改路通断状态数最少想到跑最短路的过程中记两个变量dis,safedis,safedis,safe分别表示到该点的最短路以及最短路情况下路径上最多通边条数显然使得路径上通边最多那么就能使得没经过的边集中断边最多然后记录一个路径的pre把路径存下来,最终统计答案即可Code:#include <bits/stdc++.h>#...原创 2019-09-13 11:18:03 · 353 阅读 · 0 评论 -
【题解】CF549G:Happy Line
原题传送门官方题解没看懂,我说说我自己的想法。想到排序,原数列直接sortsortsort满足时间复杂度,那么如何sort是正确的?首先确定这个sort有何意义,就是我们想把原数列中的每个数移到它正确的位置上那么排序怎样是是意义的?是不是原来两个数经过排序后面那个数到了前面那个数的前面性质:若ai=ai+1+1a_i=a_{i+1}+1ai=ai+1+1,那么无解,因为操作之后依然是...原创 2019-09-13 12:45:48 · 209 阅读 · 0 评论 -
【题解】CF567D:One-Dimensional Battle Ships
原题传送门直接模拟的话比较麻烦,可能需要用上一些数据结构之类的但是这道题目不需要数据结构,直接二分即可先把坐标排序,二分答案,checkcheckcheck里面计算可以放多少船ididid小于midmidmid的断点是合理的对于一段区间[l,r][l,r][l,r],可以放[r−l+1a+1][\frac{r-l+1}{a+1}][a+1r−l+1]条船Code:#include ...原创 2019-09-22 10:45:13 · 300 阅读 · 0 评论 -
【题解】CF498A:Crazy Town
原题传送门跟实数运算有关的题目做起来总是很方。。。就是求多少条直线跟线段有交点针对每条直线求出解析式ax+by+c=0−−>y=−abx−cbax+by+c=0-->y=-\frac{a}{b}x-\frac{c}{b}ax+by+c=0−−>y=−bax−bcx1,x2x1,x2x1,x2代进去,只要两个对应值和y1,y2y1,y2y1,y2大小关...原创 2019-08-22 17:36:08 · 267 阅读 · 0 评论 -
【题解】CF729F:Financiers Game
原题传送门题意:两个人分别从长度为n的数列的两端开始取数,如果前一个人取了k个数,后一个人必须取k或k+1个,第一个人最开始可以取1个或2个,不能操作时结束。两个人都希望自己取到的数字之和尽量大,并保持绝对理智,求最后他们取到的数字之和之差。n≤4000。Solution:使用DPdp[l][r][k][0/1]表示dp[l][r][k][0/1]表示dp[l][r][k][0/1]表示...原创 2019-07-24 15:29:21 · 388 阅读 · 0 评论