CF2161

news/2025/11/14 15:56:49/文章来源:https://www.cnblogs.com/Hengqwq/p/19218690

CF2161B Make Connected

赛时看错题了。是只能出现连续两个,又是出现连续三个感觉很不可做啊。
最后的结论是,这个 # 的点要么形成 2 乘 2 的正方形,要么形成一个 L 形。
这种斜着的往往跟 \(x - y\)\(x + y\) 什么的有关系,所以一种很优雅的判断方式就是判断一下 \(\max(x - y) - \min(x - y) \le 1\) 之类的。

Code
#include <bits/stdc++.h>
using namespace std;
const int N = 1e2 + 5;
typedef pair<int, int> pii;
int n, mnx, mny, mxs, mns, mxm, mnm;
char c[N][N];
vector<pii> pos;
void solve(){cin >> n;pos.clear();mxs = mxm = -1e9, mnm = mns = mnx = mny = 1e9;for(int i = 1; i <= n; ++i){for(int j = 1; j <= n; ++j){cin >> c[i][j];if(c[i][j] == '#'){pos.emplace_back(i, j);mnx = min(i, mnx), mny = min(j, mny);mns = min(mns, i + j), mxs = max(mxs, i + j);mnm = min(mnm, j - i), mxm = max(mxm, j - i); }}}if(mxs - mns <= 1 || mxm - mnm <= 1){return cout << "Yes\n", void();}if(pos.size() > 4){cout << "No\n"; return;}// cout << mny << '\n';for(auto [x, y] : pos){x -= mnx, y -= mny;// cout << x << ' ' << y << '\n';if(!(x >= 0 && x <= 1 && y >= 0 && y <= 1)) return cout << "No\n", void();}cout << "Yes\n";
}
int main(){cin.tie(nullptr)->sync_with_stdio(0);int T; cin >> T;while(T--) solve();return 0;
}

CF2161D Locked Out

如果 \(i < j \land a_i + 1 = a_j\) 就把 \((i,j)\) 连边,然后就是一个最大点独立集问题。但我们知道这样还是不好做。考虑按值域一层一层考虑,这一层的决策只跟上一层有关,并且发现我们总是选择一段前缀。那么按此设计 \(f_{i, j}\) 表示第 \(i\) 层选了前 \(j\) 个,\(\le i\) 的最大点独立集。直接转是 \(N^2\) 的,前缀/后缀 max 优化一下,再加个双指针可以做到 \(O(N)\),下面写的是二分。

Code
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5;
vector<int> pos[N], pre[N], suf[N], dp[N];
int n, a[N], ans;
void solve(){cin >> n;for(int i = 1; i <= n + 1; ++i){pos[i].clear(), pre[i].clear(), suf[i].clear(), dp[i].clear();pos[i].emplace_back(0);}for(int i = 1; i <= n; ++i){cin >> a[i];pos[a[i]].emplace_back(i);}for(int i = 1; i <= n; ++i){int siz = pos[i].size();pre[i].resize(siz), suf[i].resize(siz), dp[i].resize(siz);for(int j = 0; j < siz; ++j){int p = pos[i][j];int x = upper_bound(pos[i - 1].begin(), pos[i - 1].end(), p) - pos[i - 1].begin();if(x > 0) dp[i][j] = max(dp[i][j], pre[i - 1][x - 1]);if(x < pos[i - 1].size()) dp[i][j] = max(dp[i][j], suf[i - 1][x] - (x - 1));dp[i][j] += j;}for(int j = 0; j < siz; ++j)pre[i][j] = max((j == 0 ? 0 : pre[i][j - 1]), dp[i][j] - j);for(int j = siz - 1; j >= 0; --j)suf[i][j] = max((j == siz - 1 ? 0 : suf[i][j + 1]), dp[i][j]);}cout << n - suf[n][0] << '\n';
}
int main(){cin.tie(nullptr)->sync_with_stdio(0);int T; cin >> T;while(T--) solve();return 0;
}

CF2161E Left is Always Right

