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\),元素两两不同,可以使用两种操作。
- 翻转相邻两个元素
- 翻转相邻三个元素
问怎么操作使这个序列变成升序,并使操作一的次数最少,且输出这个最少的次数。
题目解法:
我们先离散化,之后就是排列了(以下讨论均在排列的意义下)。
我们看成第一种操作有一的代价,第二种操作没有代价。
因为第二种操作没有代价,我们可以用任意次,而其效果就是同奇偶位置任意交换(是不是想到冒泡了?)。
所以如果这个序列中所有偶数都在偶数位置,奇数都在奇数位置,那么就赢了。
想到这里,我们发现第一种操作在最优情况,就是将一对奇偶正好相反的两个数奇偶归位。
那么答案就是所有没有奇偶归位的数的个数除以二(一定整除,想一想为什么)。
\(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.\ $
简要题意:
咕咕咕
题目解法:
咕咕咕