The 2023 ICPC Asia Hefei Regional Contest

目录

B. Queue Sorting

I. Linguistics Puzzle

D. Balanced Array


应该还会再补几题

B. Queue Sorting

题解:

Dilworth定理:

【偏序关系与偏序集、Hasse图、极大元、极小元、全序关系、最大元、良序集/三小时讲不完离散数学之集合论/考研复试/期末复习考前冲刺/近世代数/抽象代数】https://www.bilibili.com/video/BV1FK4y1i7FP?vd_source=8dcdcdf1464ff87d2684660b142a2bfe

偏序集-Dilworth定理_偏序集的例子-CSDN博客

#define int long long//__int128 2^127-1(GCC)
#define PII pair<int,int>
const int inf = 0x3f3f3f3f3f3f3f3f, N = 1e5 + 5, mod = 998244353;
class modint {
public:
	int x;
	modint(int o = 0) { o %= mod; x = o >= 0 ? o : mod + o; }
	modint& operator = (int o) { o %= mod; return  x = o >= 0 ? o : mod + o, *this; }
	modint& operator +=(modint o) { return x = x + o.x >= mod ? x + o.x - mod : x + o.x, *this; }
	modint& operator -=(modint o) { return x = x - o.x < 0 ? x - o.x + mod : x - o.x, * this; }
	modint& operator *=(modint o) { return x = x * o.x % mod, *this; }
	modint& operator ^=(int b) {
		modint a = *this, c = 1;
		for (; b; b >>= 1, a *= a)if (b & 1)c *= a;
		return x = c.x, *this;
	}
	modint& operator /=(modint o) { return *this *= o ^= mod - 2; }
	friend modint operator +(modint a, modint b) { return a += b; }
	friend modint operator -(modint a, modint b) { return a -= b; }
	friend modint operator *(modint a, modint b) { return a *= b; }
	friend modint operator /(modint a, modint b) { return a /= b; }
	friend modint operator ^(modint a, int b) { return a ^= b; }
	friend bool operator ==(modint a, int b) { return a.x == b; }
	friend bool operator !=(modint a, int b) { return a.x != b; }
	bool operator ! () { return !x; }
	modint operator - () { return x ? mod - x : 0; }
	bool operator <(const modint& b)const { return x < b.x; }
	bool operator >(const modint& b)const { return x > b.x; }
};
inline modint qpow(modint x, int y) { return x ^ y; }
int fpow(int x, int r)
{
	int result = 1;
	while (r)
	{
		if (r & 1)result = result * x % mod;
		r >>= 1;
		x = x * x % mod;
	}
	return result;
}
 
namespace binom {
	int fac[N], ifac[N];
	int __ = []
	{
		fac[0] = 1;
		for (int i = 1; i <= N - 5; i++)
			fac[i] = fac[i - 1] * i % mod;
		ifac[N - 5] = fpow(fac[N - 5], mod - 2);
		for (int i = N - 5; i; i--)
			ifac[i - 1] = ifac[i] * i % mod;
		return 0;
	}();
 
	inline int C(int n, int m)
	{
		if (n < m || m < 0)return 0;
		return fac[n] * ifac[m] % mod * ifac[n - m] % mod;
	}
 
	inline int A(int n, int m)
	{
		if (n < m || m < 0)return 0;
		return fac[n] * ifac[n - m] % mod;
	}
}
using namespace binom;
void add(int& x, const int& y) {
	(x += y) %= mod;
}
signed main()
{
	ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0);
	int n;
	cin >> n;
	vector<int>a(n + 1), pre(n + 1);
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		pre[i] = pre[i - 1] + a[i];
	}
	vector<vector<modint>>dp(n + 1, vector<modint>(pre[n] + 2));
	dp[1][pre[1] + 1] = 1;
	for (int i = 1; i < n; i++) {
		for (int j = 1; j <= pre[i] + 1; j++) {
			for (int x = 0; x < a[i + 1]; x++) {
				for (int k = 1; k < j; k++) {
					dp[i + 1][x + k + 1] += dp[i][j] * C(j - k + a[i + 1] - x - 2, a[i + 1] - x - 1);
				}
			}
			dp[i + 1][a[i + 1] + j] += dp[i][j];
		}
	}
	modint ans = 0;
	for (int i = 1; i <= pre[n]+1; i++) {
		ans += dp[n][i];
	}
	cout << ans.x << "\n";
 
}

