2025 贵阳 代码源 Day 7 模拟赛 code

A

#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define LL long long
#define PII pair<int, int>
// #define PII pair<long long, long long>
#define fr first
#define sc second
#define mp make_pair
const int N = 2e5 + 10, M = 32;
const LL P = 998244353;
int n, a[N], cnt1[M], cnt2[M][M], cnt3[M][M][M], cnt4[M][M][M][M];
int c[N], id[N][4];
int work() {
	memset(c, 0, (n + 5) * sizeof(int)); memset(id, 0, (n + 5) * sizeof(int[4]));
	cin >> n;
	LL ans = (LL)n * (LL)(n - 1) / 2;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		for (int j = 0; j <= 30; j++) if ((a[i] >> j) & 1) id[i][c[i]++] = j;
		if (c[i] >= 1) {
			for (int j = 0; j < c[i]; j++) ans += cnt1[id[i][j]];
		} if (c[i] >= 2) {
			for (int j = 0; j < c[i] - 1; j++) {
				for (int k = j + 1; k < c[i]; k++) {
					ans -= cnt2[id[i][j]][id[i][k]];
				}
			}
		} if (c[i] >= 3) {
			for (int j = 0; j < c[i] - 2; j++) {
				for (int k = j + 1; k < c[i] - 1; k++) {
					for (int l = k + 1; l < c[i]; l++)
						ans += cnt3[id[i][j]][id[i][k]][id[i][l]];
				}
			}
		} if (c[i] >= 4) {
			for (int j = 0; j < c[i] - 3; j++) {
				for (int k = j + 1; k < c[i] - 2; k++) {
					for (int l = k + 1; l < c[i] - 1; l++)
						for (int m = l + 1; m < c[i]; m++)
							ans -= cnt4[id[i][j]][id[i][k]][id[i][l]][id[i][m]];
				}
			}
		}

		if (c[i] >= 1) {
			for (int j = 0; j < c[i]; j++) cnt1[id[i][j]]++;
		} if (c[i] >= 2) {
			for (int j = 0; j < c[i] - 1; j++) {
				for (int k = j + 1; k < c[i]; k++) {
					cnt2[id[i][j]][id[i][k]]++;
				}
			}
		} if (c[i] >= 3) {
			for (int j = 0; j < c[i] - 2; j++) {
				for (int k = j + 1; k < c[i] - 1; k++) {
					for (int l = k + 1; l < c[i]; l++)
						cnt3[id[i][j]][id[i][k]][id[i][l]]++;
				}
			}
		} if (c[i] >= 4) {
			for (int j = 0; j < c[i] - 3; j++) {
				for (int k = j + 1; k < c[i] - 2; k++) {
					for (int l = k + 1; l < c[i] - 1; l++)
						for (int m = l + 1; m < c[i]; m++)
							cnt4[id[i][j]][id[i][k]][id[i][l]][id[i][m]]++;
				}
			}
		}
	}

	for (int i = 1; i <= n; i++) {
		if (c[i] >= 1) {
			for (int j = 0; j < c[i]; j++) cnt1[id[i][j]] = 0;
		} if (c[i] >= 2) {
			for (int j = 0; j < c[i] - 1; j++) {
				for (int k = j + 1; k < c[i]; k++) {
					cnt2[id[i][j]][id[i][k]] = 0;
				}
			}
		} if (c[i] >= 3) {
			for (int j = 0; j < c[i] - 2; j++) {
				for (int k = j + 1; k < c[i] - 1; k++) {
					for (int l = k + 1; l < c[i]; l++)
						cnt3[id[i][j]][id[i][k]][id[i][l]] = 0;
				}
			}
		} if (c[i] >= 4) {
			for (int j = 0; j < c[i] - 3; j++) {
				for (int k = j + 1; k < c[i] - 2; k++) {
					for (int l = k + 1; l < c[i] - 1; l++)
						for (int m = l + 1; m < c[i]; m++)
							cnt4[id[i][j]][id[i][k]][id[i][l]][id[i][m]] = 0;
				}
			}
		}
	}
	cout << ans << '\n';
	return 0;
}
signed main() {
	ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
	// init();
	int T = 1;
	cin >> T;
	while (T--) { work(); }
	return 0;
}

B

