2020.7.7比赛总结

题目链接
感受:首先是有道题一开始想麻烦了,耽误了很长时间,然后回顾了一下以前比赛时候类似这种题的做法,发现这种情况已经不是一次两次了,经常出现,总是会想麻烦,一开始就偏离了正确做法,导致时间花费很多。而我又感觉到有些题(不是指这一次比赛)能够很快的想出正确做法,我总结一下我总是卡住的题型和很快做出的题型,发现:类似于一些纯数学问题总是会卡那么一下,感觉自己的数学没有这么差吧。另一类就是像那种想一些结论性的东西能很快做出来,具体为什么我也不清楚,再打几场比赛找找自己的原因吧
这些题编码难度都不高,难的就是思维,自己的思维能力老是提不上来,总是看着题解会,自己做的时候就会瞎想,总的来讲还是思考方向把喔不准。
下面总结一下所有题的思路。

A题

题目大意:给你一棵树,每个节点都有一个取值范围,只要有一个节点的值变了就说这棵树变了。求所有数的值的和。(值的定义是这样的: H = ∑ s = 1 n − 1 ∑ i = s n h i H=\sum_{s=1}^{n-1}\sum_{i=s}^{n}h_{i} H=s=1n1i=snhi)
想了没思路,这道题搜了一下要用线段树+树链剖分+dp,嗯嗯。。等我再学学以后来补吧。。

B题

题目大意:你有一个m个人的小队,每个人都有一个敏捷度a值,现在要吧他们从0领到n+1(在水平轴上),你可以单独走,可以前进后退,每次只能走一格,花费一秒。你的小队的人只能跟着你走。很不幸,这条坐标轴上有陷阱,给出每个陷阱的参数,l,r,d。表示陷阱i在li位置,敏捷度低于di的人不能通过,如果要解除这个陷阱你就必须要走到ri(你无视陷阱)。求最多可以带多少个人到n+1上。
思路:二分答案然后模拟这个过程。
整个模拟过程每次都只需要考虑敏捷度最低的那个人的值,然后教练带着从0走到限制我们的第一个陷阱的前一个格li-1,然后教练去拆掉这个陷阱,算出拆掉陷阱的时间t,要乘二,因为是来回两遍,然后让队伍走到下一个有效的限制陷阱的前一个格,最后答案就是整个路段拆掉陷阱的时间加上n+1.
judge函数内容:

bool judge(int x)
{
    if(x==0) return 1;
    ll mi=a[m-x+1],cnt=0;
    ll tt=0;
    for(int i=1;i<=k;i++)
    {
        if(b[i].d>mi) c[++cnt]=i;
    }
    int now=0;
    for(int i=1;i<=cnt;i++)
    {
        if(now>=b[c[i]].r) continue;
        now=max(now,b[c[i]].l-1);//保证当前到达的位置是最大的
        tt+=(b[c[i]].r-now)<<1;
        now=b[c[i]].r;
    }
    tt=tt+n+1;
    if(tt>t) return false;
    else return true;
}

C题

题目大意:给你两个数c和sum分别表示目前有的,和需要的。最后结果是把目前的sum分成若干部分,一个部分的值k最终产生的值是 k 2 k^{2} k2,将每一部分的值相加,要求最小。
思路:如果c>=sum的话直接每一份都分成1,最后结果就是sum。否则,把sum分成c份,sum/c向下取整,然后求出m=sum%c结果就是m*(num+1) * (num+1)+(c-m) * (num*num)。

D题

题目大意:你有一个朋友,他想当冠军,但他实力有限,有n个选手,下标代表一个人的实力,ai代表如果贿赂他需要花费的钱。求最少花费多少钱能让朋友夺冠。
还没太想透,等想透再来整理一遍思路。

E题

题目大意:给你三个数r,b,k。从0开始如果遇到r的倍数就给她涂成红色,遇到b的倍数涂成蓝色,遇到他们两个的公倍数,可以任意涂红蓝之间的颜色,如果最后出现了连续k个相同的颜色,则失败。
思路:为了简化情况,可以使得r<=b。当r=b时直接成功。r<b时需要得到在连续两个b的倍数之间最多能插入多少个r的倍数。设从xb开始,第一个r的倍数距离xb为t,那么
x b + t = y r . 化 简 得 x b − y r = − t . 为 了 使 这 个 方 程 有 解 , 那 么 g c d ( b , r ) ∣ t xb+t=yr.化简得xb-yr=-t.为了使这个方程有解,那么gcd(b,r)|t xb+t=yr.xbyr=t.使gcdbrt也就是说t>=gcd(b,r)。从xb到(x+1)b这个区间的长度是b-1.那么能插入的r的倍数的数量是 b − 1 − t r + 1 \frac{b-1-t}{r}+1 rb1t+1为了使这个值最大,那么t就必须要最小,即gcd(b,r),那么最终一个区间里r的倍数的数量最多为 b − 1 − g c d ( b , r ) r + 1 \frac{b-1-gcd(b,r)}{r}+1 rb1gcd(b,r)+1然后和k比较即可。

F题

题目大意:给你两个数a,b。每次可以执行一个操作,任意选择一个整数x,让a-=x,b-=2 *x或者a-=2 *x,b-=x。问能否使得ab同时为零。
思路:简化情况使得a<=b
考虑到每次操作都是一比二,所有无论选择什么数,都可以看成以1和2或2和1为基础,那么每次操作都会使得a+b的总和减去3,如果能够同时为0那么a+b一定为三的倍数。考虑1 3这种情况2 *a<b就算每次让a减1b减2,当a为0时b也不会为零,所以这种情况也是不可以的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值