Codeforces Round #670 (Div. 2)

CF复健的第一场比赛。

div2只做出前三题太丢人了。

前三题过于简单就不写题解了。

D:给你一个序列,要你构造单调不下降子序列(bi<=bi+1)和单调不上升子序列(ci>=ci+1)使得bi+ci=ai,要你最小化max(bi,ci)

思路:赛中是真不会做,主要是如何构造最优解没想明白。实际上感觉正常人都应该推的出来。果然思维题太菜了。我们从左到右推这个数组。如果ai>ai+1,那么我们只要ci不动,bi变大即可,不然如果ci动了,bi只会变得更大,肯定不优。ai<ai+1同理。那么我们就发现答案就是max(c1,a1-c1+sum(chafen[i]>0的部分)),所以区间修改只需要对差分数组单点修改即可。就可以通过本题(

E:一开始有一个1-n的set,你要找出一个小等于n的数,每次有2种操作,一种是A x表示查询当前set内x的倍数有几个。一种是B x表示查询当前set内x的倍数有几个,并删除他们,x必须大于1。(但是特定的数字不会被删除)n<=100000,要你在10000次操作里完成查找。

思路:这题就是最后一步想复杂了。被当前值=1的思路带偏了。然后调了1h没调过。首先通过打表可以发现<=n的质数在9500个。我们发现大于根号n部分的质数最多有一个因子,也就意味着在将小等根号n的质数筛完之后,剩下的只有大于根号n的质数本身,当然还有可能有特殊的数k和1.我们就可以先用不超过240个左右的询问把这个特殊数的小等于根号n部分的因子先搞出来。然后对其分类讨论。如果这个特殊数并没有小等根号n的因子。那么说明它是一个大等根号n的质数。但是我们不能对每个B进行一次操作再进行A,因为次数不够,很容易想到分块,每100个质数查询完查询一下剩余的数有多少,如果剩余的数不是刚好减去了100个,说明有一次删减失败了,再回去这100个数里查询哪个没有被删除就获得答案。如果这个特殊数有小等根号n的因子,那么我们其实对其B 1的限制就消失了,所以我们可以直接B πpi^ki(pi<=sqrt(n)),然后直接对每一个大于根号n的因子pi查询A pi*tans 如果=1说明是该特殊数就好了(就是在这一步想复杂了,想成了统计剩余数的个数结果算到自闭)。

posted @ 2020-09-13 10:06  ghostfly233  阅读(232)  评论(2编辑  收藏  举报