#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define LL long long
#define PII pair<int, int>
// #define PII pair<long long, long long>
#define fr first
#define sc second
#define mp make_pair
const int N = 2e5 + 10, M = 32;
const LL P = 998244353;
int n, k, lp[N], ls[N];
string s;
int work() {
	cin >> n >> k >> s;
	int lst = 0;
	vector<PII> v[2]; v[0].clear(); v[1].clear();
	set<int> st[2]; st[0].clear(); st[1].clear();
	for (int i = 1; i < n; i++) {
		if (s[i] != s[i - 1]) {
			ls[lst] = i - lst;
			if (i - lst >= k) v[s[lst] - 'A'].push_back({lst, i - 1});
			if (i - lst == k - 1) st[s[lst] - 'A'].insert(i - 1), st[s[lst] - 'A'].insert(lst);
			if (i - lst >= k + k - 1) {cout << "NO\n"; return 0;}
			lst = i;
		}
	}
	ls[lst] = n - lst;
	if (n - lst >= k) v[s[lst] - 'A'].push_back({lst, n - 1});
	if (n - lst == k - 1) st[s[lst] - 'A'].insert(n - 1), st[s[lst] - 'A'].insert(lst);
	if (n - lst >= k + k - 1) {cout << "NO\n"; return 0;}
	lst = n - 1;
	for (int i = n - 2; i >= 0; i--) {
		if (s[i] != s[i + 1]) {
			lp[lst] = lst - i;
			lst = i;
		}
	}
	lp[lst] = lst + 1;
	if (v[0].empty() && v[1].empty()) {cout << "YES\n"; return 0;}
	if (v[0].size() > 1 || v[1].size() > 1) {cout << "NO\n"; return 0;}
	if (v[0].size() == 1 && v[1].size() == 1) {cout << "YES\n"; return 0;}
	if (!v[0].empty()) {
		int p = 0;
		int l = v[p][0].fr, r = v[p][0].sc;
		// cout << l << ' ' << r << '\n';
		for (int i = l - 1; i >= 0; i--) {
			if (s[i] != s[l]) {
				if (i == 0 || s[i] == s[i - 1] || (s[i] != s[i - 1] && lp[i - 1] + r - l + 1 - k + 1 < k)) {
					cout << "YES\n"; return 0;
				}
			}
		}
		for (int i = r + 1; i < n; i++) {
			if (s[i] != s[r]) {
				if (i == n - 1 || s[i] == s[i + 1] || (s[i] != s[i + 1] && ls[i + 1] + r - l + 1 - k + 1 < k)) {
					cout << "YES\n"; return 0;
				}
			}
		}
	} else {
		int p = 1;
		int l = v[p][0].fr, r = v[p][0].sc;
		for (int i = l - 1; i >= 0; i--) {
			if (s[i] != s[l]) {
				if (i == 0 || s[i] == s[i - 1] || (s[i] != s[i - 1] && lp[i - 1] + r - l + 1 - k + 1 < k)) {
					cout << "YES\n"; return 0;
				}
			}
		}
		for (int i = r + 1; i < n; i++) {
			if (s[i] != s[r]) {
				if (i == n - 1 || s[i] == s[i + 1] || (s[i] != s[i + 1] && ls[i + 1] + r - l + 1 - k + 1 < k)) {
					cout << "YES\n"; return 0;
				}
			}
		}
	}
	cout << "NO\n";
	return 0;
}
signed main() {
	ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
	// init();
	int T = 1;
	cin >> T;
	int Tmp = T;
	while (T--) { work(); }
	return 0;
}

C

#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define LL long long
#define PII pair<int, int>
// #define PII pair<long long, long long>
#define fr first
#define sc second
#define mp make_pair
const int N = 2e5 + 10, M = 18;
const LL P = 998244353;
int n, k, mxl[M], len[N], g[N][M], d[N][M], f[1 << M];
string s;
bool check(int x) {
	memset(f, 0x3f, sizeof(f));
	memset(d, 0x3f, sizeof(d));
	for (int i = 0; i < k; i++) d[n][i] = n + 1;
	for (int i = n - 1; i >= 0; i--) {
		for (int j = 0; j < k; j++) {
			d[i][j] = d[i + 1][j];
			if (g[i][j] >= x) d[i][j] = i;
		}
	}
	f[0] = 0;
	for (int j = 0; j < (1 << k); j++) {
		if (f[j] < n) {
			for (int l = 0; l < k; l++) {
				if (!((j >> l) & 1)) {
					f[j | (1 << l)] = min(f[j | (1 << l)], d[f[j]][l] + x);
				}
			}
		}
	}
	return f[(1 << k) - 1] <= n;
}
int work() {
	cin >> n >> k >> s;
	int lst = 0;
	for (int i = 1; i < n; i++) {
		if (s[i] != s[i - 1]) {
			len[lst] = i - lst;
			if (s[lst] >= 'a' && s[lst] <= 'z') mxl[s[lst] - 'a'] = max(mxl[s[lst] - 'a'], i - lst);
			lst = i;
		}
	}
	len[lst] = n - lst;
	if (s[lst] >= 'a' && s[lst] <= 'z') mxl[s[lst] - 'a'] = max(mxl[s[lst] - 'a'], n - lst);
	for (int i = 0; i < n; i++) if (len[i] == 0) len[i] = len[i - 1] - 1;
	memset(g, 0, sizeof(g));
	for (int i = n - 1; i >= 0; i--) {
		if (s[i] == '?') {
			if (i < n - 1) for (int j = 0; j < k; j++) g[i][j] = g[i + 1][j] + 1;
			else for (int j = 0; j < k; j++) g[i][j] = 1;
		} else {
			if (i < n - 1 && s[i + 1] == '?') g[i][s[i] - 'a'] = g[i + 1][s[i] - 'a'] + 1;
			else if (i < n - 1 && s[i] == s[i + 1]) g[i][s[i] - 'a'] = g[i + 1][s[i] - 'a'] + 1;
			else g[i][s[i] - 'a'] = 1;
		}
	}
	if (n < k) {cout << 0; return 0;}
	int l = 0, r = n, mid = ((l + r) >> 1);
	while (l <= r) {
		mid = ((l + r) >> 1);
		if (check(mid)) l = mid + 1;
		else r = mid - 1;
	}
	cout << r;
	return 0;
}
signed main() {
	ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
	// init();
	int T = 1;
	// cin >> T;
	while (T--) { work(); }
	return 0;
}

