题解:P10928 走廊泼水节
发表于|更新于|题解
|浏览量:
回顾 kruskal:
取边权最小的一条边,若两个点在不同连通块(并查集),则连边合并。
我们把以上规则改一下:
如果点 $A$ 的老大的小弟数<点 $B$ 的老大的小弟数,$A$ 成为 $B$ 小弟。
反之,$B$ 成为 $A$ 小弟。
我们定义 $s_i$ 是点 $i$ 的老大的小弟数,$w$ 是 $a$ 到 $b$ 的边权。
贡献和为:$(s_A×s_B−1) \times (w+1)$。
代码楼上楼下都已经写的很明白了,我就不在赘述了。
文章作者: heyZzz
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 heyZzz's OI Blog!
相关推荐
2026-03-09
题解:CF2086C Disappearing Permutation
题意 给定两个排列 $p$ 和 $d$,第 $1 \le i \le n$ 次将 $p_{d_i}$ 设为 0。 然后进行操作,一次操作定义为指定一个 $i$,将 $a_i = i$,问最少多少次操作能将它复原为一个排列(可能与原排列相同)。 思路 我一看,每次 $p_{i}$ 一定要做一次操作 $p_i=i$,那么 $p_{p_i}$ 也要操作,以此类推,直到 $p_k$ 等于 $k$。 那就好办了,每次讲 $p_i$ 和 $i$ 连在一起,分成几个联通块,每次的答案就是联通块的大小。 code 123456789101112131415161718192021222324#include<bits/stdc++.h>#define int long longusing namespace std;int T,n,p[100005],d[100005],f[100005],sz[100005],fg[100005],ans;int fd(int x){ if(f[x]==x) return x; return f[x]=fd(f[x]);...
2026-03-09
题解:P7900 [COCI 2006/2007 #2] SJECIŠTA
题意: 给定一个没有任何三个及以上的对角线交于一点的凸多边形。 问对角线交点个数。 思路: 我们注意到任意两个对角线一定可以确定一个点。 那么只要求出对角线数量就行了! 解法: 确定两个对角线就是找到四个点。 即在 $n$ 个点中选 $4$ 个点。 所以答案就是 $C^4_n$。
2026-03-09
题解:P12131 [蓝桥杯 2025 省 B] 客流量上限
思路 因为对于任意分店 $i$ 和 $j(1\le i,j\le2025)$,它们的客流量上限 $A_i$ 和 $A_j$ 的乘积不得超过 $ij+2025$。 所以,对于任意分店 $i$,$A_i\le\sqrt{i^2+2025}$。 我们直接打表: 1for(int i=1;i<=2025;i++) cout<<(int)sqrt(i*i+2025)<<' '; 发现在 $i\ge1013$ 时 $A_i \le i$。 那么当 $1\le i<1013\le j\le2025$ 时,$A_iA_j=A_ij,A_iA_j\le ij+2025$。 两边同除 $j$:$A_i\le i+\frac{2025}{j}$。 发现:$A_i\le i+\lfloor\frac{2025}{j}\rfloor$。 由于 $1013\le j\le2025$,所以,$A_i\in[1,i+1]$。 所以我们可以得出: $A_1$ 有 $2$ 种选择; $A_k$ 为了不与 $A_1$~$A_{k-1}$ 选的重复,总是有 $i+...
2026-03-09
题解:P10492 Weather Forecast
记忆化搜索+剪枝。 记忆化,记录: 目前到的点 $(x,y)$。 天数 $day$。 四个角的降雨量。 剪枝: 如果活动时下雨,直接剪掉。 如果四个角没有下雨 $\ge 7$ 天,直接剪掉。因为四个角地方被覆盖的情况是最少的。 代码: 12345678910111213141516171819202122232425262728293031323334#include<bits/stdc++.h>using namespace std;int n,a[405][5][5],f[5][5][405][8][8][8][8];int dx[]={-1,0,-2,0,2,0,1,0,0},dy[]={0,-1,0,-2,0,2,0,1,0};int dfs(int x,int y,int day,int ex,int sx,int ey,int sy){ if(f[x][y][day][ex][sx][ey][sy]!=-1) return f[x][y][day][ex][sx][ey][sy]; for(int...
2026-03-09
题解:CF1598D Training Session
题目翻译: 给定 $n$ 个互不相同二元组,现在要从其中选出三个二元组,使得这三个二元组的的前一项互不相同或后一项互不相同。求有几种方案。 思路: 正难则反,先算总数:有 $\Large\frac{n \times (n-1) \times (n-2)}{6}$ 种情况。 不满足的情况是没有一个二元组与另一个二元组元素两两不相同(同一个元素)。 也就是就是一个二元组与另一个二元组元素至少一个相同(也是同一个元素)。 考虑用桶记录,$x_i$ 代表 $a_i$ 的出现个数,$y_i$ 代表 $b_i$ 的出现个数。 第一组固定,第二组有 $x_{a_i}-1$ 种,第三组有 $y_{b_i}-1$ 种。 一共有 $(x_{a_i}-1) \times (y_{b_i}-1)$。 代码楼上楼下都已经写的很明白了,我就不在赘述了。
2026-03-09
题解:P10578 [蓝桥杯 2024 国 A] 旋转九宫格
用 BFS。 思路 我们可以使用一个长度为 $3\times3$ 的 string 来表示状态,每一种状态可以进行旋转(左上,右上,左下,右下)。 我们可以用 map 来记录状态。 预处理一下即可。 代码: 12345678910111213141516171819202122#include<bits/stdc++.h>#define int long longusing namespace std;map<string,int> mp; int T,n; char c;signed main(){ cin>>T; queue<string> q; //bfs q.push("123456789"),mp["123456789"]=1; while(q.size()){ string u=q.front(),v[4]={u,u,u,u}; q.pop(); v[3][4]=u[5],v[3][5]=u[8],v[3][7]=u[4],v[3][...
公告
This is my Blog