如果记 \(d\)\([i, i + k - 1]\) 中 1 的个数 - 0 的个数。发现当 \(i \gets i + 1\) 时,\(d \gets d + 2/d/d - 2\)。因此当一个地方 \(i \to i + 1\) 出现 \(1 \to 0\) 时,前面的 \(d\) 肯定是 1,后面的 \(d\) 肯定是 -1,并且 \(i + k\) 这个位置肯定是 0。
然后就卡在这了。实际上再往后模一步会发现,如果下一位继续放 0,那么 \(i + 1 + k\) 也得放 0,如果下一位放 1,那么 \(i + 1 + k\) 也得放 1。发现有周期性,循环节长度是 \(k - 1\),也就是从此之后的所有位置都确定了。
那么考虑枚举前缀 1 的长度 \(i\)(如果第一位是 0 就枚举 0,对称的,第一位是 ? 的话就赋值之后都做一遍),这意味着 \(i + 1\) 是 0。那么此时要保证 \(d_{[i, i + k - 1]} = 1\),也就是保证 \([i + 1, i + k - 1]\) 中 1 的个数 - 0 的个数为 0,也即 1 和 0 都放 \(\frac{k - 1}{2}\) 个。但由于周期性,后面的数有可能已经确定了,并影响前面的决策。这要求后面所有模 \(k - 1\) 同余的位置的取值都相同。然后维护一些桶判断是否冲突,然后再对没有确定的位置进行计数即可(简单组合数)。
最后 \(k\) 位题目的限制直接没了,有一些 corner。

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5, mod = 998244353;
int n, k, a[N];
int fl;
map<int, int> cnt[N], num;
ll fac[N], ifac[N], inv[N];
void erase(int i){if(a[i] == 0) return;int y = i % (k - 1), &x = cnt[y][a[i]];--x; if(x == 0){cnt[y].erase(a[i]);if(cnt[y].size() == 1) fl--, num[cnt[y].begin() -> first]++;else num[a[i]]--;}
}
void add(ll &x, ll y){ (x += y) %= mod; }
ll C(int x, int y){if(y > x || y < 0) return 0;return fac[x] * ifac[y] % mod * ifac[x - y] % mod;
}
void solve(){cin >> n >> k;for(int i = 1; i <= n; ++i){char c; cin >> c;if(c == '0') a[i] = -1;else if(c == '1') a[i] = 1;else a[i] = 0;}auto cal = [](){ll ret = 0;if(a[1] == -1) for(int i = 1; i <= n; ++i) a[i] *= -1;for(int i = 0; i < k; ++i) cnt[i].clear();for(int i = 1; i <= n; ++i) if(a[i] != 0) cnt[i % (k - 1)][a[i]]++;fl = 0; num.clear();for(int i = 0; i < k - 1; ++i){if(cnt[i].size() == 2) fl++;else if(!cnt[i].empty()) num[cnt[i].begin() -> first]++;}int d = k - 1;for(int i = 1; i <= n - k + 1; ++i){if(a[i] != -1 && i == n - k + 1){int n0 = 0, n1 = 0;for(int j = i; j <= n; ++j){if(a[j] == 1) n1++;else if(a[j] == -1) n0++;}n1 += a[i] == 0;for(int x = max(n1, (k + 1) / 2); x <= n; ++x){add(ret, C(k - n0 - n1, x - n1));}}if(a[i] != 1 && fl == 0){int x = i % (k - 1);if(cnt[x].size() == 2 || (!cnt[x].empty() && cnt[x].begin() -> first == 1));else{int num0 = num[-1] + cnt[x].empty(), num1 = num[1];add(ret, C(d - num0 - num1, d / 2 - num0));}}if(a[i] == -1) break;erase(i);} return ret;};ll ans = 0;if(a[1] == 0){for(int o : {1, -1}){a[1] = o; add(ans, cal());}}else ans = cal();cout << ans << '\n';
}
int main(){cin.tie(nullptr)->sync_with_stdio(0);fac[0] = ifac[0] = fac[1] = ifac[1] = inv[1] = 1;for(int i = 2; i <= 1e5; ++i){fac[i] = (fac[i - 1] * i) % mod;inv[i] = (mod - mod / i) * inv[mod % i] % mod;ifac[i] = (ifac[i - 1] * inv[i]) % mod;}int T; cin >> T;while(T--) solve();return 0;
}

CF2161F SubMST

考虑所选点集的最小斯坦纳树(就是虚树),如果最小斯坦纳树上的点都在原点集中,那么贡献就是虚树上的边权和。
这一部分的贡献是 $ \sum_{(u, v)} (2^{siz_u} - 1)(2^{siz_v} - 1)$。
接着考虑虚点 \(s\) 不在原点集中的情况。本来一个点 \(u\) 连到 \(s\) 就行了,现在我们发现它还要多走一些连到最近的点集中的点 \(x\)。也就是说,对于虚树上所有与 \(u\) 相邻的点,除了离 \(u\) 最近的点 \(x\),都得多走 \(dis(u, x)\)。然后 \(dis(u, x)\) 在原树上本来也被贡献了一次,也就是多 \((deg_u - 2)dis(u, x)\),发现这样能保证联通而且最小。注意考察一下有重叠的情况,我们总是钦定一个方向走树上的原边,其余方向算多的,然后中转多次的情况就是拼起来,因此这么贡献没问题。
那么我们考虑枚举每个点 \(u\) 不在点集中,然后钦定深度 dp,把所有方案的 \(deg_u\) 之和算出来即可。因为直接写不好写,所以加了个容斥,算最小深度 \(\ge d\) 的。