D

#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define LL long long
#define DB double
#define PII pair<int, int>
// #define PII pair<long long, long long>
#define fr first
#define sc second
#define mp make_pair
const int N = 1e6 + 10, M = 4e6 + 10;
const LL P = 998244353;
int n, q; LL x[N], y[N], t[N];
struct node {
	LL sum, edt, mnt;
	bool fai;
};
node merge(node x, node y) {
	node u = {0, 0, 0, false};
	u.sum = x.sum + y.sum; u.fai = x.fai | y.fai;
	if (x.edt > y.mnt) u.fai = true;
	u.edt = max(x.edt + y.sum, y.edt);
	u.mnt = min(x.mnt, y.mnt - x.sum);
	return u;
}
struct SEG {
	LL sum[M], edt[M], mnt[M]; bool fai[M];
	void push_up(int u) {
		int ls = u << 1, rs = u << 1 | 1;
		sum[u] = sum[ls] + sum[rs]; fai[u] = fai[ls] | fai[rs];
		if (edt[ls] > mnt[rs]) fai[u] = true;
		edt[u] = max(edt[ls] + sum[rs], edt[rs]);
		mnt[u] = min(mnt[ls], mnt[rs] - sum[ls]);
	}
	void build(int u, int l, int r) {
		if (l == r) {
			sum[u] = t[l]; edt[u] = x[l] + t[l]; mnt[u] = y[l]; fai[u] = false;
			return;
		}
		int mid = (l + r) >> 1, ls = u << 1, rs = u << 1 | 1;
		build(ls, l, mid); build(rs, mid + 1, r);
		push_up(u);
	}
	void modify(int u, int l, int r, int p) {
		if (l > p || r < p || l > r) return;
		if (l == r) {
			sum[u] = t[l]; edt[u] = x[l] + t[l]; mnt[u] = y[l]; fai[u] = false;
			return;
		}
		int mid = (l + r) >> 1, ls = u << 1, rs = u << 1 | 1;
		modify(ls, l, mid, p); modify(rs, mid + 1, r, p);
		push_up(u);
	}
	node query(int u, int l, int r, int a, int b) {
		if (l >= a && r <= b) return {sum[u], edt[u], mnt[u], fai[u]};
		int mid = (l + r) >> 1, ls = u << 1, rs = u << 1 | 1;
		if (mid >= b) return query(ls, l, mid, a, b);
		if (mid < a) return query(rs, mid + 1, r, a, b);
		else return merge(query(ls, l, mid, a, b), query(rs, mid + 1, r, a, b));
	}
} tr;
int work() {
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> x[i];
	for (int i = 1; i <= n; i++) cin >> y[i];
	for (int i = 1; i < n; i++) cin >> t[i]; t[n] = 0;
	tr.build(1, 1, n);
	cin >> q;
	while (q--) {
		int op, a, b, c; cin >> op;
		if (op == 0) {
			cin >> a >> b;
			node res = tr.query(1, 1, n, a, b);
			if (res.fai) cout << "No\n";
			else cout << "Yes\n";
		} else if (op == 1) {
			cin >> a >> b;
			t[a] = b;
			tr.modify(1, 1, n, a);
		} else {
			cin >> a >> b >> c;
			x[a] = b; y[a] = c;
			tr.modify(1, 1, n, a);
		}
	}
	return 0;
}
signed main() {
	ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
	// init();
	// freopen("test.in", "r", stdin);
	// freopen("test.out", "w", stdout);
	int T = 1;
	cin >> T;
	while (T--) { work(); }
	return 0;
}
posted @ 2025-07-28 10:35  2020luke  阅读(29)  评论(0)    收藏  举报