题目链接
感受:首先是有道题一开始想麻烦了,耽误了很长时间,然后回顾了一下以前比赛时候类似这种题的做法,发现这种情况已经不是一次两次了,经常出现,总是会想麻烦,一开始就偏离了正确做法,导致时间花费很多。而我又感觉到有些题(不是指这一次比赛)能够很快的想出正确做法,我总结一下我总是卡住的题型和很快做出的题型,发现:类似于一些纯数学问题总是会卡那么一下,感觉自己的数学没有这么差吧。另一类就是像那种想一些结论性的东西能很快做出来,具体为什么我也不清楚,再打几场比赛找找自己的原因吧
这些题编码难度都不高,难的就是思维,自己的思维能力老是提不上来,总是看着题解会,自己做的时候就会瞎想,总的来讲还是思考方向把喔不准。
下面总结一下所有题的思路。
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=1n−1∑i=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.化简得xb−yr=−t.为了使这个方程有解,那么gcd(b,r)∣t也就是说t>=gcd(b,r)。从xb到(x+1)b这个区间的长度是b-1.那么能插入的r的倍数的数量是
b
−
1
−
t
r
+
1
\frac{b-1-t}{r}+1
rb−1−t+1为了使这个值最大,那么t就必须要最小,即gcd(b,r),那么最终一个区间里r的倍数的数量最多为
b
−
1
−
g
c
d
(
b
,
r
)
r
+
1
\frac{b-1-gcd(b,r)}{r}+1
rb−1−gcd(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也不会为零,所以这种情况也是不可以的。