2025 ICPC 南京区域赛 CFGIJ

news/2025/11/17 20:39:58/文章来源:https://www.cnblogs.com/Kescholar/p/19234347

C. Distributing Candies

思维。

奇数无论怎么分都会分出一个偶数,而奇数不能整除偶数;偶数的话对半分即可。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {i64 n;std::cin >> n;if(n & 1) {std::cout << "No\n";return;}std::cout << "Yes\n";std::cout << n / 2 << " " << n / 2 << "\n";}
int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t;std::cin >> t;while (t--) {solve();}return 0;
}

F. Bitwise And Path

并查集。

按每个值都去建一个并查集,当 \(u, v\)\(w\) 的边时,对 \(w\) 及其子集都进行合并,查询时按位从高到低检查即可,有点类似字典树的思想。

复杂度理论上最坏是 \(2^{12}\times 10^6\),但是在枚举子集的时候很多都是会重合的,直接跳过即可,所以远远到不了上界。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;struct DSU {std::vector<int> f, siz;DSU() {}DSU(int n) {init(n);}void init(int n) {f.resize(n);std::iota(f.begin(), f.end(), 0);siz.assign(n, 1);}int find(int x) {while (x != f[x]) {x = f[x] = f[f[x]];}return x;}bool same(int x, int y) {return find(x) == find(y);}bool merge(int x, int y) {x = find(x);y = find(y);if (x == y) {return false;}siz[x] += siz[y];f[y] = x;return true;}int size(int x) {return siz[find(x)];}
};void solve() {int n, q;std::cin >> n >> q;std::vector dsu(1 << 12, DSU(n));auto dfs = [&](auto &&self, int u, int v, int w)->void{if(dsu[w].same(u, v)) {return;}dsu[w].merge(u, v);for(int i = 11; i >= 0; i -= 1) {if(w >> i & 1) {self(self, u, v, w ^ (1 << i));}}};i64 ans = 0;while(q--) {char op;int u, v, w;std::cin >> op >> u >> v;u --, v --;if(op == '+') {std::cin >> w;dfs(dfs, u, v, w);} else {if(!dsu[0].same(u, v)) {ans += -1;continue;}int res = 0;for(int i = 11; i >= 0; i -= 1) {if(dsu[res | 1 << i].same(u, v)) {res |= 1 << i;}}ans += res;}}std::cout << ans << "\n";}
int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t;std::cin >> t;while (t--) {solve();}return 0;
}

G. Bucket Bonanza

贪心。

虽然能合并多个,但只取最大容量和最小流速,显然只合并那两即可,其他的多合没意义。

\(G = v - t\times l\),什么时候两个配对是一定贡献增大的 \(?\)\(G_i \ge 0, G_j \ge 0,v_j > v_i\),那么合并当且仅当 $v_j-tl_i > v_i-tl_i + v_j-tl_j $ 即 \(v_i<tl_j\) 时,选择 \(i,j\) 合并更好。

假设刚开始所有 \(G\ge 0\),那么说明 \(\sum tl_i\) 是必须要丢掉的,如果存在 \(v_i<tl_j\),那么可以让 \(i,j\) 合并,可以理解为让这个小容量去匹配这个大流速的,那么我们就少丢掉了 \(tl_j-v_i\) 的部分,这样显然是更优的。

具体的,对体积维护最小,流速维护最大,然后将询问离线后从小到大按上面所说处理即可。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;i64 V = 0;std::priority_queue<i64,std::vector<i64>,std::greater<i64>> q;for(int i = 0; i < n; i += 1) {i64 x;std::cin >> x;V += x;q.push(x);}i64 S = 0;std::priority_queue<i64> p;for(int i = 0; i < n; i += 1) {int x;std::cin >> x;S += x;p.push(x);}int m;std::cin >> m;std::vector<std::array<int,2>> Q(m);for(int i = 0; i < m; i += 1) {std::cin >> Q[i][0];Q[i][1] = i;}sort(Q.begin(), Q.end());std::vector<i64> ans(m);for(auto &[t, id] : Q) {while(p.size() && q.size() && p.top() * t >= q.top()) {S -= p.top();p.pop();V -= q.top();q.pop();}ans[id] = V - S * t;}for(int i = 0; i < m; i += 1) {std::cout << ans[i] << " \n"[i + 1 == m];}}
int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t;std::cin >> t;while (t--) {solve();}return 0;
}

I. Chi Fan

期望 \(dp\)

因为需要最坏情况下不能超过预算,所以要保证后面预算足够情况下求得最大满意度期望,可以倒着 \(dp\)

\(dp_{i,j,k,p}\) 表示为第 \(i\) 天开始之前还有 \(p\) 元的预算,并且 \(A/B\) 是否付过了。

如果当天在食堂吃饭,转移有 \(dp_{i,j,k,p}\leftarrow \max(dp_{i,j,k,p}, a+P_i\times dp_{i+1,1,k,p-b}+(1-P_i)\times dp_{i+1,j,1,p-b})\)

