The 2021 ICPC Asia Shenyang Regional Contest

news/2024/10/3 16:41:23


B - Bitwise Exclusive-OR Sequence

题意

\(n\)个数,\(m\)个关系,每个关系形如 \(a_u⊕a_v=w\),表示第\(u\)个数与第\(v\)数的异或运算结果为\(w\)。求是否有这样的\(n\)个数满足所有关系要求,如果没有输出\(-1\),如果有输出所有满足要求的方案中,所有数字的和的最小值。

思路

建图,处理每个连通块,选取源点赋值为\(0\)(因为要求最小),途中出现矛盾直接输出\(-1\),否则从低位到高位统计每一位上\(0\)\(1\)的出现次数,最后相加计算最小值。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long longconst int mxn = 1e6 + 5;int n, m, idx;
int to[mxn], nxt[mxn], head[mxn], edge[mxn], point[mxn], pre[mxn], sz[mxn];void add(int u, int v, int w)
{to[++idx] = v;edge[idx] = w;nxt[idx] = head[u];head[u] = idx;
}void init()
{fill(point, point + n, -1);fill(sz, sz + n, 1);iota(pre, pre + n, 0);
}int find(int x)
{return (x == pre[x] ? x : pre[x] = find(pre[x]));
}void join(int u, int v)
{int fu = find(u);int fv = find(v);if (fu != fv){pre[fu] = fv;sz[fv] += sz[fu];}
}void solve()
{cin >> n >> m;init();if (!m){cout << 0 << endl;return;}for (int i = 0; i < m; i++){int u, v, w;cin >> u >> v >> w;u--, v--;add(u, v, w);add(v, u, w);join(u, v);}int ans = 0;for (int i = 0; i < n; i++){if (find(i) != i){continue;}vector<int> cnt(30);queue<int> q;q.push(i);point[i] = 0;while (q.size()){int u = q.front();q.pop();for (int j = head[u]; j; j = nxt[j]){int v = to[j];if (point[v] == -1){point[v] = (point[u] ^ edge[j]);q.push(v);for (int k = 0; k < 30; k++){cnt[k] += ((point[v] >> k) & 1); // 统计1的个数}}else{if ((point[u] ^ point[v]) != edge[j]) // 前后矛盾{cout << -1 << endl;return;}}}}for (int j = 0; j < 30; j++){ans += (1LL << j) * min(cnt[j], sz[i] - cnt[j]); // 二进制加法,cnt是1的个数,sz-cnt是0的个数,min(cnt[j], sz[i] - cnt[j])其实是当前连通快中第j位的贡献}}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1;//cin >> T;while (T--){solve();}return 0;
}

E - Edward Gaming, the Champion

题意

给个字符串,找有几个"edgnb"。

思路

模拟。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long longvoid solve()
{string s;cin >> s;if (s.size() < 5){cout << 0 << endl;return;}int ans = 0;for (int i = 0; i <= s.size() - 5; i++){if (s[i] == 'e' && s[i + 1] == 'd' && s[i + 2] == 'g' && s[i + 3] == 'n' && s[i + 4] == 'b'){ans++;}}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1;//cin >> T;while (T--){solve();}return 0;
}

F - Encoded Strings I

题意

给定一个长度为\(n(n≤1000)\)的字符串\(s\),定义函数\(Fs:Fs(c)=chr(G(c, S))\),表示将\(S\)中的每个字符\(c\)转换为\(chr(G(c, S))\),其中\(G(c, S)\)表示\(S\)中最后一次出现\(c\)之后的后缀中不同的字符个数,\(chr(i)\)表示第\(i\)个字符(第个\(0\)字符是 \(a\),第\(1\)个是\(b\)…)。要求你对\(s\)的每个非空前缀代入到函数中,得到\(n\)个字符串,输出按照字典序排序的最大字符串。

思路

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long longconst int mxn = 1e3 + 5;unordered_map<char, int> cnt[mxn];void solve()
{int n;string s;cin >> n >> s;for (int i = n; i >= 1; i--){int cntt = 0;unordered_set<char> vis;for (int j = i - 1; j >= 0; j--){if (!vis.count(s[j])){vis.insert(s[j]);cnt[i][s[j]] = cntt++;}}}set<string, greater<string>> ans;for (int i = n; i >= 1; i--){string t = s.substr(0, i);for (int j = i - 1; j >= 0; j--){t[j] = cnt[i][t[j]] + 'a';}ans.insert(t);}cout << *ans.begin() << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1;//cin >> T;while (T--){solve();}return 0;
}

J - Luggage Lock

题意

四位密码锁,每次能把一位或连续的几位向上或向下转动一个单位。现给两个密码\(A\)\(B\),求从\(A\)\(B\)的最少操作数。

思路

\(T\)挺大,一个个来铁超时,直接从\(0000\)开始用\(bfs\)打表,查的时候就可以等价于查\(0000\)\(A\)\(B\)之间的差值,即查\(1234\)\(4689\)相当于查\(0000\)\(3455\)

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long longtypedef pair<string, int> pii;map<string, int> ans;
set<string> vis;string cmd[] = { "1000","0100", "0010", "0001", "1100",   "0110", "0011", "1110","0111", "1111", "2000","0200", "0020", "0002", "2200",  "0220",  "0022", "2220", "0222", "2222" }; // 1代表+,2代表-string change(string s, int idx)
{string res = s;for (int i = 0; i < 4; i++){if (cmd[idx][i] == '1'){res[i]++;if (res[i] > '9'){res[i] = '0';}}else if (cmd[idx][i] == '2'){res[i]--;if (res[i] < '0'){res[i] = '9';}}}return res;
}void bfs()
{queue<pii> q;q.push({ "0000", 0 });vis.insert("0000");while (q.size()){string cur = q.front().first;int cnt = q.front().second;q.pop();for (int i = 0; i < 20; i++) // 把cur的全部情况都存了{string t = change(cur, i);if (!vis.count(t)){vis.insert(t);ans[t] = cnt + 1;q.push({ t, cnt + 1 });}}}
}void solve()
{string a, b;cin >> a >> b;if (a == b){cout << 0 << endl;return;}string t = "";for (int i = 0; i < 4; i++){t.push_back((b[i] - a[i] + 10) % 10 + '0');}cout << ans[t] << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1;cin >> T;bfs();while (T--){solve();}return 0;
}


比赛链接 https://codeforces.com/gym/103427

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

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

相关文章

[错误代码]SQLSTATE[HY000] [1045] Access denied for user 20241001@localhost (using password: YES)

这个错误提示 SQLSTATE[HY000] [1045] Access denied for user 20241001@localhost (using password: YES) 表示 MySQL 认证失败,通常是由于用户名或密码不正确导致的。 解决方法检查用户名和密码 确认使用的用户名和密码是否正确。重置密码 如果忘记密码,可以重置密码。检查…

国庆快乐!附ssh实战

小伙伴们,有一段时间没更新了,目前在中科院软件所实习,在这里我祝大家国庆快乐!今天这一期带来ssh命令的实战教程,ssh在工作当中遇到的非常多,因为总是需要登服务器,而且玩法也有不少,这是我常用的几个玩法。 1、Windows直接连接虚拟机启动的Linux。 ssh user@IPV42、从…

当前页面出现致命错误,详细报错请切换至开发模式调试

切换到开发模式:获取详细的错误信息。 检查列定义:确认 Color 列的定义是否合理。 修改列定义:如果需要,增加列的长度。 重新导入数据:确保数据符合新的列定义。希望这些步骤能帮助你解决问题。如果有更多详细的信息,请随时提供。扫码添加技术【解决问题】专注中小企业网…

【软考】2 码制 / 机器数

概念 机器数只能以二进制方式表示,大类分为【无符号数】和【有符号数】 【无符号数】在机器数中没有符号,表示正数 【有符号数】在机器数中有符号,包含正数的其他数值,存在四种操作:【原码】【反码】【补码】【移码】 一、原码 最高位作为符号位进行正数和负数表示 剩余低…

基于selenium的爬取dblp论文的python爬虫

出于阅读文献的需要,导师让我写一个能够爬取dblp上文献资料的爬虫,话不多说,开学。 学习路径总结前端基本知识 request库与bs库 目标特征,规划爬取步骤 动态加载的应对方法-selenium前端基本知识 前端开发是指创建Web页面或应用程序用户可以与之交互的部分。前端开发主要涉…

探索 java 中的各种锁

Java 8+ -序章 一直听说 java 的各种锁、(线程)同步机制,一直没有深入探索。 最近多看了几篇博文,算是理解的比较深入一些了,特写本文做个记录。ben发布于博客园锁是什么? 一种用于 多个线程运行时协调的机制。 作用如下:ben发布于博客园 1、用于多线程之间同步,比如,…

#1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs

这个问题表示在MySQL中,表的一行数据大小超过了最大限制65535字节。这通常是因为表中的某些字段过长导致的。下面是一些解决方法:调整字段类型:将一些较大的字段改为TEXT或BLOB类型。这些类型的存储方式不同于普通字段,可以避免占用过多的行内空间。拆分字段:如果某个字段…

ssh进Windows的一次尝试

1. 配置端口映射 https://chmlfrp.cn/ 1.2 进入管理面板 1.3实名认证(网站声称是阿里云) 1.4下载客户端1.5进入隧道列表添加隧道1.5进入“配置文件”中选择节点生成配置文件并复制 1.6 设置frpc.ini 删除frpc.ini文件,重新建立并粘贴生成的配置文件 1.7 启动 在当前目录下打…