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})重复(leftlfloor frac{q_i}{q_{i-1}} ight floor)遍,在加上开头一段,得到(A_i)
那么我们从大到小处理每一个询问,假设处理到第(i)个询问,那么给(A_{i-1})加上一个(leftlfloor frac{q_i}{q_{i-1}} ight floor)倍数,之后会继续处理。
这个整段整段的重复。
对于末尾剩下的一小节,我们二分找到第一个比这段长的(A_i),继续处理。
当递归到最开始的序列的时候,我们就(O(1))的给一个区间的数用差分加上之前积累的倍数那么多次。
最后扫一遍,就求出答案了。

$F. $

简要题意:

咕咕咕

题目解法:

咕咕咕

原文地址:https://www.cnblogs.com/tacmon52818/p/12713480.html