11.11 复建day1
T1 https://www.luogu.com.cn/problem/CF1426C
本来T1不该是这个的,但是前面有个F题,还是字符串,我就直接弃疗了。。。
题意:最少次的操作,使得初始是1的集合最后的和>n,t次询问。
我们可以把n拆分成xy+b的形式,也就是用(x-1)次操作使1->x,再操作(y-1)次实现x*y,最后的b如果>0,那么只需在执行1->x的操作时复制一次即可。
直接√n枚举取min就是最后的答案,t不大,时间复杂度是完全过得去的
T2 https://www.luogu.com.cn/problem/CF1419D2
md就这?
直接排个序,然后重新开一个一样长的空数组,奇数位放大数,偶数为放小数,大数和小数分别满足不下降就ok了
我一开始想的是边计算答案边处理最后的ans数组,但是好像不太好实现,不如这样处理完数组,直接计算答案来的简单直接。。。
时间复杂度O(n),就是带点常数,无伤大雅。
11.12 复建day2
上午上课,下午睡觉,晚上写题,生活贼滋润。
T1 https://www.luogu.com.cn/problem/CF1401D
一眼看出贪心,通过次数最多的边的权值最大。然后一条边的遍历次数 = size[y] * ( n - size[y] ).
然后分一下
n-1>m:前n-1-m条边直接把遍历次数加到答案里,后面的m条边按遍历次数从小到大*p从小到大;
n-1<m:前n-1-1 条边直接*p的前n-2,后面的p乘起来(不是加起来!!!要注意)再×上最大的遍历次数;
思路很清晰,但是是复建状态中,码力不够
无向边处理size和只遍历所有边一次时,记得记一个father就行,不用开vis数组。
priority_queue<int,vector<int>,greater<int> >q;是小根堆
priority_queue<int> q;是大根堆
11.16 复建day3
由于心态经常爆炸,所以复建不太连续nowcoder和codeforce的比赛太多,我脑子都转不过来了
今天写一下 11.15日codeforces #683 div2的签到题
A题:http://codeforces.com/contest/1447/problem/A
从前往后一个个操作即可,因为往后操作时,前面都已经平了,所以,最后一定能达到一样高
B题:http://codeforces.com/contest/1447/problem/B
每个方块翻转偶数次相当于没翻转,翻转奇数次相当于翻转一次,我们只需统计一下负数有多少,如果有偶数个,我们一定能把所有的负数搞成正数,奇数个的话,找一个绝对值最小的数从所有数绝对值的和里减去两倍的这个数就可以了(因为答案里是加,所以差两个)
11.23 day n(复建之路艰辛)
https://www.luogu.com.cn/problem/CF1398D
以为是个贪心,结果贪心被卡了,后来拜读了题解才发现问题所在,rgb的长度都很小,可以三次方过,所以我们就可以用到记忆化搜索了,用dp【r】【g】【b】,记忆已经搜到的最优解,避免多次搜索,记得排序,大数一定比小数优。(dp yyds)