Fork me on GitHub 返回顶部

Atcoder AGC003 解题报告

\(A.\ Wanna\ go\ back\ home\)

简要题意:

有一个人,在\((0,0)\),给出每一步这个人走的方向(上下左右),请你确定每次走的长度(不小于一),使得最后能回到\((0,0)\)

题目解法:

只要没有出现了“上”,没有“下”之类的情况即可。

\(B.\ Simplified\ mahjong\)

简要题意:

有一组面值为\(1 \sim N\)的牌,已知每种面值的个数。
卡牌\(a,b\)可以组成一对\((a, b)\)当且仅当\(|a面值 - b面值| \le 1\)
问最多能组多少对。

题目解法:

显然最后每种牌最多只会剩下一个。
那么我们先让每一种牌内部配对,如果还剩一张,且下一个面值的有牌,就和下一张配对。
在进行下一种牌的处理。
简要说明一下这种做法的正确性:
我们从最小的牌开始做,如果当前的牌有偶数个,显然内部配对更优。
如果剩一张,能和后面的配对显然就要配对,因为在当前剩下一张肯定比之后剩下一张要差。

\(C.\ BBuBBBlesort!\)

简要题意:

给定一个序列\(a\),元素两两不同,可以使用两种操作。

  1. 翻转相邻两个元素
  2. 翻转相邻三个元素

问怎么操作使这个序列变成升序,并使操作一的次数最少,且输出这个最少的次数。

题目解法:

我们先离散化,之后就是排列了(以下讨论均在排列的意义下)。
我们看成第一种操作有一的代价,第二种操作没有代价。
因为第二种操作没有代价,我们可以用任意次,而其效果就是同奇偶位置任意交换(是不是想到冒泡了?)。
所以如果这个序列中所有偶数都在偶数位置,奇数都在奇数位置,那么就赢了。
想到这里,我们发现第一种操作在最优情况,就是将一对奇偶正好相反的两个数奇偶归位。
那么答案就是所有没有奇偶归位的数的个数除以二(一定整除,想一想为什么)。

\(D.\ Anticube\)

简要题意:

给定\(N\)个数\(s_i\),要求从中选出最多的数,满足任意两个数之积都不是完全立方数。
\(n \le 10^5,s_i \le 10^10\)

题目解法:

能够发现,一个数中如果有一个质因子的次数大于等于3,那么把这个次数对3取模,对答案没有影响。
那么我们就先处理出每一个数,之后对于一个数\(x\),假设不能和\(x\)一起选的数是\(y\)(显然只有一个),那么对于\(y\),不能选一起选的一定也是\(x\)
我们在处理完这些数字之后,存一下每一种数字的出现次数,之后每一对数字的贡献就是两种数字出现的最大值(特判1)。

\(E.\ Sequential\ operations\ on\ Sequence\)

简要题意:

一串数,初始为\(1 \sim N\),现在给\(Q\)个操作,每次操作把数组长度变为\(q_i\)​,新增的数为上一个操作后的数组的重复。
\(Q\)次操作后\(1 \sim N\)每个数出现了多少次。

题目解法:

发现最终有用的操作序列一定一个是以最后一个\(q\)结尾的,单调上升的序列,这个可以用单调栈处理出来。
之后假设\(q_1 \sim q_m\) 就是最终的处理出来的询问序列。
那么每一次操作就是将\(A_{i-1}\)重复\(\left\lfloor \frac{q_i}{q_{i-1}} \right\rfloor\)遍,在加上开头一段,得到\(A_i\)
那么我们从大到小处理每一个询问,假设处理到第\(i\)个询问,那么给\(A_{i-1}\)加上一个\(\left\lfloor \frac{q_i}{q_{i-1}} \right\rfloor\)倍数,之后会继续处理。
这个整段整段的重复。
对于末尾剩下的一小节,我们二分找到第一个比这段长的\(A_i\),继续处理。
当递归到最开始的序列的时候,我们就\(O(1)\)的给一个区间的数用差分加上之前积累的倍数那么多次。
最后扫一遍,就求出答案了。

$F.\ $

简要题意:

咕咕咕

题目解法:

咕咕咕

posted @ 2020-04-16 16:17  tacmon  阅读(188)  评论(0编辑  收藏  举报