模拟赛 R18

news/2025/10/25 11:42:56/文章来源:https://www.cnblogs.com/Hengqwq/p/19164913

R18 - A 子集计数

题目描述

给定一长度为 \(n\) 的序列 \(a_1,a_2,\cdots,a_n\),再额外给定一常数 \(m\),对每个 \(k=0,1,2,\cdots,n\),请你求出有多少个 \(S\subset \{1,2,3,\cdots,n\}\),满足存在 \(T\subset S\) 且:

  • \(|T|=|S|-k\)
  • \(\sum\limits_{i\in T}a_i\ge m\)

答案对 \(998244353\) 取模。

Solution

签到题。题意就是让我们找有多少个子集,丢掉其中 \(k\) 的元素之后,剩下的权值仍然 \(\ge m\)。那么我们显然是丢掉最小的 \(k\) 个。那么我们就按 \(a_i\) 从小到大排序。考虑枚举分界点 \(i\) 表示我们在 \([i + 1, n]\) 中选一些数使得其 \(\ge m\),在 \([1, i]\) 中选 \(k\) 个数丢掉。这样就能保证我们总是丢掉最小的一些。\([i + 1, n]\) 中选一个子集使其和 \(\ge m\) 用 0-1 背包即可。后半部分的答案显然就是 \(i \choose k\)。注意枚举分界点时总是要钦定 \(i + 1\) 必须要选,要不然会算重。

Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3e3 + 5, mod = 998244353;
int a[N], f[N][N], g[N][N], n, m, c[N][N];
void add(int &x, int y){ (x += y) %= mod; }
signed main(){freopen("subset.in", "r", stdin);freopen("subset.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> m;for(int i = 1; i <= n; ++i) cin >> a[i];sort(a + 1, a + 1 + n);g[n + 1][0] = 1;for(int i = n; i >= 1; --i){for(int j = 0; j <= m; ++j){int nxt = min(m, a[i] + j);add(f[i][nxt], g[i + 1][j]);add(g[i][nxt], g[i + 1][j]);add(g[i][j], g[i + 1][j]);}}c[0][0] = 1;for(int i = 1; i <= n; ++i){c[i][0] = 1;for(int j = 1; j <= i; ++j){c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;}}for(int k = 0; k <= n; ++k){int ans = 0;for(int i = k; i <= n; ++i){add(ans, c[i][k] * f[i + 1][m]);}cout << ans << ' ';}return 0;
}

R18 - B 括号序列

题目描述

给定一个包含左右括号的序列 \(s\),你可以进行若干次以下两种操作之一:

  1. 在任意位置插入一个左括号或者右括号;
  2. 将序列最后的括号移到最前。

现在你希望通过进行这两种操作将括号序列变为合法括号序列,并且 \(1\) 操作的次数尽可能少。在此基础上,你希望最终括号序列的字典序尽可能小。

一个括号序列被称为合法括号序列,当且仅当可以在其中插入 1+ 使其成为一个合法的表达式,例如 ()()((()))() 均为合法括号序列,但 ()(())(((())()) 则不是。

Solution

首先,我们得想到先把左括号和右括号的数量补齐成相同的。要不然无论如何都不可能合法。但如果你先考虑旋转,再去补的话,就不太可做,因为这样很难注意到一个关键但是显然的性质,每次你添加的左括号/右括号个数是相同的,并且第一问的答案跟这个性质有很大关系。
进一步地,把数量补齐之后,我们发现总是可以通过旋转使其变成一个合法括号序列。用折线法说明即可。第一问首先要求我们添加的字符最少,这显然是我们补齐的数量 \(x\)。断环为链,把旋转操作变成看一段 \([i, i + n - 1]\) 的区间。一个很常见的判括号序列合不合法的 trick,考虑前缀和,如果最小值 \(\ge 0\) 就是合法的(注意用这个得先判断括号个数能配对上)。如果发现这个合法的话,再比较哈希比较字典序即可,这样做完了。

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = 4e5 + 5;
string s;
int sum[N], a[N], st[25][N], n;
ull f[N], P = 131, pw[N];
ull hsh(int l, int r){if(l > r) return 0;return f[r] - f[l - 1] * pw[r - l + 1];
}
bool cmp(int x, int y){int l = 0, r = n;while(l < r){int mid = (l + r + 1) >> 1;if(hsh(x, x + mid - 1) == hsh(y, y + mid - 1)) l = mid;else r = mid - 1;}if(l == n) return 1;return a[x + l] > a[y + l]; 
}
int getmn(int l, int r){int d = log2(r - l + 1);return min(st[d][l], st[d][r - (1 << d) + 1]);
}
void solve(){cin >> s;n = s.size();pw[0] = 1;for(int i = 1; i <= 2 * n; ++i){pw[i] = pw[i - 1] * P;if(i <= n) a[i] = (s[i - 1] == '(' ? 1 : -1);else a[i] = a[i - n]; sum[i] = sum[i - 1] + a[i];int tmp = (a[i] == 1 ? 1 : 0);f[i] = f[i - 1] * P + tmp;st[0][i] = sum[i];}int c = -sum[n];for(int i = 1; (1 << i) <= 2 * n; ++i){for(int j = 1; j + (1 << i) <= 2 * n; ++j){st[i][j] = min(st[i - 1][j], st[i - 1][j + (1 << i - 1)]);}}if(c >= 0){for(int i = 1; i <= c; ++i) cout << '(';int ans = 0;for(int i = 1; i <= n; ++i){int x = getmn(i, i + n - 1);if(x - sum[i - 1] + c >= 0){if(!ans) ans = i;else if(cmp(i, ans)) ans = i;}}for(int i = ans; i <= ans + n - 1; ++i) cout << (a[i] == 1 ? '(' : ')');} if(c < 0){int ans = 0;for(int i = 1; i <= n; ++i){int x = getmn(i, i + n - 1);if(x - sum[i - 1] >= 0){// cout << i << '\n';if(!ans) ans = i;else if(cmp(i, ans)) ans = i;}}for(int i = ans; i <= ans + n - 1; ++i) cout << (a[i] == 1 ? '(' : ')');for(int i = 1; i <= -c; ++i) cout << ')';}cout << '\n';
}
int main(){cin.tie(0)->sync_with_stdio(0);int T;cin >> T;while(T--) solve();return 0;
}

R18 - C 字典树

题目描述

给定 \(n\) 个由小写字母组成的字符串 \(s_1,s_2,\cdots,s_n\),每个字符串的长度都是 \(m\)。现在我们随机打乱每个字符串内部的字符之间的顺序得到新的字符串 \(t_1,t_2,\cdots,t_n\),并对新的 \(n\) 个字符串建字典树,求字典树结点个数的期望值。

Solution

容易发现,字典树节点个数就是所有字符串不相同的前缀个数 + 1。
先不看 + 1,在思考一下,对于每次重排过后,我们把第 \(i\) 个字符串前缀字符串组成的集合叫做 \(S_i\) 的话,那么字典树节点个数就是 \(|\bigcup_{i = 1}^n S_i|\)。根据期望的线性性,期望也是可以容斥的。那么就是 \(E(|\bigcup_{i = 1}^n S_i|) = \sum_{T} (-1)^{|T| - 1} E(|\bigcap_{x \in T} S_x|)\)
考虑如何计算一个给定子集的 \(|\bigcap_{x \in T} S_x|\)。这个就等于这些字符串的公共前缀长度 \(len\)。接下来我们认为相同的字符之间也是互不相同的。一个经典技巧,公共前缀长度的期望 = 存在长度为 1 的公共前缀的概率 + 存在长度为 2 的公共前缀的概率 + \(\cdots\) + 存在长度为 \(m\) 的公共前缀的概率。首先我们随意重排所有字符串的方案数固定的 \((m!)^{|T|}\),一个长度为 \(len\) 的公共前缀的贡献恰好会在 \(1\cdots len\) 每次都被贡献 1 次,这也恰好是它对期望的贡献。如果还是不懂把总方案的分母,看成计数问题理解一些应该就懂了。
计算概率就是计算方案数,考虑如何计算存在长度为 \(l\) 的公共前缀的方案数。发现只跟选了那些字符充当公共前缀有关(因为我们把他们随意重排就组成了所有公共前缀),要求就只有得选出 \(l\) 个。那这个对 26 种字符做背包就好。
注意由于我们认为字符之间都是不相同的,所以计数上有一些细节。比如说,从每个字符串中选了一些位置的字符当前缀之后,还得考虑前缀字符之间对应的关系,别少算了。

Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 15, M = 105, mod = 1e9 + 7;
int n, m, f[27][M], g[27][M], cnt[N][27], fac[M], mn[27], c[M][M];
string s[N];
void chmin(int &x, int y){ x = min(x, y); }
void add(int &x, int y){ (x += y) %= mod; }
int qpow(int a, int b){int ret = 1;for(; b; b >>= 1, a = (a * a) % mod)if(b & 1) ret = (ret * a) % mod;return ret;
}
signed main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> m;fac[0] = 1;for(int i = 1; i <= m; ++i) fac[i] = (fac[i - 1] * i) % mod;c[0][0] = 1;for(int i = 1; i <= m; ++i){c[i][0] = 1;for(int j = 1; j <= i; ++j){c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;}}for(int i = 1; i <= n; ++i){cin >> s[i];for(int j = 0; j < m; ++j)cnt[i][s[i][j] - 'a' + 1]++;}int ans = 0, k = qpow(fac[m], n);for(int S = 1; S < (1 << n); ++S){vector<int> tmp;int num = 1;for(int i = 1; i <= n; ++i){if(S & (1 << (i - 1))){tmp.push_back(i);}else num = (num * fac[m]) % mod;}int siz = tmp.size();// if(siz == 1){ add(ans, k * m % mod); continue; } memset(mn, 0x3f, sizeof(mn));for(int i : tmp){for(int j = 1; j <= 26; ++j){chmin(mn[j], cnt[i][j]);}}for(int j = 1; j <= 26; ++j){for(int i = 0; i <= mn[j]; ++i){g[j][i] = 1;for(int x : tmp) g[j][i] = (g[j][i] * c[cnt[x][j]][i]) % mod;}}memset(f, 0, sizeof(f));f[0][0] = 1;for(int i = 1; i <= 26; ++i){for(int j = 0; j <= m; ++j){for(int k = 0; k <= min(mn[i], j); ++k){add(f[i][j], f[i - 1][j - k] * g[i][k] % mod * qpow(fac[k], siz - 1) % mod);}}}int sum = 0;for(int l = 1; l <= m; ++l){// cout << l << ' ' << f[26][l] << '\n';add(sum, f[26][l] * fac[l] % mod * qpow(fac[m - l], siz) % mod);}// cout << S << ' ' << sum * num % mod * qpow(k, mod - 2) % mod << '\n';add(ans, (siz & 1 ? 1 : mod - 1) * sum % mod * num % mod);}cout << ((ans * qpow(k, mod - 2) + 1)) % mod;return 0;
}

R18 - D 量筒注水

题目描述

水平桌面上有 \(n\) 个量筒,每个量筒均为底面积为 \(1\) 平方米且无限高的圆柱。它们之间由 \(m\) 条管道连接,第 \(i\) 条管道连接量筒 \(u_i\)\(v_i\),高度为 \(h_i\) 米(桌面的高度为 \(0\),保证所有 \(h_i\) 互不相同)。初始每个量筒中均没有水。

\(q\) 次询问,每次询问给定一个点 \(a\) 和一个常数 \(t\),问,如果从初始状态开始持续往 \(1\) 号量筒中注入 \(a\) 立方米的水,那么 \(t\) 号量筒中水的高度会变成多少,答案下取整到整数。询问之间互相独立。

部分测试点强制在线。

Solution

\(h_i\) 看成边权,对原图先跑一个最小生成树。我们发现只考虑最小生成树上的边和原问题等价。因为 \(h_i\) 互不相同,当有水经过一条非最小生成树上的边时,所有管道已经形成一个连通器了。这时候去掉这些边显然没有影响。
那么就变成了一个树上问题,首先把这颗最小生成树看成 1 为根。考虑每次二分答案 \(mid\)。找到 \(t\) 能只通过 \(< mid\) 的边到达的离 \(1\) 最近的点(这个点显然是 \(t\) 的某个树上的祖先 \(p\),当然 \(p\) 有可能等于 \(t\))。也就是说,从 1 的水注入这个 \(p\) 开始,他会先流向子树只经过 \(<mid\) 的边能到的点(这个就是 \(t\) 能只通过 \(<mid\) 的边到达的点的集合 \(S\)),然后这些点变成了一个连通器,并且他们会一起上升到高度 \(mid\)。而且我们发现,由于注水的过程类似一种 dfs,所以从 1 的水注入这个 \(p\) 开始,所有注入 1 的水都会流入这个连通器内。那么所需要的水量就是 有 1 的水注入 \(p\) 所需的水量 + \(|S| \times mid\)
考虑 dp 求有水开始注入 \(p\) 所需的水量 \(f_p\)。首先 \(f_1 = 0\)。然后对于一个点 \(u\) 和他树上的父亲 \(fa_{u}\),假设他们之间的边权是 \(w\)。那么类似上面,还是找到 \(fa_u\) 只经过 \(< mid\) 的边能到达的点的集合 \(S\) 和离 1 最近的点 \(v\)。与上面同理,有 \(f_u \gets f_v + |S| \times w\)
kruskal 重构树求一个点只经过 \(<x\) 的边能到达的点,并同时维护离 1 最近的点(深度最浅的点)即可。

Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef tuple <int, int, int> tpi;
typedef pair<int, int> pii;
const int N = 2e5 + 5, inf = 1e18;
vector<pii> tr[N];
vector<int> kt[N];
int a[N], fa[N], n, m, q, V, typ, tot, siz[N], dep[N], st[N][21], f[N];
tpi e[N];
pii p[N];
int getf(int u){ return u == fa[u] ? u : fa[u] = getf(fa[u]); }
void init(int u, int fa){dep[u] = dep[fa] + 1;for(auto [v, w] : tr[u]){if(v != fa) init(v, u);}
}
void dfs(int u, int fa){st[u][0] = fa;for(int i = 1; i <= 19; ++i) st[u][i] = st[st[u][i - 1]][i - 1];if(u <= n) p[u] = pii{dep[u], u}, siz[u] = 1;else p[u] = pii{inf, 0}, siz[u] = 0;for(auto v : kt[u]){if(v != fa){dfs(v, u);p[u] = min(p[u], p[v]);siz[u] += siz[v];}}
}
int get(int u, int w){for(int i = 19; i >= 0; --i){if(a[st[u][i]] < w) u = st[u][i]; }return u;
}
void dp(int u, int fa){for(auto [v, w] : tr[u]){if(v == fa) continue;int x = get(u, w); // on ktf[v] = f[p[x].second] + siz[x] * w;dp(v, u);  }
}
signed main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> m >> q >> V >> typ;a[0] = inf;tot = n;for(int i = 1; i <= 2 * n; ++i) fa[i] = i;for(int i = 1; i <= m; ++i){auto &[w, u, v] = e[i];cin >> u >> v >> w;}sort(e + 1, e + 1 + m);for(int i = 1; i <= m; ++i){auto [w, u, v] = e[i];int x = getf(u), y = getf(v);if(x == y) continue;tr[u].emplace_back(v, w);tr[v].emplace_back(u, w);++tot;kt[tot].emplace_back(x);kt[tot].emplace_back(y);a[tot] = w;fa[x] = fa[y] = tot;}init(1, 0);dfs(tot, 0);dp(1, 0);int lst = 0;while(q--){int v, t; cin >> v >> t;v = (v - 1 + typ * lst) % V + 1;t = (t - 1 + typ * lst) % n + 1;int l = 0, r = v;while(l < r){int mid = (l + r + 1) >> 1;int x = get(t, mid), ver = p[x].second;if(f[ver] + siz[x] * mid <= v) l = mid;else r = mid - 1;}cout << (lst = l) << '\n';}return 0;
}

Summary

T2 这种题还是要冷静一点......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/946060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年盐趣科研教育深度解析:从录取数据到成果落地的全链路拆解

引言 本文聚焦“录取成果与科研落地”这一核心维度,为计划通过科研背景提升冲刺海外名校的申请者提供一份可量化、可验证的客观参考,避免被营销话术裹挟。 背景与概况 盐趣科研教育(ViaX盐趣,官网www.viax.org)成…

2025年盐趣科研教育深度解析:从“科研背景”维度拆解留学突围路径

引言 本文聚焦“科研背景”这一核心维度,对盐趣科研教育进行针对性拆解,为计划通过科研提升申请竞争力的学生提供一份可落地的客观参考。 背景与概况 盐趣科研教育(ViaX盐趣,www.viax.org)成立于2015年,隶属于北…

大素材数据质量校验实战指南:从0.3%差异率到滴水不漏的核对体系

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

备战CSP:考试环境搭建与使用指南

备战CSP:考试环境搭建与使用指南 大家好!“磨刀不误砍柴工”,今天我们的目标就是磨好手上的这把“刀”——完全熟悉并掌握CSP的官方考试环境。熟练操作环境,可以在考场上为你节省宝贵的时间,避免不必要的慌乱。让…

2025年1月暖风机口碑榜:五款主流机型对比与选购避坑

寒冬深夜,孩子写作业手脚冰凉,老人起床怕冷,上班族回家想立刻暖起来——这些场景让“暖风机”成为搜索热词。可打开电商页面,PTC、石墨烯、远红外、四核等名词扑面而来,价格从百元到千元不等,噪音、耗电、干燥、…

2025 年最新推荐装修公司优质品牌排行榜:聚焦环保与工艺,口碑装修公司权威甄选

引言 随着家装市场需求持续增长,消费者对装修品质、环保标准及服务体验的要求愈发严苛。为助力业主精准筛选优质装修资源,本次榜单由中国建筑装饰协会联合行业权威测评机构共同打造,历经 3 个月调研,覆盖全国 28 个…

2025 年最新推荐 WMS 服务商综合实力排行榜:涵盖智能仓储管理系统品牌核心技术优势及协会权威测评结果

引言 在离散制造行业数智化转型浪潮中,WMS 系统对仓储管理效率的提升作用愈发关键。为精准筛选优质服务商,中国仓储与配送协会联合行业专家开展 2025 年度 WMS 服务商测评,采用 “技术实力(40%)+ 落地成效(30%)…

告别“求推荐”的迷茫,如何挑选一家真正专业的直播源码定制开发公司?

引言:为什么你总是在“求推荐”? 在百度知道、360、知乎等问答平台,我们频繁地看到这样的问题:“急需一套直播系统,求推荐一家靠谱的直播源码开发公司!”“想做直播APP,哪家定制开发公司比较专业?”。 这背后,…

加载科室列表

// 加载科室列表$.get(departments, function (res) {if (res.code === 0) {const container = $(#deptList);res.data.forEach(function (dept) {container.append(`<div style="margin:8px 0;"><…

2025 年防腐木厂家最新推荐排行榜:实力品牌品质测评,凉亭 / 地板 / 木屋厂家优选指南

引言 2025 年国内防腐木市场规模预计达 135 亿元,园林景观应用占比超 45%,但市场乱象仍存:部分厂家用劣质木材与简陋工艺降低成本,导致产品耐候性差、寿命短,难以适配极端气候与复杂场景;服务上普遍存在售前咨询…

2025 年最新推荐小程序开发公司排行榜:含定制开发 / 电商 / 预订服务 / 活动报名 / 配送解决方案

引言 当前数字化转型浪潮下,小程序已成为政企打通线上服务、提升运营效率的关键工具,但行业乱象却让选型者陷入困境:不少厂商以模板开发冒充定制服务,交付后功能无法满足需求且难以二次迭代;部分服务商技术储备不…

2025 年离散制造领域 MES 厂商最新推荐榜单:结合中国智能制造产业协会测评权威数据,全面揭晓优质服务商实力

引言 随着离散制造行业数智化转型进入深水区,企业对 MES 系统的需求愈发精细化、专业化。为帮助企业精准筛选适配服务商,中国智能制造产业协会联合行业专家团队开展 2025 年度 MES 厂商测评工作,本次测评覆盖全国 2…

跨多端前端框架对比

根据各大框架的独特的特性对Lynx、NativeScript-Vue、Ionic Vue + Capacitor、Quasar Framework、React Native和UniApp等跨端的解决方案都做了比较详细的对比和选型的参考 1. 核心框架对比 框架技术栈渲染模式性能生态…

2025年10月中国办公家具定制公司市场报告:知名厂商列表与评价

引言与现状分析 “办公室刚扩租,家具却迟迟不到位”“定制方案看着高大上,交付后尺寸却对不上”“环保报告齐全,进场后依旧气味刺鼻”——这些吐槽在2025年各大企业行政群里几乎每周都会出现。随着灵活办公、混合办…

Visual Studio Code 的 AI 插件汇总 - 指南

Visual Studio Code 的 AI 插件汇总 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

2025 年独立游戏公司AI 美术设计平台最新推荐榜,技术实力与服务体验双重维度深度测评

引言 为助力独立游戏厂商精准筛选适配需求的 AI 美术设计平台,本次榜单依托中国游戏产业协会 2025 年《游戏美术工具技术测评报告》核心数据,结合第三方调研机构对 200 家独立游戏团队的实地访谈结果制定测评体系。测…

2025年10月中国办公家具定制公司推荐:市场报告与选择指南

正在写新办公室的你,也许正被“工期紧、预算卡、风格要统一、环保要过关”四重压力夹击:传统渠道报价不透明,展厅样品与到货差异大,交付后甲醛超标、售后响应慢等投诉在消协年报里占比连续三年上升。工信部2024年《…

详细介绍:JavaScript学习笔记(十七):ES6生成器函数详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年门窗工厂最新推荐排行榜:聚焦精湛工艺与先进技术,精选江苏、广东等地十家优质企业,为消费者选购提供可靠参考

引言 当前门窗市场产品质量参差不齐,部分厂家为逐利偷工减料,使用劣质原材料,导致产品安全性能低、隔热保温效果差;行业工艺水平差距大,小型工厂因设备和技术人员不足,产品密封性、抗压性不达标,易出现漏水、变…

如何构建高效 AI 智能体 - 详解

如何构建高效 AI 智能体 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…