Code ``` #include using namespace std; typedef long long ll; const int N = 5e3 + 5, mod = 1e9 + 7; vector e[N]; int n, siz[N]; ll pw[N], f[N], g[N], cnt[N], sm[N], ways[N], ans; void add(ll &x, ll y){ (x += y) %= mod; } void dfs(int u, int fa, int dep){cnt[dep]++;for(int v : e[u]){if(v != fa) dfs(v, u, dep + 1);} } void get(int u, int fa){siz[u] = 1;for(int v : e[u]){if(v != fa){get(v, u);siz[u] += siz[v];}}for(int v : e[u]){if(v != fa) add(ans, (pw[siz[v]] - 1) * (pw[n - siz[v]] - 1) % mod);} } void solve(){cin >> n;memset(e, 0, sizeof(e));for(int i = 1; i < n; ++i){int u, v;cin >> u >> v;e[u].emplace_back(v);e[v].emplace_back(u);}ans = 0;get(1, 0);for(int u = 1; u <= n; ++u){for(int i = 1; i <= n + 1; ++i) f[i] = g[i] = sm[i] = 0, ways[i] = 1; for(int v : e[u]){for(int d = 1; d <= n + 1; ++d) cnt[d] = 0;dfs(v, u, 1);for(int d = n; d >= 1; --d) cnt[d] += cnt[d + 1];for(int d = 1; d <= n; ++d){ll nwf = (f[d] + g[d] + ways[d]) * (pw[cnt[d]] - 1) % mod,nwg = (f[d] + g[d]) % mod;f[d] = nwf, g[d] = nwg;ways[d] = ways[d] * pw[cnt[d]] % mod;add(sm[d], pw[cnt[d]] - pw[cnt[d + 1]]);}}for(int d = 1; d <= n; ++d){ll res = (f[d] + mod - f[d + 1] + g[d] + mod - g[d + 1]) % mod;add(ans, d * (res + (mod - 2) * (mod + ways[d] - ways[d + 1]) % mod + mod + sm[d]));}}cout << ans << '\n'; } int main(){cin.tie(nullptr)->sync_with_stdio(0);pw[0] = 1;for(int i = 1; i <= 5e3; ++i) pw[i] = pw[i - 1] * 2 % mod;int T; cin >> T;while(T--) solve();return 0; } ```

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

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

相关文章

[题解]P11294 [NOISG 2022 Qualification] Tree Cutting

P11294 [NOISG 2022 Qualification] Tree Cutting 删除一条边,会产生两棵树,此时最优就是将两树的直径端点连起来,答案为两树直径之和再\({}+1\)。 因此考虑枚举删除的边 \((u,v)\),不妨令 \(u\) 为父节点。我们需…

2025-11-14 ZYZ28-NOIP模拟赛-Round6 hetao1733837的record

2025-11-14 ZYZ28-NOIP模拟赛-Round6 hetao1733837的record2025-11-14 ZYZ28-NOIP模拟赛-Round6 hetao1733837的record 比赛链接:ZYZ28-NOIP模拟赛-Round6 比赛背景:无 A.teleport 提交链接:teleport 题面 给定一个…

uniapp开发H5避坑指南

