灵光溢溢
1. ❤LINK:有趣的家庭菜园
标签:树状数组,逆序对
对于一个序列,只能相邻两两交换时,排成有序序列的最小次数为逆序对的个数。
同类:火柴排队
火柴排队
同序和≥乱序和≥逆序和
为了让Aの第K大与Bの第K大对应计算出排序后“原A的i应该与原B的对应”(可用map,形式如map[a.id]=b.id)
最后的map[1~n]就为A移动后的位置。因为A.id原本是有序的,用逆序对即可
for(int i=1;i<=n;i++) scanf("%d",&noda[i].a),noda[i].id=i;
for(int i=1;i<=n;i++) scanf("%d",&nodb[i].b),nodb[i].id=i;
sort(noda+1,noda+n+1,cmp);
sort(nodb+1,nodb+n+1,cmp1);
for(int i=1;i<=n;i++) {
ma[noda[i].id]=nodb[i].id;
}
2. ❤LINK : Deliver the Cake
标签:最短路
对于可以有多个起点或终点任意选择的情况,可以建一个边权为0虚点,分别将所有的起点,终点各连接.
同样的,对于这道题,很显然对于M是不确定用左手还是右手的,我们可以把所有的M结点拆为两个结点(一个LEFT一个RIGHT)并建立相应的边在图中,让所有的结点都成为固定的选择。
3.❤LINK:Grudanje 完美单词(perfect)
标签:树状数组,二分
如果我们在选到 i个雪球时,整个题目就已经满足了,那么,我们再多选一些雪球,这个题目也是肯定能够满足的。因此,在这里就具有一个单调性,所以我们就可以利用二分来解决这个问题。可以造26个树状数组来维护到这个位置时这个字符出现的个数
4.❤ LINK:Very Easy Graph Problem
标签:最小生成树
第i 条边的长度为2i ,而且我们会发现 , 20 + 21+ 22+……+2n-1 < 2n
也就是说,如果前i-1条边图已经联通了,那么我们就不需要剩下的边了。因为就算两点间需要经过i - 1条边,那这个距离也是小于第i条边的。因此,我们就可以联想到用kruskal建立一个最小生成树来求解这个问题。要求任意顶点0和任意顶点1之间的距离和,其实可以先求出每条边对最后结果的贡献度,最后求和。每条边的贡献度为 边长*经过的次数(统计两侧的黑白点个数,计算贡献即可)。
例如边<a,b >。假设在树中a为b的父节点。那么<a,b >这条边的经过次数=以b为根节点的子树中0类别的节点数 * 子树以外类别1的节点数 +子树中1类别的节点数 * 子树以外类别0的节点数,因为子树内的数会通过这条唯一的边与外部“交流”
5.♥ LINK: 小凯的疑惑
标签:数学
①.设a1,a2及c均为正整数,gcd(a1,a2) = 1;当 c >a1*a2 - a1 - a2不定方程必有非负解。
②.设a1,a2及c均为正整数,gcd(a1,a2) = 1; 当 c > a1*a2不定方程必有正解。
6.♥ LINK:找筷子
标签:数学
我们考虑异或的两个小小的性质:
- k 个相同的数的异或和,当 k为奇数时,结果是这个数本身,否则结果是 0。
- 任何数与 0 的异或值是它本身。
https://www.bilibili.com/video/BV1Kx411f7bL/?p=1&share_medium=android&share_plat=android&share_source=COPY&share_tag=s_i×tamp=1615301905&unique_k=Fds22H&vd_source=24a420d00426dd75084e83baa33680ab
https://hackway.org/docs/cs/intro
本文来自博客园,作者:Doria_tt,转载请注明原文链接:https://www.cnblogs.com/pangtuan666/p/16558645.html

浙公网安备 33010602011771号