I. Linguistics Puzzle

 代码参考自 Fat beats FAT kicks fatsuyihengFISHER_szdytom

236743781

int n;
int cnt[N * N];
int c1[N], c2[N][N];
int cti(char a) {
	if ('a' <= a) return a - 'a';
	return a - 'A' + 26;
}
int itc(int a) {
	if (a < 26) return 'a' + a;
	return 'A' + a - 26;
}
int t[N];
bool ed;
bool vis[N];
void dfs(int ps) {
	if (ps == n) return ed = 1, void();
	for (int i = 0; i < n; i++) {
		if (vis[i]) continue;
		vis[i] = 1;
		if (cnt[i] == c1[ps]) {
			bool flag = 1;
			for (int j = 0; j < ps; j++) {
				if ((t[j] && c2[j][ps] != cnt[t[j] * n + i]) || (i && c2[ps][j] != cnt[i * n + t[j]])) { flag = 0; break; }
			}
			if (flag) {
				t[ps] = i;
				dfs(ps + 1);
				if (ed) break;
			}
		}
		vis[i] = 0;
	}
}
char ans[N];
signed main()
{
	ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0);
	int T;
	cin >> T;
	while (T--)
	{
		cin >> n;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				cnt[i * j]++;
			}
		}
		for (int i = 1; i <= n * n; i++) {
			string s;
			cin >> s;
			if (s.size() == 1) c1[cti(s[0])]++;
			else c2[cti(s[0])][cti(s[1])]++;
		}
		memset(t, -1, sizeof t);
		ed = 0;
		dfs(0);
		for (int i = 0; i < n; i++) ans[t[i]] = itc(i);
		ans[n] = 0;
		cout << ans << '\n';
		memset(cnt, 0, sizeof(cnt));
		memset(c1, 0, sizeof(c1)), memset(c2, 0, sizeof(c2));
		memset(vis, 0, sizeof(vis));
	}
}
 

D. Balanced Array

感觉和前几题比起来难度不是很大,就是过的人好像不多

#define int long long//__int128 2^127-1(GCC)
#define PII pair<int,int>
const int inf = 0x3f3f3f3f3f3f3f3f, N = 2e6 + 5, mod = 1e9 + 7, P = 131;
int mm[N], bs[N];
int a[N];
int qiu(int l, int r)
{
	return (mm[r] - mm[l - 1] * bs[r - l + 1]) % mod;
}
bool ok(int n, int m)
{
	return (qiu(1, n - 2 * m) + qiu(2 * m + 1, n) - 2 * qiu(m + 1, n - m)) % mod == 0;
}
signed main()
{
	ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0);
	int n;
	cin >> n;
	bs[0] = 1; mm[0] = 0;
	for (int i = 1; i <= n; i++) {
		string op;
		cin >> op;
		for (int j = 0; j < op.size(); j++) {
			int z;
			char r = op[j];
			if (r >= '0' && r <= '9') {
				z = r - '0';
			}
			else if (r >= 'a' && r <= 'z') {
				z = r - 'a' + 10;
			}
			else {
				z = r - 'A' + 36;
			}
			a[i] = a[i] * 62 + z;
		}
		int z = a[i];
		mm[i] = (mm[i - 1] * P + z) % mod;
		bs[i] = bs[i - 1] * P % mod;
	}
	int k = 1;
	string s;
	for (int i = 1; i <= n; i++) {
		while (2 * k + 1 <= i && !ok(i, k)) ++k;
		if (2 * k + 1 > i) s += '0';
		else s += '1';
	}
	cout << s;
}

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值