cf(Round 1006(div.3))补题日记

cf1100纯小白在补题中的思考和感悟🤔
https://codeforces.com/contest/2072
在本次比赛也是快速签了AB 之后便是长达2个小时的坐牢

手快还是能加分的 加了15。。(C,D一生之敌 doge~)

A:

A的话就是算(k%p)的关系并于n比大小
赛时代码:

B:

B是去计算子串出现“--”的个数;
要让-
-最大化则是将‘-’出现的尽量平均的在俩边,而‘’尽量放在中间;
举一个样例:
10
--
---
最大化就是将字符串变为---_ _ _ _ _ -- 此时‘-_-’子串的个数是3×5×2=30
赛事代码:

C:

大致题意是:去构造{a1,a2,a3....,an}(长度为n)让 a1|a2|a3|...|an = x;
并且MEX(a1,a2,a3...,an)最大
| (并联电路)就是有1就1,全0才为0;
当时的思路:将n的二进制存入一数组中下标为i且x[i]==1,去存到另一个数组y.push_back(pow(2,i)) ,为了同时让MEX(a1,a2,a3,...,an)最大,可谓绞劲脑汁。
其实就是让x的二进制下应该为1的|之后让他变为1.但是我这样的写法还分为数组长度不够,直接输出x,或者数组长度够,让MEX尽可能大等等。最后改了俩个小时。。。
比赛完看了天赐哥的代码(太简洁了,后面的题就是以天赐哥的代码为基础进行理解);
天赐哥的代码如图:

补题代码:

思考:(构造题)赛时考虑的太多?还是代码不够精确? 不从改变的位置入手,而是直接从数组长度(即答案)入手,还是缺点思维,比较呆板。
D:

大致题意:选择俩个数字 l,r(1<=l<=r<=n) 将数组a[l]插到a[r]后,使得逆序对达到最小。
当时想的是去第一个(a[i]>a[i-1]&&a[i]>a[i+1])去寻找后面>=a[i]的a[j]; wa2...
然后出来一看妥妥的暴力 真就应了那句话“1200以下无难题,思维、贪心与暴力”。
做法如下:
第一个for去遍历数组 i=1~n 第二个for从j=i+1~n
if(x[i]>x[j]) 说明当前i产生了逆序对,而本题是要去尽可能多的去减少逆序对的个数 cnt++ 然后去记录一下cnt值的最大值(即若x[i]换到x[j]的位置之后我将减少最大的逆序对的个数,以及i,j的位置)
else if(x[i]<x[j]) 要cnt-- why? 因为如果你将小的x[i]换到x[j]后本来没有逆序对,而你自己给自己产生了逆序对,所以cnt--;
补题代码:

E:

本场补的最后一个题,先补到E,E的clist分是1495,暂时的目标是1200,先点到为止,以及很满足了。
大致题意:a(xa,ya),b(xb,yb)
让p(a,b)=d(a,b), 用n个放在不同的整数坐标生成满足条件的序对为k;
公式最后会化简为2|xa-xb||ya-yb|=0;(即xa=xb或者ya=yb)就行,所以该题就转化为尽可能多的数对以较少的n去生成,用二分查找去让(mid*(mid-1))/2接近于k,但要比此时的k小,然后更新k。
补题代码:

最后的最后天赐哥交给了我俩个二分模板,让我直接这么用:

如果有问题,还请各位看官指出!!!

posted @ 2025-02-28 00:42  yzxdz  阅读(56)  评论(2)    收藏  举报