2024/10/14 模拟赛总结

news/2024/10/14 22:22:25

\(0+100+40+0=140\),怎么都会 T3 啊

#A. char

\(dp_{i,j}\) 为已经考虑了文本串前 \(i\) 位且将所有 * 填入了字符,匹配了模式串的前 \(j\) 位的方案总数

转移显然,若第 \(i\) 位不是 *,则只有这一位和模式串相等才会有答案,即 \(dp_{i,j}=\begin{cases}dp_{i-1,j-1} & s_i=t_k\\0 & \text{else}\end{cases}\)

否则当前位可以填任意字符,则 \(dp_{i,j}=\sum dp_{i-1,j}\)

// BLuemoon_
#include <bits/stdc++.h>using namespace std;
using LL = long long;const int kMaxM = 1e3 + 5, kMaxN = 5e4 + 5;
const int kP = 998244853;int n, m, sz[kMaxN];
LL dp[kMaxN][kMaxM], pre[kMaxN][kMaxM], ans;
string s, t[kMaxN];int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);freopen("char.in", "r", stdin), freopen("char.out", "w", stdout);cin >> n >> m >> s;for (int i = 1; i <= m; i++) {cin >> t[i], sz[i] = t[i].size();for (int j = 1; j <= n; j++) {fill(dp[j], dp[j] + sz[i] + 2, 0), fill(pre[j], pre[j] + sz[i] + 2, 0);if (s[j - 1] != '*') {for (int k = 1; k <= sz[i]; k++) {if (s[j - 1] == t[i][k - 1]) {(dp[j][k] += dp[j - 1][k - 1] + (k == 1)) %= kP;}pre[j][k] = pre[j][k - 1] + dp[j][k] % kP;}} else {dp[j][0] = dp[j - 1][0] + 1;for (int k = 1; k <= sz[i]; k++) {(dp[j][k] += (dp[j - 1][0] + pre[j - 1][k] + 1) % kP) %= kP;pre[j][k] = pre[j][k - 1] + dp[j][k] % kP;}}}for (int j = 1; j <= n; j++) {(ans += dp[j][sz[i]]) %= kP;}}cout << ans << '\n';return 0;
}

#B. tree

感觉很像原题啊找到原题了

引入那个 T2 的概念:影响域

由于最多改变一个颜色且 \(n \le 3000\),可以想到枚举修改的点

对于每条边,求出其左右两边的影响域,答案即为左边白点乘右边黑点加左边黑点乘右边白点,枚举修改的点,对于每条边修改影响域中黑白点的数量,直接计算比大小即可

// BLuemoon_
#include <bits/stdc++.h>using namespace std;
using LL = long long;const int kMaxN = 3e3 + 5;vector<pair<int, LL>> g[kMaxN];
int n, c[kMaxN], u[kMaxN], v[kMaxN];
LL ans = 1e18, calc, cnt1[2][kMaxN], cnt2[2][kMaxN], w[kMaxN];  // cnt1 : white   cnt2 : black
unordered_map<int, bool> mp[2][kMaxN];void DFS(int u, int fa, LL lt, int ae, bool flag) {(c[u] == 0 ? cnt1[flag][ae] : cnt2[flag][ae])++, mp[flag][ae][u] = 1;for (pair<int, LL> i : g[u]) {int v = i.first;LL w = i.second;if (v != fa) {if (w < lt) {DFS(v, u, lt, ae, flag);}}}
}
LL Calc(int x, LL ret = calc) {for (int i = 1; i < n; i++) {if (mp[0][i].count(x)) {ret -= w[i] * (cnt1[0][i] * cnt2[1][i] + cnt1[1][i] * cnt2[0][i]);(c[x] == 1) ? (cnt1[0][i]++, cnt2[0][i]--) : (cnt1[0][i]--, cnt2[0][i]++);ret += w[i] * (cnt1[0][i] * cnt2[1][i] + cnt1[1][i] * cnt2[0][i]);(c[x] == 1) ? (cnt1[0][i]--, cnt2[0][i]++) : (cnt1[0][i]++, cnt2[0][i]--);} else if (mp[1][i].count(x)) {ret -= w[i] * (cnt1[0][i] * cnt2[1][i] + cnt1[1][i] * cnt2[0][i]);(c[x] == 1) ? (cnt1[1][i]++, cnt2[1][i]--) : (cnt1[1][i]--, cnt2[1][i]++);ret += w[i] * (cnt1[0][i] * cnt2[1][i] + cnt1[1][i] * cnt2[0][i]);(c[x] == 1) ? (cnt1[1][i]--, cnt2[1][i]++) : (cnt1[1][i]++, cnt2[1][i]--);}}return ret;
}int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);freopen("tree.in", "r", stdin), freopen("tree.out", "w", stdout);cin >> n;for (int i = 1; i <= n; i++) {cin >> c[i];}for (int i = 1; i < n; i++) {cin >> u[i] >> v[i] >> w[i], g[u[i]].push_back({v[i], w[i]}), g[v[i]].push_back({u[i], w[i]});}for (int i = 1; i < n; i++) {DFS(u[i], v[i], w[i], i, 0), DFS(v[i], u[i], w[i], i, 1), calc += w[i] * (cnt1[0][i] * cnt2[1][i] + cnt1[1][i] * cnt2[0][i]);}ans = calc;for (int i = 1; i <= n; i++) {ans = max(ans, Calc(i));}cout << ans << '\n';return 0;
}