不在食堂吃饭,如果这之前 \(A,B\) 都付过了,那么这次是一定要付的,转移有 \(dp_{i,j,k,p}\leftarrow \max(dp_{i,j,k,p}, c+ dp_{i+1,0,0,p-d-e})\)

否则他两付钱,转移有 \(dp_{i,j,k,p}\leftarrow \max(dp_{i,j,k,p}, c+P_i\times dp_{i+1,1,k,p-d}+(1-P_i)\times dp_{i+1,j,1,p-d})\)

最后答案就是 \(dp_{1,0,0,m}\)

点击查看代码
#include <bits/stdc++.h>using i64 = long long;using d64 = double;int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int n, m;std::cin >> n >> m;std::vector<std::array<int,6>> ve(n);for(auto &[a, b, c, d, e, p] : ve) {std::cin >> a >> b >> c >> d >> e >> p;}const i64 inf = 1E18;std::vector dp(2,std::vector(2, std::vector<d64>(m + 1)));for(int i = n - 1; i >= 0; i -= 1) {std::vector ndp(2, std::vector(2, std::vector<d64>(m + 1, -inf)));auto &[a, b, c, d, e, p] = ve[i];d64 P = p * 1.L / 100;for(int i = 0; i < 2; i += 1) {for(int j = 0; j < 2; j += 1) {for(int k = 0; k <= m; k += 1) {if(dp[i][j][k] < 0) continue;if(k >= b) {ndp[i][j][k] = std::max(ndp[i][j][k], a + P * dp[1][j][k - b] + (1 - P) * dp[i][1][k - b]);}if(i && j) {if(k >= d + e) {ndp[i][j][k] = std::max(ndp[i][j][k], dp[0][0][k - d - e] + c);}} else {if(k >= d) {ndp[i][j][k] = std::max(ndp[i][j][k], c + P * dp[1][j][k - d] + (1 - P) * dp[i][1][k - d]);}}}}}dp = std::move(ndp);}auto ans = dp[0][0][m];if(ans < 0) {std::cout << -1 << "\n";} else {std::cout << std::fixed << std::setprecision(10) << ans << "\n";}return 0;
}

K. Xiangqi

\(Guess?\)

比较神秘,刚开始是判断在四个角落或者四个边上就可以,但 WA 了,后续是写了个马只要能第一步能跳不在和车同行同列的地方就能来回循环永远躲掉车。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {const int u[] = {2, 2, -2, -2, 1, -1, 1, -1};const int v[] = {1, -1, 1, -1, 2, 2, -2, -2};const int du[] = {1, 1, -1, -1, 0, 0, 0, 0};const int dv[] = {0, 0, 0, 0, 1, 1, -1, -1};int x1, y1, x2, y2;std::cin >> x1 >> y1 >> x2 >> y2;for(int i = 0; i < 8; i += 1) {if(x2 == x1 + du[i] && y2 == y1 + dv[i]) continue;int dx = x1 + u[i], dy = y1 + v[i];if(dx >= 1 && dx <= 9 && dy >= 1 && dy <= 10 && x2 != dx && y2 != dy) {std::cout << "NO\n";return;}}std::cout << "YES\n";}
int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t;std::cin >> t;while (t--) {solve();}return 0;
}

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

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

相关文章

关于一种滚动数组的错误实现方式

