0%

Educational Codeforces Round 187 (Rated for Div. 2)-CF-Edu-187-赛后总结(较大数据量下 vector 套 vector 的调和级数因数分解会出问题)(涉及到累加器的,用 for 循环,不要用 while 循环)

基本情况

image

两道题目,哎,还好这个B做的快是吧,绷不住了。

当然了,小号其实也无所谓。嗯,其实也还好不过之后呢,我觉得还是把这个号打上去以后,还是用这个号打。其实,你一直没分数,其实也没什么意思,就是那种比较刺激的那种感觉是吧。

OK,我们说回来。这个D为什么交了5发还是没过呢?主要是因为就是这个D,它的数据量比较大。使用Victor victor或者victor的这种调和级数写法呢,它这个时间会超。可以使用vis 数组标记所有 a 的倍数。这样子可以避免卡常。

1
2
3
4
5
6
7
8
9
10
ll cnt_un_divide=0,cnt_all_divide=0;
vector<char> vis(N+M+2);
for (auto a:A) {
for (ll i=1;i<=N+M;++i) {
if (i*a>N+M) {
break;
}
vis[i*a]=true;
}
}

然后为什么标题里面提了不要用 while 循环?是因为涉及累加的逻辑(在 D 的对拍暴力程序当中),直接 continue 以后,while 循环的这个累加就崩掉了。

A 就是一个向上取整除法,没什么好说的。

B 也简单,就是猜一下,我猜,只有这个 digit 总和小于 10 的情况下,题设条件才成立。注意前导 0,不要不小心进行操作后出现前导 0。

可以在排序前,对第一个数减 1,让其被操作后至少保留 1。

1
2
sn[0]--;
sort(all(sn),greater<>());

心得感悟