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. ...
随机推荐
- 远程登录Mysql,命令行登录Mysql的方法
1.本地登录MySQL命令:mysql -u root -p //root是用户名,输入这条命令按回车键后系统会提示你输入密码2.指定端口号登录MySQL数据库将以上命令:mysql -u roo ...
- Apache JMeter压力测试工具的安装与使用
官网下载 https://jmeter.apache.org/download_jmeter.cgi 然后解压即可 运行 双击bin/jmeter.bat 汉化 在软件里选择语言重启就会还原,所以这里 ...
- fastjson jsonobject对象转为网址传参pathvalue形式并按首字母排序
效果 代码 @Test public void test() { JSONObject jsonObject = new JSONObject(true); jsonObject.put(" ...
- MinHook 如何对.NET底层的 Win32函数 进行拦截(上)
一:背景 1. 讲故事 在前面的系列中,我们聊过.NET外挂 harmony,他可以对.NET SDK方法进行拦截,这在.NET高级调试领域中非常重要,但这里也有一些遗憾,就是不能对SDK领域之外的函 ...
- java-web与jdbc 的使用
1:本地连接数据库的步骤 1 public class LoginDao { 2 3 // jdbc操作的五部曲 4 5 // 1: 导入jar包 6 // 2: 加载驱动 7 // 3: 获取连接 ...
- 树结构Tree
树结构 平衡顺序二叉树 通过平衡顺序二叉树查数据的时候,也就等同于二分查找的操作 Binary Search 2,3树 二三树 二三树有 node2 和 node3 两种节点,树的规则如图 2-3-4 ...
- Potree 004 点云点大小形状设置
点云数据就是靠海量的点显示来模拟真实世界的.点大小设置就比较重要,例如如果数据稀疏,点显示的时候,可以设置稍微大一些.如果点数据比较密集,则可以显示小一些. 在Potree中,点云定义为PointCl ...
- 如何在FastAPI中玩转GitHub认证,让用户一键登录?
title: 如何在FastAPI中玩转GitHub认证,让用户一键登录? date: 2025/06/22 09:11:47 updated: 2025/06/22 09:11:47 author: ...
- Swag - 将Go注释转换为Swagger文档的强大工具
项目标题与描述 Swag是一个强大的Go语言工具,能够将代码中的注释自动转换为符合Swagger 2.0规范的API文档.项目支持多种主流Go Web框架,包括Gin.Echo等,通过简单的代码注释即 ...
- 别再被 Spring Security 和 Shiro 劝退了!这款国产 Java 权限框架真香!
Hello,大家好,我是程序员NEO. 在 Java 开发中,权限认证是个绕不开的话题.但一提起 Spring Security 或 Shiro,很多人是不是瞬间就头大了?复杂的配置.陡峭的学习曲线, ...