首页 > 其他分享 >洛谷 P9575 「TAOI-2」喵了个喵 Ⅳ 题解

洛谷 P9575 「TAOI-2」喵了个喵 Ⅳ 题解

时间:2024-01-19 19:13:21浏览次数:24  
标签:typedef 洛谷 TAOI 奇数 int 题解 偶数 define

Solution

  • 先求出所有数的最大公约数 \(d\),然后将每个数约去 \(d\)。将约去后的数均分,约去前的数也均分。下文讨论的数都是约去 \(d\) 后的数(包括取的 \(x\))。
  • \(n\) 为偶数,取 \(x=1\),对半分即可。
  • \(n\) 不为偶数,且有奇数个偶数。取 \(x=2\),设奇数和偶数分别有 \(x,y\) 个,B 组取 \(\frac{x}{2}-1\) 个奇数,\(\frac{y+1}{2}\) 个偶数即可。因为约去了 \(d\),所以 \(x>0\)。
  • \(n\) 不为偶数,且有偶数个偶数。不论取什么 \(x\) 都有奇数个奇数,无解。
  • 输出的时候要把 \(x\) 乘上 \(d\)。赛时因为这个死活调不出来。

Code

#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
using namespace std;
namespace Milkcat {
	typedef long long LL;
	typedef pair<LL, LL> pii;
    typedef vector<LL> poly;
	const int N = 1e6 + 5;
	LL n, d, x, a[N], ans[N];
	int main() {
		cin >> n;
		if (n == 1) return puts("-1"), 0;
		for (int i = 1; i <= n; i ++) cin >> a[i];
		for (int i = 1; i <= n; i ++) d = __gcd(d, a[i]);
		for (int i = 1; i <= n; i ++) a[i] /= d;
		if (n % 2 == 0) {
			x = 1;
			for (int i = n / 2 + 1; i <= n; i ++) ans[i] = 1;
		}
		if (n % 2 == 1) {
			vector<int> odd, even;
			for (int i = 1; i <= n; i ++) {
				if (a[i] % 2 == 0) even.pb(i);
				if (a[i] % 2 == 1) odd.pb(i);
			}
			if (even.size() % 2 == 1) {
				x = 2;
				for (int i = 0; i < odd.size() / 2 - 1; i ++) ans[odd[i]] = 1;
				for (int i = 0; i < (even.size() + 1) / 2; i ++) ans[even[i]] = 1;
			}
			if (even.size() % 2 == 0) x = -1;
		}
		if (x == -1) return puts("-1"), 0;
		cout << x * d << '\n';
		for (int i = 1; i <= n; i ++) cout << ans[i];
		cout << '\n';
		return 0;
	}
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
    int T = 1;
    while (T --) Milkcat::main();
    return 0;
}

标签:typedef,洛谷,TAOI,奇数,int,题解,偶数,define
From: https://www.cnblogs.com/Milkcatqwq/p/17975397

相关文章

  • 洛谷 P9915 「RiOI-03」3-2 题解
    Preface为啥有蓝啊,这题在机房里15min左右就切了,反倒是2A做了1h。。Solution将矩阵逆时针旋转\(90^{\circ}\),你会发现这是一棵线段树,是父亲左儿子的节点颜色是\(0\),是右儿子的节点颜色是\(1\)。容易发现,联通块一定是一条链。具体地,你从给定的点向上跳,跳到第一个与自己......
  • CF1895E Infinite Card Game 题解
    Solution根据贪心策略,可以发现出完一张牌后对手的出牌是固定的。同理可以算出Monocarp出完一张牌\(a\)后下一次出的牌\(to_a\)。\(a\)和\(to_a\)胜负状态相同。可以发现对所有\(a\)建\(a\toto_a\)后形成的图是内向基环树,一遍dfs即可求出答案。时间复杂度\(\m......
  • /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found问题解决
    有一个go实现的项目代码最近有更新,自己在开发环境上手动构建并运行都没有问题(构建和运行时相同环境,肯定没有问题^_^)。后面通过jenkins构建镜像也没有问题,运行时却报错 之前的版本在jenkins上构建也是成功的,后沟通得知jenkins集群版本最近有更新 那么,大概知道原因了,由于jenk......
  • 洛谷题单指南-模拟和高精度-P1098 [NOIP2007 提高组] 字符串的展开
    原题链接:https://www.luogu.com.cn/problem/P1098题意解读:题目本身是一道模拟题,但是细节点较多,要拿100分,有以下注意点:1、-号两个需要同时为小写字母或者数字,才进行填充2、-号左边>=右边,直接输出-3、对待填充的内容的处理,可以先看是否填充*;小写字母和数字的填充都是前一位asci......
  • CF1214E题解
    PetyaandConstructionSet题目传送门题解一个构造题,结论挺容易猜的。观察到关键信息:\(d_i\len\)。所以我们先把所有奇数编号的点按对应的\(d\)从大到小组成一条链,然后依次考虑偶数号点应该接在链上的哪个点后,容易知道这个点为链上的第\(i+d-1\)个。特殊的,如果接在了最后......
  • CF150C题解
    SmartCheater题目传送门题解首先显然的,每个乘客是独立计算的,然后我们发现,一个乘客在\(i\)到\(i+1\)不买票的期望贡献是一定的,为\(\dfrac{x_{i+1}-x_i}{2}-c*p_i\),所以我们其实就是要对于每个乘客的区间求最大子段和,简单线段树板子,感觉也没啥细节。代码:#include<bits/st......
  • CF1286C1题解
    Madhouse(Easyversion)题目传送门题解这种水题还能有蓝?不能因为困难版是黑就把简单版难度往上强拉啊!第一次问\([1,n]\),第二次问\([1,n-1]\),把读入的所有字符串先各自内部把字符排序(反正本来就是乱序)后存入map,第一次询问有,第二次询问没有的字符串就是原串后缀的乱序,都找出......
  • NOIP2023题解
    目录NOIP2023T1词典(dict)T2三值逻辑(tribool)T3双序列拓展(expand)T4天天爱打卡(run)NOIP2023T1词典(dict)考察:贪心题解Link题目传送门首先任意多次操作本质就是随意排序,所以如果要使\(w_i\)最小,我们一定会使\(w_i\)从\(a\)到\(z\)排,其它都\(z\)到\(a\)排......
  • CF1899G题解
    UnusualEntertainment题目传送门题解真的不要太典,,,考虑点\(u\)是\(v\)的后代等价于\(u\)在子树\(v\)中,dfs序直接走起,变成判断是否存在\(i\)使得:\[in_x\lein_{p_i}\leout_x,l\lei\ler\]二维数点,启动!代码:#include<bits/stdc++.h>usingnamespacestd;#defi......
  • CF1899F题解
    Alex'swhims题目传送门题解构造题,感觉比G更难?可能是我不擅长构造。考虑点的度数,发现一次操作\(u,v_1,v_2\)会使\(deg_{v_1}\)减\(1\),使\(deg_{v_2}\)加\(1\),即一次操作最多减少一个叶子,那如果存在一个时刻使我们的叶子数量大于\(3\)个,下一次若问\(n-1\)则直接......