滚动数组的大坑!!!!!!!错误写法:swap 一次是 \(O(N)\) 的!!!!!!! int dp[N],dp2[N]; int dodp() {memset(dp,-0x3f,sizeof(dp));memset(dp2,-0x3f,sizeof(dp2));dp2[0]=0;for(int kkk=0;kkk<s.size(…

wps office 2023专业增强版

WPS office 2023专业增强版 v12.8 永久激活下载及安装使用教程 WPS Office是由金山软件股份有限公司自主研发的一款办公软件套装,可以实现办公软件最常用的文字、表格、演示等多种功能。 具有内存占用低、运行速度快、…

React中Class组件和Function组件有何区别

这是一个非常核心的面试题。从表面上看,这只是两种编写组件的方式,但它们的区别远不止语法糖那么简单。下面我将从表象区别、本质区别和设计哲学三个层面来深入剖析。一、表象区别(Syntax & Basic Usage)特性 …

【数学】组合数学(更新中)

1. 组合数学基础 1.1 加法与乘法原理 加法原理有两类方式可以从\(1\)走到\(2\),上面的方式有\(1\)种方法,下面的有\(2\)种方法,我们要想从\(1\)走到\(2\),总共有几种方法呢? 每种方法都可以一次到达,总方案数很显…

Metasfresh的历史

Metasfresh 作为一款聚焦制造业的开源 ERP 系统,其历史不仅有自身团队的独立开发历程,还与 IBM、Adempiere 等早期 ERP 项目有着深厚的渊源,以下是其完整发展脉络:溯源阶段:关联早期 ERP 核心技术根基它的技术源头…

QQ流量分析

首先手机开启热点电脑连接,使得电脑手机处于同一个局域网内 然后打开wireshark开始抓包如图所示,这是我开启抓包后,手机给电脑传输一堆图片后抓到的流量包 第一个问题:UDP or TCP根据流量分析,我使用的QQ在传输时…

mac上如何用fvm设置全局Flutter SDK?

问题描述:在 macOS 上使用 FVM(Flutter Version Management)设置全局 Flutter SDK 时,常见问题是:即使已通过 `fvm use --global` 设置了全局版本,运行 `flutter doctor` 仍提示找不到命令或版本未生效。这通常是…

React面试/讨论中可能深入的问题

1. “React的Diff算法具体是怎样的?” 标准答案要点: 同层比较、Key优化、组件类型差异。 深度剖析: React的Diffing算法基于两个假设,这使得算法从O(n)优化到O(n):不同类型的元素会产生不同的树(如从<div>…

20232404 2025-2026-1 《网络与系统攻防技术》实验六实验报告

1.实验目的掌握Nmap工具的漏洞扫描功能。 识别常见服务的典型漏洞,理解漏洞原理。 使用Metasploit框架利用核心漏洞,获取靶机权限,收集系统信息收集。2.实验环境靶机:Metasploitable linux虚拟机,IP地址192.168.2…

周作业 44

A - khba Loves to Sleep! 题意 给定 \([0,x]\) 上的 \(n\) 个点,你要选出 \([0,x]\) 上不同的 \(k\) 个点,使得从 \(n\) 个点中任意一个点出发,走到 \(k\) 个点中的任意一个的最小距离最大。输出方案。 时间复杂度…

白嫖AI的API中转服务MegaLLM–175刀免费额度教程

@目录0.简介1. 注册就送 75 刀额度2. 邀请码3. discord 社区 0.简介 MegaLLM 是一个 API 中转服务,支持主流模型 OpenAI、Anthropic、Google、Meta 等,以及包括国产千问、DeepSeek、GLM、K2 等。可以在 Claude Code、…

周作业 43

A - Maximum Set 题意 给定区间 \([l,r]\),要求询问满足下列要求的集合的最长长度,以及最长长度下的方案数。对于集合内任意两个不同的数 \(x,y\),满足 \(x\) 是 \(y\) 的倍数,或 \(y\) 是 \(x\) 的倍数。 集合内任…

不是插件,这款公众号排版让你的文章颜值翻倍

直接上图 支持多维度样式定制,字体大小、文字颜色自由调整,内边距、背景色、边框样式随心搭配,还有圆角大小可调,左中右对齐模式一键切换,满足不同文章风格需求。 工具地址:http://www.rhihi.com/fun116.html

二维前缀和与二维差分数组

二维前缀和与二维差分数组二维前缀和 定义 给定一个m行n列的矩阵,它的前缀和sum[i][j]定义为前i行中前i列所有区域格子元素的累加和, 即\(sum[i+1][j+1] = \sum\limits_{row=0, col=0}^{i, j} matrix[row][col]\), …

白嫖MegaLLM–175刀免费额度,使用各种AI模型

@目录0.简介1. 注册就送 75 刀额度2. 邀请码3. discord 社区 0.简介 MegaLLM 是一个 API 中转服务,支持主流模型 OpenAI、Anthropic、Google、Meta 等,以及包括国产千问、DeepSeek、GLM、K2 等。可以在 Claude Code、…

复合剩余问题

Carmichael 函数 \(\lambda(n)\) 定义: 对于正整数 \(n\),Carmichael 函数 \(\lambda(n)\) 定义为最小的正整数 \(m\),使得对于所有与 \(n\) 互素的整数 \(a\),都有: \( a^m \equiv 1 \pmod{n} \) 性质:\(\lambd…

CF2165D Path Split 题解

Description 给定一个长度为 \(n\) 的整数序列 \(a_1, a_2, \ldots, a_n\)。 你希望把 \(a\) 划分成若干个子序列 \(b_1, b_2, \ldots, b_k\),并满足以下条件:\(a\) 中的每个元素恰好属于某个 \(b_i\); 对于每个子序…

gdb 安装linux

要安装 gdb(GNU Debugger)在 Linux 系统上,通常有以下几种方法,适用于大多数 Linux 发行版:? 方法 1:使用包管理器(推荐) 大多数 Linux 发行版都通过包管理器安装 gdb,例如: Debian/Ubuntu sudo apt update…

g for linux

看起来您可能输入有误,想问的是:+ #引号 + grep for linux + #引号 + 或 + #引号 + grep in linux + #引号 + ,这是在 Linux 中常用的命令,用于在文件中搜索特定字符串。? 一、grep 命令简介 grep 是 L…