洛谷 P1196 [NOI2002] 银河英雄传说
1.P8687 [蓝桥杯 2019 省 A] 糖果2.洛谷 P1115 最大子段和3.写模板, 并查集。4.洛谷 P1656 炸铁路5.写模板,树状数组。6.洛谷 P3374 【模板】树状数组 17.洛谷 P3368 【模板】树状数组 28.洛谷 P9237 [蓝桥杯 2023 省 A] 像素放置9.洛谷 P5937 [CEOI1999] Parity Game10.洛谷 P8306 【模板】字典树11.写模板,kmp。12.写模板, LCA。13.洛谷 P1967 [NOIP2013 提高组] 货车运输14.写模板,线段树15.蓝桥杯-百亿富翁16.洛谷 P3372 【模板】线段树 117.模拟比赛-14届研究生组C++省赛18.写模板, 线性筛19.写模板-质数的简单应用
20.洛谷 P1196 [NOI2002] 银河英雄传说
21.洛谷 P1004 [NOIP2000 提高组] 方格取数22.蓝桥杯 计算方程23.洛谷 P1006 [NOIP2008 提高组] 传纸条24.蓝桥杯-算法赛第9场强者:贝贝的2.025.P1002 [NOIP2002 普及组] 过河卒26.蓝桥杯,推导部分和27.牛客,小红不想做完全背包28.蓝桥杯-岛屿个数题意:30000列军队,每列初始有1个。编号从1~30000.每次操作有两种,将现在第i列所在的列合并到第j列所在列的末尾。 或者查询第i列举例第j列的距离。
思路:带权并查集。合并时将第i列头节点接到第j列头节点上。然后直接查询dist取绝对值相减就好。
总结:一开始没看清题,以为要把从i列从当前所在列中截取出来接到第j列所在列末尾,就多了一个i列队头减i列元素数量的情况。
class DisjointSet{
public:
DisjointSet(int sz): sz_(sz){
fa_.resize(sz_);
iota(fa_.begin(), fa_.end(), 0);
set_size_.assign(sz_, 1);
dist_.assign(sz_, 0);
}
int findSet(int x){
if (fa_[x] == x){
return x;
}
return updateDist(x), fa_[x];
}
bool isSameSet(int x, int y){
return findSet(x) == findSet(y);
}
void unionSet(int x, int y){
int px = findSet(x);
int py = findSet(y);
fa_[px] = py;
dist_[px] = set_size_[py];
set_size_[py] += set_size_[px];
}
int getDist(int x){
updateDist(x);
return dist_[x];
}
private:
int sz_;
vector<int> fa_;
vector<int> set_size_;
vector<int> dist_;
inline void updateDist(int x){
if (fa_[x] == x){
return;
}
int par = fa_[x];
fa_[x] = findSet(fa_[x]);
dist_[x] += dist_[par];
}
};
void solve(){
int q;
cin >> q;
DisjointSet dsu(300010);
while (q --){
char t;
cin >> t;
int i, j;
cin >> i >> j;
if (t == 'M'){
dsu.unionSet(i, j);
}
else{
if (dsu.isSameSet(i, j) == false){
cout << -1 << '\n';
}
else{
cout << abs(dsu.getDist(j) - dsu.getDist(i)) - 1 << '\n';
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架