1、H5怎么禁用页面整体拖动的弹性效果(bounce效果)?解决:在页面根元素上添加@touchmove.prevent 2、H5怎么获取地理位置经纬度?方案1:使用HTML5原生APInavigator.geolocation.getCurrentPosition(successCallbac…

【连续3届IEEE出版 | 往届均已完成EI检索】第六届智能电网与能源工程国际学术会议(SGEE 2025)

【连续3届IEEE出版 | 往届均已完成EI检索 | 上海海事大学主办-IEEE Fellow 等大咖主讲报告】第六届智能电网与能源工程国际学术会议(SGEE 2025)第六届智能电网与能源工程国际学术会议(SGEE 2025) 2025年11月28-30日…

nginx做tcp代理时的超时时间参数设置和解释

如果你是在配置HTTP代理,可能会更常用到proxy_read_timeout和proxy_send_timeout。而proxy_timeout在TCP/UDP代理中更常见。 总结proxy_connect_timeout:控制连接建立阶段的超时;proxy_timeout:主要用于stream模块…

【往届会后三个月完成EI检索 | IEEE出版】第二届智能机器人与自动控制国际学术会议(IRAC 2025)

【往届会后三个月完成EI检索 | IEEE出版】第二届智能机器人与自动控制国际学术会议(IRAC 2025)第二届智能机器人与自动控制国际学术会议(IRAC 2025) 2025年11月28-30日,中国-湖南省-湘西土家苗族自治州吉首市 截稿…

精准把控VBAT,轻松规避电源设计99%陷阱

电源设计是一个细致而复杂的过程,其中VBAT的精准把控尤为关键。若处理不当,极易陷入各种陷阱。本文将指导您如何精准把控VBAT,从而轻松规避电源设计中高达99%的常见陷阱,让您的设计更加出色。 在物联网开发中,稳定…

RAID(磁盘阵列)技术介绍

RAID(磁盘阵列)技术介绍介绍RAID 使用的技术、类型、重建方式RAID(磁盘阵列)关键技术数据分条技术:把数据分块,分散存放到多个磁盘上,提高读写并行度数据镜像技术:把同一份数据写到多个磁盘,某个盘坏了还能用…

2025年金属保温装饰板最新标杆企业推荐:铝板保温装饰一体板/外墙保温装饰板/金属保温装饰板/浙江欣阳嘉茂控股集团有限公司

随着建筑节能标准持续提升、绿色建筑政策深入推进,以及城市更新与既有建筑外立面改造需求快速增长,保温装饰一体板作为兼具节能、美观与安全性能的新型外墙材料,正加速成为建筑围护系统的重要选择。然而,当前市场产…

Sora2、Nano Banana AI批量生图视频实战,API低价调用和免费批量生成教程

经过这几年Ai模型迭代升级,越来越多好用的模型出现,让电商人和自媒体的人的工作方便多了许多。以前找个美工折腾半天的产品图、文案配图,现在输入几句话就能生成,质量和速度都远超预期。不过实际用起来就会发现,A…

7 款最佳自托管 AI 工具,快速构建业务应用

7 款值得关注的自托管 AI 工具,助你在安全可控的环境中快速搭建具备智能能力的业务系统。原文链接:https://www.nocobase.com/cn/blog/7-self-hosted-ai-tools-build-business-app 过去一年,我们一直在持续关注自托…

2025年果胶裂解酶批发厂家权威推荐榜单:果胶甲酯酶/果胶酶纤维素酶/果胶酶源头厂家精选

在生物制造与食品工业绿色转型的浪潮下,酶制剂作为高效的生物催化剂,其市场需求持续增长。据行业报告显示,全球工业酶制剂市场规模预计将在2025年达到新高度,其中果胶酶类产品因在果汁澄清、植物提取等领域的广泛应…

carl部分书单

carl部分书单货币战争 伟大的博弈 贸易打造的世界 经济学的思维方式 carl 可能的mbti istj or infj

高精度机器人控制的核心——基于 MYD-LT536 开发板的精密运动控制方案

一、背景:机器人迈向“微米级控制时代”随着智能制造和自动化产业的持续升级,工业机器人不再仅仅承担重复搬运,而是被要求在装配、检测、精密加工等高精度场景中完成微米级控制任务。在这些“高精度机器人控制”应用…

鸿蒙应用开发实战:集成农历功能

如何在HarmonyOS应用中实现精准的农历日期计算与显示引言 在现代生活中,农历日期对于许多传统节日、生日纪念具有重要意义。然而,在移动应用开发中,农历功能的集成往往面临算法复杂、数据处理困难等挑战。本文将分享…

解决Linux 下 root用户删除文件提示:Operation not permitted

问题描述用最高权限rm文件,居然报错Operation not permitted。查看权限也没有问题。可想而知有可能文件被保护了。用命令lsattr检查一下就知道。[root@linux root]# lsattr a.txt  ---i---------- a.txt带属性“ i …

2025 最新波纹管厂家推荐榜:隧道 / 双壁 / 打孔 / 防结晶波纹管优质厂家权威甄选双壁波纹管/打孔波纹管/隧道打孔波纹管公司推荐

引言 在全球基础设施建设提质升级的浪潮中,波纹管作为管网系统核心构件,其品质直接决定工程寿命与安全。据国际管道协会(IPA)最新测评数据,市场上仅 32% 的波纹管产品能同时满足环刚度≥SN8、耐腐蚀性达标、使用寿…

百思沐成品卫生间生产厂家,百思沐集成淋浴房生产厂家、 百思沐整体厨房公司排行、装配式厨房工厂排名 、快装式墙板工厂十大推荐榜--南京正标环保科技

百思沐成品卫生间生产厂家,百思沐集成淋浴房生产厂家、 百思沐整体厨房公司排行、装配式厨房工厂排名 、快装式墙板工厂十大推荐榜--南京正标环保科技百思沐成品卫生间生产厂家,百思沐集成淋浴房生产厂家、 百思沐整…

洛谷题单指南-组合数学与计数-P5664 [CSP-S 2019] Emiya 家今天的饭

原题链接:https://www.luogu.com.cn/problem/P5664 题意解读: Emiya 掌握 n 种烹饪方法和 m 种主要食材,用第 i 种烹饪方法和第 j 种食材可做 a[i][j] 道不同的菜。需选择若干道菜(至少 1 道),满足以下要求:每道…

详细介绍:Endnote | word中加载项消失不见,如何处理?

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