Codeforces Round #305 (Div. 1)

547A - Mike and Frog

Solution:

   先求出两种变化的第一次和第二次变化到目标的时间。

     对这四个时间的具体情况需要一些特判 。

     然后直接从1到2*N枚举其中一个时间的倍数,然后输出第一个满足要求的答案。

   或者求出循环节后用拓展欧几里得求出最小解。


547B - Mike and Feet

题意:

  给定一个长度为n(<=2*10^5)的序列,分别求出长度为(1~n)的区间的最小数的最大值。

Solution:

  可以先预处理以每个数为答案的最长区间。

      即从每个数分别从左和从右找到第一个小于它的数的位置,可以用单调栈O(n)处理。

      假设x的左右分别是l,r。那么区间1~(r-l+1)的值可以对x取max。实际上只需更新ans[r-l+1],最后对ans[i]=max(ans[i],ans[i+1]).就行了

      时间复杂度O(n)


547C - Mike and Foam

题意:

  每次从一个数列(最多2e5个数)中添加或删除一个数,输出数列中互质的数对的数目。(询问不超过2e5)

Solution:

   容斥原理。

   可以预处理每个数的约数,记录cnt[x],当前数列中有多少个x的倍数。

 然后利用容斥计算出删除或加入这个数对答案产生的影响。


547D - Mike and Fish

Solution:

  图论。

  由于题目已经保证有解。需要注意到这个保证具体有哪些性质。

  可以发现只有同一行或者同一列的点能互相影响,包括间接在同一行列的。

     那么可以针对行和列建图,根据行列给结点标号,需要放鱼的点变成边。

     这样能够互相影响的点的集合就连通了。下面只需要对边染色。

     这样的一个连通的图中中,需要满足任意点连接的边不同颜色的边的差小于等于1.

   如果把不同颜色的边当成一个点的出边和入边,问题就变成了找这个图的欧拉路了。

原文地址:https://www.cnblogs.com/keam37/p/4575701.html