首页 > 其他分享 >AtCoder Regular Contest 131 E Christmas Wreath

AtCoder Regular Contest 131 E Christmas Wreath

时间:2023-05-05 19:23:11浏览次数:53  
标签:AtCoder typedef Contest Wreath long 410 define

洛谷传送门

AtCoder 传送门

不难猜想有解充要条件为 \(n \ge 5\) 且 \(\frac{n(n-1)}{2} \bmod 3 = 0\)。

发现如果钦定一个点的出边都为同一种颜色,那么条件 \(2\) 一定满足。

那么题目等价于把 \(\{0,1,...,n-1\}\) 分成 \(3\) 组使得每组的和相等。

这个东西可以随便 dp 做,也不难发现若满足有解的充要条件则一定能找到一组合法的分组方案。

code
// Problem: E - Christmas Wreath
// Contest: AtCoder - AtCoder Regular Contest 131
// URL: https://atcoder.jp/contests/arc131/tasks/arc131_e
// Memory Limit: 1024 MB
// Time Limit: 3000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 55;

int n, m, g[maxn][410][410], a[maxn];
bool f[maxn][410][410];

void solve() {
	scanf("%d", &n);
	if (n <= 4 || (n * (n - 1) / 2) % 3) {
		puts("No");
		return;
	}
	m = n * (n - 1) / 6;
	f[0][0][0] = 1;
	for (int i = 0; i < n; ++i) {
		for (int x = 0; x <= m; ++x) {
			for (int y = 0; y <= m; ++y) {
				if (!f[i][x][y]) {
					continue;
				}
				if (x + i <= m) {
					f[i + 1][x + i][y] = 1;
					g[i + 1][x + i][y] = 1;
				}
				if (y + i <= m) {
					f[i + 1][x][y + i] = 1;
					g[i + 1][x][y + i] = 2;
				}
				f[i + 1][x][y] = 1;
				g[i + 1][x][y] = 3;
			}
		}
	}
	int x = m, y = m;
	for (int i = n; i; --i) {
		a[n - i + 1] = g[i][x][y];
		if (a[n - i + 1] == 1) {
			x -= i - 1;
		} else if (a[n - i + 1] == 2) {
			y -= i - 1;
		}
	}
	puts("Yes");
	for (int i = 1; i <= n; ++i) {
		for (int j = i + 1; j <= n; ++j) {
			putchar(a[i] == 1 ? 'R' : (a[i] == 2 ? 'B' : 'W'));
		}
		putchar('\n');
	}
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:AtCoder,typedef,Contest,Wreath,long,410,define
From: https://www.cnblogs.com/zltzlt-blog/p/17375146.html

相关文章

  • AtCoder Regular Contest 131 D AtArcher
    洛谷传送门AtCoder传送门观察可以发现:使每支箭的距离都为\(D\)一定不劣;每支箭坐标一定为整数;设最左边的箭坐标为\(x\),那么\(x\)太小时可以把最左边的箭移到最右边,\(x\)太大时可以把最右边的箭移到最左边。计算可得\(x\)的最优取值范围为\(x\in[-\left\lfloor\fr......
  • Asia Dhaka Regional Contest C (阶乘分解)
    原题点这前置知识点:阶乘分解可看这篇博客题意:给出\(n\),问\(n!\)的因子的因子的个数和。思路:学会上面的阶乘分解之后,我们能一眼看出来这道题也一定跟它有关系,所以我们按照惯例先对\(n!\)进行质因数分解。n!=\({p_1}^{a_1}\times\)\({p_2}^{a_2}\)\(\times\)\({p......
  • SMU Spring 2023 Trial Contest Round 10
    A.RemoveDuplicates#include<bits/stdc++.h>//#defineinf0x3f3f3f3f#defineendl'\n'#defineintlonglongusingnamespacestd;constintN=2e3+10,mod=1e9+7;//typedeflonglongll;typedefpair<int,int>PII;//queue......
  • The 2022 ICPC Asia Hangzhou Regional Programming Contest--M题 (字典树)
    https://codeforces.com/gym/104090/problem/K题意:给你n个字符串,在给你m个字符大小顺序规则。求逆序对数量。1.常规求这n个字符串的逆序对数量O(n^2)的时间复杂度,必爆,肯定要想办法优化,就往预处理上想。2.在不同规则下,比较这n个字符串谁大,两个字符串比较谁大,无论什么字符串大,......
  • AtCoder Regular Contest 128 E K Different Values
    洛谷传送门AtCoder传送门考虑判断有无解。把序列分成\(c=\left\lceil\frac{len}{k}\right\rceil\)段,则\(\foralla_i\lec\)且\(\sum\limits_{i=1}^n[a_i=c]\le((len-1)\bmodk)+1\)。必要性显然。充分性可以考虑直接构造,不难证明。考虑如何构造字典序最小......
  • AtCoder Regular Contest 134 D Concatenate Subsequences
    洛谷传送门AtCoder传送门我一年前甚至不会做/qd发现\(a_{x_1}\)为\(k=\min\limits_{i=1}^na_i\)时最优。然后开始分类讨论:如果\(\min\limits_{a_i=k}a_{i+n}\lek\),答案为\((k,\min\limits_{a_i=k}a_{i+n})\)。这是因为如果再选一个\(k\)肯定不优。否则......
  • AtCoder Beginner Contest 300
    A-N-choicequestion#include<bits/stdc++.h>usingnamespacestd;intread(){intx=0,f=1,ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-......
  • AtCoder Regular Contest 128 D Neq Neq
    洛谷传送门AtCoder传送门考虑把所有\(a_i=a_{i+1}\)的位置断开,分别计算然后把方案数乘起来。接下来的讨论假设\(a_i\nea_{i+1}\)。考虑一个dp,设\(f_i\)为\([1,i]\)最后剩下的集合的方案数。转移显然是\(f_i\getsf_i+f_j\),但是需要满足\((a_j,a_{j+1},...,......
  • AtCoder Beginner Contest 242(D,E)
    AtCoderBeginnerContest242(D,E)D(二叉树搜索)D题目大意就是首先给你一个字符串,代表\(S^0\),然后我们可以操作得到\(S^1,S^2\)等等我们可以知道\(S^i\)是拿\(S^(i-1)\)经过一系列替换而来的,因为这个字符串只有三种字符串,\(A,B,C\),这个替换方式就是把\(A\)替换成\(BC\),把\(B\)......
  • AtCoder Regular Contest 125 F Tree Degree Subset Sum
    洛谷传送门AtCoder传送门首先将度数\(-1\)。设\(f_i\)为体积为\(i\)至多能用几个物品凑出来,\(g_i\)为至少。我们现在要证明一个东西:\(x\in[g_i,f_i]\),\((i,x)\)合法。首先若\((s,x)\)合法,那么必须满足\(s-x\in[-z,z-2]\),其中\(z=\sum\limits_{i=1}......