AGC005D 做题体验
题目链接
本人再次认为是一道不错的题目,可能是我菜。
判定可行解#
首先假定我们已经得到了
从图论的角度去分解这个问题,我们设当前序列为
当
很显然,这几条边把相同数字的点都连上了边,那么如果整张图中只有一个连通块时,说明都是一种数值。
那么该如何连边,在这道题中非常显然,对于回文串连边即可。
因为对于一个长度为
所以如果
那么很显然,一共会连出来
到现在为止,我们已经判断了是否有可行解的情况,现在考虑构造方案。
#
先从
我们发现
这里直接给出结论:
注意,当
和 #
其实我们只要构造出
当
同样的,对于
上述的思路仔细思索还是不难理解的。
具体细节可以看一下代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
#define Enter putchar('\n')
#define quad putchar(' ')
const int N = 105;
int n, m, a[N], s, b[N];
signed main(void) {
std::cin >> n >> m;
for (int i = 1; i <= m; i++) std::cin >> a[i];
for (int i = 1; i <= m; i++) s += (a[i] & 1);
if (s > 2) {
std::cout << "Impossible" << std::endl;
return 0;
}
if (m == 1) {
std::cout << a[1] << std::endl;
if (a[1] == 1) {
std::cout << 1 << std::endl << 1;
return 0;
}
std::cout << 2 << std::endl;
std::cout << 1 << " " << a[1] - 1 << std::endl;
} else if (s == 0) {
for (int i = 1; i <= m; i ++) std::cout << a[i], quad; Enter;
a[1] ++; a[m] --;
if (a[m] == 0) m --;
std::cout << m << std::endl;
for (int i = 1; i <= m; i++) std::cout << a[i], quad;
Enter;
} else if (s == 1) {
std::stable_sort(a + 1, a + 1 + m, [](int p, int q) {return p % 2 < q % 2;});
for (int i = 1; i <= m; i++) std::cout << a[i], quad; Enter;
a[1] ++; a[m] --;
if (a[m] == 0) m --;
std::cout << m << std::endl;
for (int i = 1; i <= m; i++) std::cout << a[i], quad;
Enter;
} else {
int first = -1, last = -1;
for (int i = 1; i <= m; i++) {
if (a[i] % 2 == 0) continue;
if (first == -1) first = a[i];
else {last = a[i]; break;}
}
int tot = 1;
b[1] = first;
for (int i = 1; i <= m; i++)
if (a[i] % 2 == 0) b[++tot] = a[i];
b[++tot] = last;
for (int i = 1; i <= m; i++) std::cout << b[i], quad; Enter;
b[1] ++; b[m] --;
if (b[m] == 0) m --;
std::cout << m << std::endl;
for (int i = 1; i <= m; i++) std::cout << b[i], quad;
}
return 0;
}
作者:Aonynation
出处:https://www.cnblogs.com/Oier-GGG/p/16536257.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通