一场咕咕咕了三天的AGC
可能我的智商不太适合做AGC?
可是立的flag总得完成!
*B.GCD Sequence
不好构造,但是给了样例,直接输出即可。
为使全局
,构造任意个2的倍数,奇数个3的倍数即可。
总存在方案使得
:
打表找出
的长度为
的构造,每次整体
即可(注意分
的奇偶讨论)
C.Remainder Game
由于第
位操作的贡献是
,所以贪心从高到低诸位确定。
优化也不需要,暴力判即可。
*D.Shopping
求解最小化火车往返次数。
对于 的 ,直接 。
此时所有 ,设 分别表示点 能否直接右进右出/左进左出。
安排所有点按标号依次选择,逐步优化:
对于
,可以先走
再从
,贪心匹配最多即可。
注意讨论的细节:
code from wxh010910
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define mp make_pair
#define pb push_back
#define Debug(...) fprintf(stderr, __VA_ARGS__)
typedef long long LL;
typedef long double LD;
typedef unsigned int uint;
typedef pair <int, int> pii;
typedef unsigned long long uLL;
template <typename T> inline void Read(T &x) {
char c = getchar();
bool f = false;
for (x = 0; !isdigit(c); c = getchar()) {
if (c == '-') {
f = true;
}
}
for (; isdigit(c); c = getchar()) {
x = x * 10 + c - '0';
}
if (f) {
x = -x;
}
}
template <typename T> inline bool CheckMax(T &a, const T &b) {
return a < b ? a = b, true : false;
}
template <typename T> inline bool CheckMin(T &a, const T &b) {
return a > b ? a = b, true : false;
}
const int N = 300005;
int n, m, x, y, a[N];
bool l[N], r[N];
LL ans;
int main() {
#ifdef wxh010910
freopen("d.in", "r", stdin);
#endif
Read(n), Read(m);
for (int i = 1; i <= n; ++i) {
Read(a[i]);
}
for (int i = 1, t; i <= n; ++i) {
Read(t);
if (t % (m << 1) == 0) {
ans += t;
} else {
ans += 1LL * (t / (m << 1) + 1) * (m << 1), t %= m << 1;
if (t <= a[i] << 1) {
l[i] = true;
}
if (t <= m - a[i] << 1) {
r[i] = true;
}
}
}
for (int i = 1; i < n; ++i) {
if (x && r[i]) {
if (l[i]) {
++y;
}
--x, ans -= m << 1;
} else if (!l[i] && r[i]) {
if (y) {
--y, ++x;
}
} else if (l[i]) {
++x;
}
}
if (!r[n]) {
ans += m << 1;
}
printf("%lld\n", ans);
#ifdef wxh010910
Debug("My Time: %.3lfms\n", (double)clock() / CLOCKS_PER_SEC);
#endif
return 0;
}
*E.Median Replace
设相邻第 个1和第 个1之间的 的个数为 (包括首尾端点),分析如下:
- 通过 将 的 不断 ,使得每个 。
- 相当于可以直接删除 序列中的 ,此时 序列由 构成。
- 合并两个偶数(2或0)一定会变成奇数(1),再删去这个奇数,相当于序列中数可以两两抵消
若存在 且 为奇数, 为偶数,则可达目标状态: 。
DP处理。
另:自动机解法
*F.Checkers
要被“显然”坑死了(智商捉急)
证明很不完善/严谨,欢迎指正(轻喷
一些明显的条件:
将答案看做 进制数,每一位上答案互不相关。问题转化为找合法的(由合法转移得到) 进制数的个数。
且系数均为 的形式,设第 位系数为 ,则 。且 序列中 和 的总共出现次数为 ,且若 出现, 必然出现(即系数在2的次幂上是连续的)。
最关键的条件(和命题充分必要):
对于任意
,可以通过调整绝对值为
的
的符号使得绝对值
的数和为
。
考虑构造过程,必要性“显然”。
???这里就看不懂了。
经过我长久的思考(1天,我TCL),发现可以归纳法证明(???):
满足,
满足,
的所有绝对值
项相当于
中所有绝对值
的项(可以调整
的系数得到
,然后
得到
)和
中所有绝对值
的项,可以调整
的系数得到1,所以最终得到1。
充分性也可以归纳法证明(对于一个满足性质集合 ,如果能分成 , 也满足这个条件,即得证):
不妨设 ( 的情况类似),设 为最小的 :
- 若对于
,
都至少出现了两次,则可以构造
这里又“显然”了qwq,再来证明一下:
设
则
在 中,调整绝对值为 项的系数得到1,而 中调整得到 , 可以随意定符号,所以定成删去的那个是 即值 可以得到1。
而对于 ,设原本 的前缀和 ,则 的前缀和 ,设绝对值为 的项随意定符号后得到 ,同样可以系数取反得到 ,得证。 - 否则记最小的只出现过一次的是 。如果 ,那么 满足条件;否则 ,无解。
考虑 ,设 表示前 个数,总和为 的方案数, 表示当前枚举到的 项, 具体是多少不需要知道,预处理组合数 转移即可。