当前位置: 首页 > news >正文

2021 ICPC 沈阳 BEFHJLM(待补

B - Bitwise Exclusive-OR Sequence

种类并查集。

根据每一对的异或关系,可以得到二进制中每一位是否互斥关系,涉及到两种关系的处理用种类并查集更好维护;另外再维护两个点之间是否有关系,之后可能形成多个关系的集合,每个集合又分成了互斥的两个部分,对少的那一堆赋值为 \(1\) 即可。

点击查看代码
#include <bits/stdc++.h>using namespace std;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);for (int i = n / 2 + 1; i < n; i += 1) {siz[i] = 0;}}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)];}
};int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, m;cin >> n >> m;vector<DSU> dsu(30, DSU(2 * n + 1));vector<array<int,3>> e(m);vector g(n + 1, vector<int>());for (auto &[u, v, w] : e) {cin >> u >> v >> w;for (int i = 29; i >= 0; i -= 1) {if (w >> i & 1) {if (dsu[i].same(u, v) || dsu[i].same(u + n, v + n)) {cout << "-1\n";return 0;}dsu[i].merge(u + n, v);dsu[i].merge(u, v + n);}else {if (dsu[i].same(u, v + n) || dsu[i].same(u + n, v)) {cout << "-1\n";return 0;}dsu[i].merge(u, v);dsu[i].merge(u + n, v + n);}}g[u].push_back(v);g[v].push_back(u);}i64 ans = 0;for (int i = 29; i >= 0; i -= 1) {i64 k = 0;vector<int> vis(2 * n + 1), has(2 * n + 1);auto bfs = [&](int x)->int{queue<int> Q;Q.push(x);int res = n, cnt = 0;while (Q.size()) {auto u = Q.front();Q.pop();if (vis[u]) {continue;}vis[u] = 1;if (!has[dsu[i].find(u)]) {cnt += 1;has[dsu[i].find(u)] = 1;res = min(res, dsu[i].size(u));}for (auto &v : g[u]) {if (!vis[v]) {Q.push(v);}}}return (cnt > 1 ? res : 0);};for (int j = 1; j <= n; j += 1) {if (vis[j]) {continue;}k += bfs(j);}ans += (1LL << i) * k;}cout << ans << "\n";return 0;
}

E - Edward Gaming, the Champion

模拟。

签到题,一个典型的错法是:

string s; cin >> s;
for (int i = 0; i < s.size() - 4; i++) { ... }

\(\text{str.size()\ <\ 4}\) 会导致 \(\text{size\_t}\) 类型的下溢出,并且在 \(\text{for}\) 循环判断退出条件时 \(\text{int}\) 会被 \(\text{static\_cast}\)\(\text{size\_t}\) 类型进行比较从而导致访问越界。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long longvoid solve() {string s;cin>>s;int ans=0;for (int i = 0; i <s.size() ; ++i) {string g=s.substr(i,5);if(g=="edgnb")ans++;}cout<<ans<<endl;}signed main() {ios::sync_with_stdio(0);cin.tie(0);int t=1;
//    cin >> t;while (t--) {solve();}
}

F - Encoded Strings I

模拟。