#C. wooden

考虑容斥,所有的情况为 \(\mathrm{C}_{\lceil\frac{x}{2}\rceil}^{3}\)

令选的长度为 \(x < u < v < w \le 4x\),那么不满足条件的条件为 \(x+u \le v \le w-u \le 4x-u\)

先想 \(O(n)\) 做法,我们枚举 \(u\),那么对于每一个 \(u\) 其他方案数为 \(\mathrm{C}_{3x-2u+1}^{2}\),把这些式子拆开裂项合并就可以求出最终的式子:\(n^3-\frac{\lceil\frac{x}{2}\rceil\times (\lceil\frac{x}{2}\rceil+1)\times(2\lceil\frac{x}{2}\rceil+1)}{6}+[n\bmod 2=0]\times \lceil\frac{x}{2}\rceil^2\)

按照式子直接算即可

// BLuemoon_
#include <bits/stdc++.h>using namespace std;
using LL = long long;const LL kP = 1e9 + 7, iv = 166666668;LL n, ans, cnt, in;int main() {freopen("wooden.in", "r", stdin), freopen("wooden.out", "w", stdout);cin >> in, n = (in + 1) >> 1, n %= kP, ans = ((in * 3 % kP) * ((in * 3 % kP) - 1) % kP) * ((in * 3 % kP) - 2) % kP, (ans *= iv) %= kP;cnt = (((n % kP) * n % kP) * n % kP) - ((((n % kP) * ((n + 1) % kP) % kP) * ((n + n + 1) % kP) % kP) * iv % kP) % kP, (cnt += kP) %= kP;(in & 1 ^ 1) && ((cnt += (n % kP) * (n % kP) % kP) %= kP);cout << (((ans - cnt) % kP) + kP) % kP << '\n';return 0;
}

#D. stars

人机期望,以后再写

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

IDEA如何用maven打包(界面和命令两种方式)

前言 我们在使用IDEA开发时,如果是springboot项目的话,一般是用maven来管理我们的依赖的。然后,当我们开发完成之后,就需要打包部署了。那么,我们应该如何打包呢? 如何打包(jar包) 首先,我们点击右侧的maven侧边栏,然后点击里面的【clean】,先将以前的包清理掉。然后…

odoo18.0 POS微信支付

我们在前面一节中介绍了如何在销售点(Point of Sale)中使用支付宝进行收款/退款,本节我们将介绍如何使用微信支付完成同样的操作。 模块安装 在设置-POS设置-支付终端中开启微信支付:开启之后,系统会自动把微信支付模块安装上,同样地,POS微信的设置也复用的网站应用中的微…

传统题

题面$\quad $ 我们记 \(F(x)\) 为 \(x\) 为真的方案数,\(len\) 为序列最长连续相同子段长度。 $\quad $ 那么就有: \[ans=\sum _{i=1}^{n}F(len=i)*i \]$\quad $ 也就是: \[\sum _{i=1}^{n}F(len>=i) \]$\quad $ 这里可以画个图,发现结果形如三角形,即可得出上式。再改…

AE软件下载安装

Adobe AE安装步骤 2.1准备工作 https://pan.baidu.com/s/1Hdl1gGIpi4LH9zxUflv5DA?pwd=oap4 下载Adobe After Effects安装包并解压。 确保计算机满足软件安装的配置要求。 2.2安装过程 双击安装程序:双击解压后的文件夹中的 set-up安装程序。 更改安装位置:在安装界面点击文…

洛谷P1219八皇后问题

[USACO1.5] 八皇后 Checker Challenge 题目链接 题目描述 一个如下的 \(6 \times 6\) 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。上面的布局可以用序列 \(2\ 4\ 6\ 1\ 3\ 5\) 来描述,…

Stanford CS149 -- Assignment 4: NanoGPT149

作业描述及代码参见:cs149gpt Warm-Up:访问张量 张量/数组都是按行存储的,四维数组可以看作元素为三维数组的数组,元素大小即为三维数组内元素总数,以此类推。 第 1 部分:简单(但不太高效)的注意力机制实现 主要实现两个矩阵乘法和一个 softmax 运算。第 2 部分:块矩阵…

AGC061F 做题记录

link 事实上这是 CSP模拟赛 #36 的 T4。 记 \(a_i,b_i\) 分别为前 \(i\) 个字符中 \(0\) 的个数对 \(n\) 取模后的值,\(1\) 的个数对 \(m\) 取模后的值。那么,记 \(k\) 为序列长度,合法的序列满足:\(\forall 1\le i < j\le k ,\ (a_i, b_i) \not = (a_j, b_j)\)\(a_k = …