2024 ICPC南京
The 2024 ICPC Asia Nanjing Regional Contest
外榜 https://board.xcpcio.com/icpc/49th/nanjing
铜线: 3题406-137 ~ 4题607
银线: 4题606-357 ~ 5题650
金线: 5题645-467 6题+
难度(个人感觉):
纯签: E
半签: J
Easy: K
Mid: GB
E
题意
一个字符串循环左移(第一个放到最后)最多\(k\)次,求包含子串"nanjing"的最大数量。
思路
水题,暴力即可。
代码
void solve() {
int n, k;
cin >> n >> k;
string s;
cin >> s;
auto find = [&] (string s) -> int {
int ans = 0;
for (int i = 6; i < n; i++) {
string str = s.substr(i - 6, 7);
if (str == "nanjing") {
ans++;
}
}
return ans;
};
int ans = find(s);
for (int i = 0; i < std::min(7, k); i++) {
char x = s[0];
std::reverse(all(s));
s.pop_back();
std::reverse(all(s));
s.push_back(x);
ans = std::max(ans, find(s));
}
cout << ans << "\n";
}
J
题意
一共\(k\)个人,你与\(n\)个是好友。
有\(m\)条消息,每条消息和某两个人相关,如果你和这两个人都是好友,就能看到这条消息。
最多可以添加两个新好友,求能看到的最多的消息数量。
思路
要么选两个之间有消息的,要么直接选两个相关消息最多的。
代码
void solve() {
int n, m, k;
cin >> n >> m >> k;
vector<bool> a(k + 1);
for (int i = 0; i < n; i++) {
int x;
cin >> x;
a[x] = 1;
}
vector<int> cnt(k + 1);
int ans = 0;
std::map<std::pair<int, int>, int> mp;
for (int i = 0; i < m; i++) {
int x, y;
cin >> x >> y;
if (a[x] && a[y]) {
ans++;
} else if (a[x]) {
cnt[y]++;
} else if (a[y]) {
cnt[x]++;
} else {
if (x == y) {
cnt[x]++;
} else if (x > y) {
std::swap(x, y);
}
mp[{x, y}]++;
}
}
int add = 0;
for (auto [o, s] : mp) {
auto [x, y] = o;
add = std::max(add, s + (x != y) * (cnt[x] + cnt[y]));
}
std::sort(all(cnt), std::greater<>() );
add = std::max(add, cnt[0] + cnt[1]);
cout << ans + add << "\n";
}
K
题意
一共\(w \le 10^9\)个格子,其中\(n\)个红色,\(m\)个黑色,其他都是白色。
使用长度为\(k\)的带子覆盖所有红色,且不能覆盖到黑色,每个格子最多覆盖一次。
求需要的最少带子的数量,或者不存在方案。
思路
用黑色把w个格子分成若干个区间,在每个区间内去覆盖,带子不能超出区间。
对于每个区间,先以最左端的红色为起点,依次向右覆盖,最后一个超出区间,就需要向左移,和前一个重叠了,前一个也需要向左移,依此类推,如果最左端的也超出区间,则不存在方案。
算是个模拟吧。
代码
void solve() {
int n, m, k, w;
cin >> n >> m >> k >> w;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
vector<int> b(m);
for (int i = 0; i < m; i++) {
cin >> b[i];
}
b.push_back(0);
b.push_back(w + 1);
std::sort(all(a));
std::sort(all(b));
std::vector<std::pair<int, int>> seg;
for (int i = 1; i < b.size(); i++) {
seg.push_back({b[i - 1] + 1, b[i] - 1});
}
int ans = 0;
vector<int> res;
for (auto [l, r] : seg) {
int x = std::lower_bound(all(a), l) - a.begin();
int y = std::lower_bound(all(a), r + 1) - a.begin() - 1;
if (x >= n || x > y) {
continue;
}
if (r - l + 1 < k) {
cout << -1 << "\n";
return;
}
vector<std::pair<int, int>> seg2;
int tail;
for (int i = x; i <= y; i++) {
if (i == x) {
tail = a[i] + k - 1;
seg2.push_back({a[i], tail});
} else if (a[i] > tail) {
tail = a[i] + k - 1;
seg2.push_back({a[i], tail});
}
}
if (seg2.back().second > r) {
auto &[L, R] = seg2.back();
int del = R - r;
L -= del, R -= del;
for (int i = seg2.size() - 2; i >= 0; i--) {
if (seg2[i].second >= seg2[i + 1].first) {
int del = seg2[i].second - seg2[i + 1].first + 1;
seg2[i].first -= del;
seg2[i].second -= del;
}
}
if (seg2[0].first < l) {
cout << -1 << "\n";
return;
}
}
for (auto [L, R] : seg2) {
res.push_back(L);
}
ans += seg2.size();
}
cout << ans << "\n";
for (auto i : res) {
cout << i << " ";
}
cout << "\n";
}
G
题意
- 交互
一棵\(n\)节点的二叉树,最多可以\(p\)次询问,\(2^p \le n\)。找出一个事先设定的特殊点。
int query(int u, int v) { // 每次询问两个节点
std::cout << "? " << u << " " << v << std::endl;
int t;
std::cin >> t;
// t = 0 特殊点离 u 近
// t = 1 特殊点与 u v 的距离相等
// t = 2 特殊点离 v 近
// 距离表示简单路径上的边数
return t;
}
思路
\(log_2n\)次查询,明显二分。vp时写了2小时二分,写了一坨没做出来。
看官方题解发现,要以树的重心为分界点走分支。每次查询重心子树最大的两个子节点,离重心近则分离两个子树,否则分离除了离得近的子树的所有节点。
代码
void solve() {
int n;
cin >> n;
vector<vector<int>> e(n + 1);
for (int i = 1; i <= n; i++) {
int x, y;
cin >> x >> y;
if (x) {
e[i].push_back(x);
e[x].push_back(i);
}
if (y) {
e[i].push_back(y);
e[y].push_back(i);
}
}
auto query = [&] (int u, int v) -> int {
cout << "? " << u << " " << v << std::endl;
int t;
cin >> t;
return t;
};
vector<bool> del(n + 1);
vector<int> size(n + 1), max(n + 1);
auto dfs = [&] (auto &&dfs, int root) -> void {
int g;
auto find = [&] (auto &&find, int x, int fa) -> void {
size[x] = 1;
max[x] = 0;
for (auto u : e[x]) {
if (u != fa && !del[u]) {
find(find, u, x);
size[x] += size[u];
max[x] = std::max(max[x], size[u]);
}
}
max[x] = std::max(max[x], n - size[x]);
if (max[x] <= n / 2) {
g = x;
}
};
find(find, root, 0);
find(find, g, 0);
vector<std::pair<int, int>> son;
for (auto u : e[g]) {
if (!del[u]) {
son.push_back({size[u], u});
}
}
std::sort(all(son), std::greater<> ());
if (son.empty()) {
cout << "! " << g << std::endl;
return;
}
int u = g, v = 0;
if (son.size() == 1) {
v = son[0].second;
int t = query(u, v);
if (t == 0) {
cout << "! " << u << std::endl;
} else {
cout << "! " << v << std::endl;
}
} else {
u = son[0].second, v = son[1].second;
int t = query(u, v);
if (t == 0) {
del[g] = 1;
n = size[u];
dfs(dfs, u);
} else if (t == 2) {
del[g] = 1;
n = size[v];
dfs(dfs, v);
} else {
del[u] = del[v] = 1;
n -= size[u] + size[v];
dfs(dfs, g);
}
}
};
dfs(dfs, 1);
}
B
题意
一个包含\(012\)三种字符的字符串,可以执行任意次操作,每次操作,可以将某个\(2\)改为\(0\)或\(1\),或者选择相邻的两个\(0\)或\(1\)删掉并拼接字符串。求字符串可以达到的最短长度。
思路
神秘题目。
若删除两个字符,一定是删除一个奇数位一个偶数位,且每个字符下标的奇偶性不会变。
将所有偶数位取反,那么删除操作就变成了删除相邻两个不同的,则最终字符串一定是全\(0\)或全\(1\)。
所以\(2\)就可以每次修改成当前数量少的那一个。
代码
void solve() {
string s;
cin >> s;
for (int i = 1; i < s.size(); i += 2) {
if (s[i] == '0') {
s[i] = '1';
} else if (s[i] == '1') {
s[i] = '0';
}
}
int s0 = std::count(all(s), '0');
int s1 = std::count(all(s), '1');
int s2 = std::count(all(s), '2');
if (s0 + s2 < s1) {
cout << s1 - (s0 + s2) << "\n";
} else if (s1 + s2 < s0) {
cout << s0 - (s1 + s2) << "\n";
} else {
cout << ((s0 + s1 + s2) & 1) << "\n";
}
}
2024 ICPC南京的更多相关文章
- 2013 ACM/ICPC南京邀请赛B题(求割点扩展)
题目链接:http://icpc.njust.edu.cn/Contest/194/Problem/B B - TWO NODES 时间限制: 10000 MS 内存限制: 65535 KB 问题描述 ...
- 2018 ACM ICPC 南京赛区 酱油记
Day 1: 早上6点起床打车去车站,似乎好久没有这么早起床过了,困到不行,在火车上睡啊睡就睡到了南京.南航离南京南站很近,地铁一站就到了,在学校里看到了体验坐直升机的活动,感觉很强.报道完之后去吃了 ...
- ICPC南京补题
由于缺的题目比较多,竟然高达3题,所以再写一篇补题的博客 Lpl and Energy-saving Lamps During tea-drinking, princess, amongst othe ...
- HDU 4811 Ball -2013 ICPC南京区域现场赛
题目链接 题意:三种颜色的球,现给定三种球的数目,每次取其中一个放到桌子上,排成一条线,每次放的位置任意,问得到的最大得分. 把一个球放在末尾得到的分数是它以前球的颜色种数 把一个球放在中间得到的分数 ...
- 2013 ACM/ICPC 南京网络赛F题
题意:给出一个4×4的点阵,连接相邻点可以构成一个九宫格,每个小格边长为1.从没有边的点阵开始,两人轮流向点阵中加边,如果加入的边构成了新的边长为1的小正方形,则加边的人得分.构成几个得几分,最终完成 ...
- 2018 ICPC南京网络赛 L Magical Girl Haze 题解
大致题意: 给定一个n个点m条边的图,在可以把路径上至多k条边的权值变为0的情况下,求S到T的最短路. 数据规模: N≤100000,M≤200000,K≤10 建一个立体的图,有k层,每一层是一份原 ...
- 2018年10月14日ICPC南京站参赛总结
这次比赛消耗掉了我们全部的信心和精力 在热身赛上,总体来说还是比较愉快的,这个时候心态就不对 正赛的时候我们遇到了A题签到题 我一开始是读错了题意了,认为这个题是一个裸的SG函数,而且那么多人秒过 W ...
- 【2018 ICPC南京网络赛 A】An Olympian Math Problem(数论题)
Alice, a student of grade 6, is thinking about an Olympian Math problem, but she feels so despair th ...
- 2019 ICPC南京网络预选赛 I Washing clothes 李超线段树
题意:有n个人,每个人有一件衣服需要洗,可以自己手洗花费t时间,也可以用洗衣机洗,但是洗衣机只有一台,即每个时刻最多只能有·一个人用洗衣机洗衣服.现在给你每个人最早可以开始洗衣服的时间,问当洗衣机的洗 ...
- 2018 ICPC南京网络赛 Set(字典树 + 合并 + lazy更新)
题解:n个集合,你要进行m个操作.总共有3种操作.第一种,合并两个集合x和y.第二张,把特定的集合里面所有的数字加一.第三种,询问在某个集合里面,对于所有数字对2的k次方取模后,有多少个数字等于x. ...
随机推荐
- ZCPC17th E Easy DP Problem
ZCPC17th E Easy DP Problem 希望更丰富的阅读体验?来我的网站阅读趴! Problem 由于这题前面的思维推到部分我没有参与,主要是现学(复习)了一下主席树,所以主要讲主席树的 ...
- Python基础—初识函数(二)
1.给函数参数增加元信息 写好一个函数,然后想为这个函数的参数增加一些额外的信息,这样的话其他使用者就能清楚的知道这个函数应该怎么使用. 使用函数参数注解是一个很好的办法,它能提示程序员应该怎样正确使 ...
- Springboot笔记<6>Rest的使用和请求参数注解@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@MatrixVariable、@CookieValue、@RequestBody
Rest的使用和原理 Rest风格支持(使用HTTP请求方式动词来表示对资源的操作) • 以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveU ...
- 使用 TRL 训练Reward Model奖励模型
训练过程 在此示例中,将微调"distilroberta-base"模型. 该formatting_func函数将指令与所选和拒绝的响应相结合,创建两个新字符串.这些字符串被标记化 ...
- [python]requests VS httpx VS aiohttp
前言 前段时间想着把一个python服务的接口逐渐改成异步的,其中用到requests的地方就要改成httpx或者aiohttp,有点好奇异步请求相较于同步请求有哪些提升,遂做了点小实验. 首先有个服 ...
- MySQL技术内幕 InnoDB存储引擎 B+树索引的使用 笔记
什么时候添加B+树索引呢? 在访问表中很少一部分时使用B+树索引才有意义. Q: 怎么查看索引是否是高选择性的呢? A:可以通过SHOW INDEX 结果中的列 Cardinality 来观察.Car ...
- DRF之JWT签发Token源码分析
DRF之JWT签发Token源码分析 [一]JWT介绍 JWT(JSON Web Token)是一种用于身份认证和授权的开放标准(RFC 7519). 它基于JSON格式定义了一种安全的令牌,用于在客 ...
- pycharm无法正常调试问题
pycharm无法正常调试问题 1.错误代码 已连接到 pydev 调试器(内部版本号 231.8109.197)Traceback (most recent call last): File &qu ...
- Local Deep Research - AI驱动的深度研究助手
项目概述 Local Deep Research (LDR) 是一个AI研究助手,专注于执行深度.迭代的研究任务.核心功能包括: 复杂问题分解:将复杂查询拆分为聚焦的子查询 多源并行搜索:同时搜索网络 ...
- MongoDB入门实战教程(5)
前面我们学习了MongoDB的基本查询命令操作,作为后端开发的我们大部分场景都是在应用程序中和MongoDB进行交互,因此本篇我们来学习一下如何在ASP.NET Core中集成MongoDB. 1 配 ...