没读,队友写的,看起来直接模拟就行。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
const int mod = 998244353;
#define endl '\n'void solve() {int n;cin >> n;string g;cin >> g;string s;string res = "";s = "";for (int i = 0; i < g.size(); ++i) {
//        s += g[i];string s=g.substr(0,i+1);vector<int>vis(26,-1);int dq=-1;std::reverse(s.begin(), s.end());for(auto &x:s) {if (vis[x - 'a'] == -1) {vis[x - 'a'] = ++dq;
//                dq++;x = 'a' + dq;} else {x = 'a' + vis[x-'a'];}}std::reverse(s.begin(), s.end());res= max(res,s);}cout << res << endl;
}signed main() {ios::sync_with_stdio(0);cin.tie(0);int t=1;
//    cin >> t;while (t--) {solve();}}

H - Line Graph Matching

边双联通分量。

容易发现偶数条边总是可以通过贪心匹配完的,奇数条边会有一条边不能被匹配;再进一步分析,如果奇数条边中删的边是割边,那么分成的两个联通块中边数有奇数的就会缺少匹配,所以要保证割掉这条边后两个联通块都是偶数边才会更优。

具体地,用边双联通分量缩点后,对于每个子树内是偶数边数时,可以删掉割边计算答案;非割边的情况可以预处理即可。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
const int mod = 998244353;
#define endl '\n'
const int N=5e5+3;
#define endl '\n'
int  cnt;
int dfn[N], low[N];
vector<array<int,3>> g[N];
vector<int>ans[N];
stack<int> st;
int dcc;
///c[x]表示x所属的边双联通分量编号
int c[N];
int s = 0;void tarjan(int x, int las) {low[x] = dfn[x] = ++cnt;st.push(x);for (auto f: g[x]) {pair<int,int>i={f[0],f[1]};if (i.second == (las ^ 1)) continue;if (!dfn[i.first]) {tarjan(i.first, i.second);low[x] = min(low[x], low[i.first]);} else low[x] = min(low[x], dfn[i.first]);}if (dfn[x] == low[x]) {vector<int> vec;dcc++;ans[dcc].push_back(x);c[x]=dcc;while (st.top() != x) {ans[dcc].push_back(st.top());c[st.top()] = dcc;st.pop();}st.pop();}
}
void init(int n) {cnt = 0;dcc = 0;while (st.size())st.pop();for (int i = 0; i <= n; ++i) {g[i].clear();ans[i].clear();low[i] = dfn[i] = 0;c[i] = 0;}
}
vector<array<int,2>>mp[N];
int a[N];
int res=0;
int f[N];
void dfs(int u,int fa) {f[u] = a[u];for (auto [v, w]: mp[u]) {if (v == fa)continue;dfs(v, u);f[u] += f[v]+1;if (f[v] % 2 == 0) {res = max(res, s - w);}}
}
void solve() {int n, m;cin >> n >> m;vector<int> du(n + 1);vector<array<int, 3>> edge;for (int i = 1; i <= m; ++i) {int u, v, w;cin >> u >> v >> w;s += w;g[u].push_back({v, i << 1, w});g[v].push_back({u, i << 1 | 1, w});}if (m % 2 == 0) {cout << s << endl;return;}for (int i = 1; i <= n; ++i) {if (!dfn[i]) tarjan(i, 0);}for (int i = 1; i <= n; ++i) {for (auto [v, id, w]: g[i]) {if (c[v] != c[i]) {mp[c[i]].push_back({c[v], w});}}}for (int i = 1; i <= dcc; ++i) {std::sort(mp[i].begin(), mp[i].end());mp[i].erase(unique(mp[i].begin(), mp[i].end()), mp[i].end());}vector<int> vis(n + 1);for (int i = 1; i <= n; ++i) {if (vis[i] == 0) {int sum = 0;queue<int> q;q.push(i);while (q.size()) {auto u = q.front();q.pop();vis[u] = 1;for (auto [v, idx, w]: g[u]) {if (c[v] == c[u]) {res= max(res,s-w);sum++;if (vis[v] == 0) {vis[v] = 1;q.push(v);}}}}a[c[i]] = sum;}}
//    cout<<res<<endl;
//    for (int i = 1; i <= dcc; ++i) {
//        for (auto x: ans[i]) {
//            cout << x << ' ';
//        }
//        cout << endl;
//    }
//    cout << endl;for (int i = 1; i <= dcc; ++i) {a[i] /= 2;
//        cout << a[i] << ' ';}dfs(1, 0);cout << res << endl;
}signed main() {ios::sync_with_stdio(0);cin.tie(0);int t=1;
//    cin >> t;while (t--) {solve();}}

J - Luggage Lock

最短路。

发现给定的两个字符串可能有 \(1\times 10^4\) 种状态,又是多源,复杂度是难以承受的;但是两个不同状态之间有相对关系,将一个状态调整到全 \(0\) 状态后,另外一个状态也调整相应步数,这时候它们的最短路程和未调整前是一样的,即对于 \(u\rightarrow v\) 来说,将 \(u\) 都调整到全 \(0\) 的状态,\(v\) 调整相应的步数,那么在一开始用全 \(0\) 跑完 \(\text{dijkstra}\) 就可以 \(O(1)\) 回答。

点击查看代码
#include <bits/stdc++.h>
#define PII pair<int,int>
#define endl '\n'
using namespace std;using i64 = long long;
const int N=1e4+10,M=1e5+10;
string a, b;vector<PII>g[N];
int vis[N],mn[N];
int ans[M];
void solve() {int m;cin>>a>>b;int s=0;for(int i=0;i<4;i++){int p=(b[i]-a[i]+10)%10;s*=10;s+=p;}
//	cout<<s<<endl;cout<<mn[s]<<endl;
}
int main() {
//	freopen("in.txt", "r", stdin);ios::sync_with_stdio(false);cin.tie(nullptr);queue<PII>q;for(int l=0;l<1;l++){int pp=l;q.push({0,pp});for(int i=0;i<1e4;i++){vis[i]=0;mn[i]=1e9;}mn[pp]=0;while(q.size()){auto [s,x]=q.front();q.pop();if(vis[x]){continue;}vis[x]=1;for (int i = 1; i <= 4; i += 1) {for (int j = 0; j + i - 1 < 4; j += 1) {int nxt = x;for (int k = j; k <= j + i - 1; k += 1) {int p=pow(10,3-k);if (nxt/p%10 == 9) {nxt+=p;nxt-=p*10;}else {nxt+=p;}}if(s+1<mn[nxt]){mn[nxt]=s+1;q.push({s+1,nxt});}nxt = x;for (int k = j; k <= j + i - 1; k += 1) {int p=pow(10,3-k);if (nxt/p%10 == 0) {nxt-=p;nxt+=p*10;}else {nxt-=p;}}if(s+1<mn[nxt]){mn[nxt]=s+1;q.push({s+1,nxt});}}}}}int t=1;cin >> t;while (t--) {solve();}return 0;
}
http://www.gsyq.cn/news/14750.html

相关文章:

  • 【Groovy】Groovy环境搭建
  • 2025年TAB拉链制造商权威推荐榜:创新设计与耐用品质口碑
  • Fluttercon EU 2025 :Let‘s go far with Flutter - 详解
  • io的异步处理io_uring,实现io_uring_tcp_server - 详解
  • P3977 [TJOI2015] 棋盘题解
  • 软工
  • 10.1考试T4(swap)题解
  • 如何在windows10的子系统(wsl)中安装php开发环境 - 教程
  • 网页端如何 打开百度高德腾讯地图导航
  • 完整教程:Coze源码分析-资源库-编辑插件-后端源码-IDL/API/应用服务层
  • 原来的OJ怎么没了?
  • 存在是必然的有机系统,好事多磨,心诚则灵
  • SQL 多表查询速查:JOIN、子查询一文全掌握 - 详解
  • 14.单臂路由(2025年9月29日) - 教程
  • 2025 年检测器厂家推荐 TOP 品牌权威排名,防爆火焰 / 一体化火焰 / 紫外线火焰 / 离子火焰 / 红外线火焰 / 红紫外复合火焰 / 智能火焰检测器公司推荐
  • 【Git】Git 操作指令大全及运用场景详解
  • 9-29
  • 2025 年衬氟鹤管源头厂家 TOP 企业品牌推荐排行榜,天然气 / 低温 / LNG / 撬装 / 底装 / 火车 / 装卸车 / 上装 / 衬氟 / 下装鹤管公司推荐这 10 家
  • 20250928 组合计数
  • 绕过Cloudflare IP白名单限制的技术解析
  • 对于实现贪吃蛇游戏的超详细保姆级解析—下 - 教程
  • 2025 年热转印花膜厂家 TOP 企业品牌推荐排行榜,硅胶 / 五金 / 塑胶 / ABS / 涂料桶 / PP / 水杯 / 温变 / 冰变热转印花膜加工厂推荐
  • 2025 年生物除臭设备厂家 TOP 品牌企业推荐排行榜揭晓:印染厂污水 / 食品厂污水 / 污水处理厂 / 污水泵站 / 污水站 / 餐厨垃圾 / 屠宰场 / 厨余垃圾生物除臭设备公司推荐
  • 2025 年乡墅平台 TOP 服务机构平台推荐排行榜 ,乡墅设计 / 品牌 / 加盟 / 农村自建房 / 建别墅 / 一站式建 / 湖南 / 长沙乡墅服务商推荐这十家公司!
  • 2025 年美缝剂厂家 TOP 企业品牌推荐排行榜,深度剖析美缝剂公司实力与产品优势!
  • 深入理解 Qt 元对象系统:QMetaEnum 的应用与实践 - 指南
  • 2025 年褐藻寡糖厂家 TOP 企业品牌推荐排行榜,农业级 / 食品级 / G 型 / 化妆品级 / 饲料级 / 肥料用褐藻寡糖 / 褐藻寡糖钾盐 / 水剂 / 粉剂 / M 段公司推荐!
  • 2025 年橡胶软接头厂家 TOP 企业品牌推荐排行榜,法兰 / 可曲挠 / 挠性 / KXT / 耐油 / EPDM / 耐腐蚀 / 三元乙丙橡胶软接头 / 橡胶柔性软接头公司推荐!
  • 2025 聚焦人力资源管理系统厂商 TOP 推荐排行榜单,洞察人力资源管理系统前沿技术与服务实力!
  • 苏州昆山GEO优化/2025苏州GEO产品优化与谷歌出海营销服务商推荐:精准触达全球客户