随笔分类 -  ACM

大二到大三不堪回首的记忆....
摘要:原题链接 考察:并查集+枚举 错误思路: 接收了所有的判断语句,当出现矛盾的时候玩游戏的两人犯规次数+1,输出犯规最多的人. 很明显错在有裁判的关系是不准确的,因为那段关系不能考虑 正确思路: 枚举每个可能为裁判的人,如果可能为裁判的人>1,则不能确定;如果=1,则输出此人.如果==0,则impos 阅读全文
posted @ 2021-01-05 01:54 acmloser 阅读(66) 评论(0) 推荐(0)
摘要:原题链接 考察: 带权并查集 思路: 设置东西方向和南北方向两个数组,其他就和之前的题目一样,但是要注意我们压缩路径的时候要把东西和南北距离都压缩 1 #include <iostream> 2 using namespace std; 3 const int N = 40010; 4 int p[ 阅读全文
posted @ 2021-01-04 19:42 acmloser 阅读(62) 评论(0) 推荐(0)
摘要:原题链接 考察: 带权并查集 做了银河英雄传说和奇偶游戏后这题应该算简单了,没加入集合的加入集合,已入集合的检验就行了 1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 using namespace std; 5 阅读全文
posted @ 2021-01-04 09:34 acmloser 阅读(89) 评论(0) 推荐(0)
摘要:原题链接 考察:并查集+位运算+前缀和思想+离散化 如果没想到前缀和这题完全没得思路,看了lyd大佬的提示,配合自己画图把这题做出来了= = 思路: 要AC本题我们需要前缀和思想,如果一个区间内1的个数为even,那么我们可以发现sum[r]-sum[l-1] = 偶,根据奇偶规律,我们可知这两个奇 阅读全文
posted @ 2021-01-04 01:21 acmloser 阅读(221) 评论(0) 推荐(0)
摘要:原题链接 考察:并查集+贪心或堆排序+贪心 因为最近在做并查集专题所以直接考虑用并查集写,但是看题目完全没有想到用并查集的方式,以前写的并查集题目关系的传递性都很明显,但是这道题本蒟蒻完全没看出来 思路: 用并查集维护天数,贪心策略是能多晚卖出就多晚卖出,起初每个天数都在它自己的集合里,当我们决定要 阅读全文
posted @ 2021-01-03 22:04 acmloser 阅读(90) 评论(0) 推荐(0)
摘要:原题链接 考察: 并查集+离散化 错误思路1: 在线处理,每次收到新的命令就判断对错,不知道在线处理能不能行,但是在线有个麻烦的点是要判断这个数字是否在alls里面出现过,如果出现过判断多错,没有就是要新加入关系.并且在线处理还需要标记哪些变量不能相等 错误思路2: 将1~N的数字全部赋值p[i] 阅读全文
posted @ 2021-01-03 20:20 acmloser 阅读(90) 评论(0) 推荐(0)
摘要:原题链接 考察: 并查集 通过这道题算是把食物链没搞懂的问题又弄明白了点 很明显根据题意我们需要维护一个距离数组,表示父节点到子节点的距离. 当操作是C的时候,我们实际上在进行C操作之前是进行过路径压缩的,因此d[x]的距离变成了x到根节点的距离,d[y]的距离就算y到根节点的距离,因此两者的距离差 阅读全文
posted @ 2021-01-03 14:39 acmloser 阅读(96) 评论(0) 推荐(0)
摘要:原题链接 考察:并查集的基本应用 想到了再建一个敌人数组,但没想到怎么操作...菜是原罪 正确思路: 如果是朋友,我们直接并入一个集合 如果是敌人,我们需要建立一个N叉树,分支是敌人数组的下标,里面的值是根,比如e[5] = 1,表示根为1,分支为5的树,n次操作后,我们会形成一个n叉树,此时我们需 阅读全文
posted @ 2021-01-03 12:27 acmloser 阅读(117) 评论(0) 推荐(0)
摘要:原题链接 考察: 并查集基础 和前面suspects差不多的题目,就是将计算集合内人数换成计算集合个数,用数组标记集合的编号即可 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace st 阅读全文
posted @ 2021-01-03 10:45 acmloser 阅读(129) 评论(0) 推荐(0)
摘要:原题链接 考察:并查集基础 在读入学生团体的时候,没必要用数组存储,直接将他们并入树中即可,注意:当我们计算人数的时候,已经在一个集合中的人不能重复计算 当时看y总犯了这个错误,结果自己写又错了233 1 #include <iostream> 2 #include <cstdio> 3 using 阅读全文
posted @ 2021-01-03 10:14 acmloser 阅读(58) 评论(0) 推荐(0)
摘要:原题链接 考察:并查集基础 思路: 只有维修后的电脑才是有用的,因此我们用数组来标记维修后的电脑,当它们能连通需要以下条件: x电脑和y电脑都是维修后的 x电脑与y电脑距离的平方小于d*d 如果距离大于d*d,那么它们之间存在中介点,且中介点也被维修过 1 #include <iostream> 2 阅读全文
posted @ 2021-01-03 09:15 acmloser 阅读(88) 评论(0) 推荐(0)
摘要:原题链接 并查集模板题 当两个点互相可达,我们称它们连通.本题判断连通点的个数,就是判断同一集合下点的个数,一棵树下子节点各不同,因此用数组sizes记录下标为根节点的点的个数 1 #include <iostream> 2 using namespace std; 3 const int N = 阅读全文
posted @ 2021-01-03 07:59 acmloser 阅读(137) 评论(0) 推荐(0)
摘要:原题链接 Trie+位运算+前缀和思想+后缀和思想 错误思路: 如果枚举两个端点,结果还是会TLE,就算先预处理每个sum[i]对应异或的最大值,排序,考虑到最坏情况结果时间复杂度还是会到10的10次方,因此此解不可行 正确思路: 本道题要求两个区间内的异或最大值,我们可以用一个数组ans[i]记录 阅读全文
posted @ 2021-01-02 19:41 acmloser 阅读(192) 评论(0) 推荐(0)
摘要:原题链接 Trie+位运算 和前面差不多的题,但是注意一下i、j、k都是不同的,在找异或最大值的时候要把i、j从树上删除,枚举完后再加回来 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace 阅读全文
posted @ 2021-01-02 19:25 acmloser 阅读(101) 评论(0) 推荐(0)
摘要:原题链接 Trie+位运算 和前面题一样标记下删除的路径即可 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int N = 200010; 6 int idx 阅读全文
posted @ 2021-01-02 19:23 acmloser 阅读(89) 评论(0) 推荐(0)
摘要:原题链接 想在vj上做来着..结果vj半天登不上去... 错误思路: 暴力枚举TLE 错误思路2: 用cnt数组标记用了的数字,但注意如果我们只标记叶子结点,那么就会陷入死循环,因为每次都要走到底才能知道是否能用 正确思路: 用cnt数组标记当前结点的子节点的个数,因为可能存在重复数字,所以不能简单 阅读全文
posted @ 2021-01-02 11:03 acmloser 阅读(121) 评论(0) 推荐(0)
摘要:原题链接 考察:Trie+位运算 错误思路1: 枚举端点异或,这样肯定TLE 错误思路2: 利用前缀和思想,区间[i,j]内异或 = sum[i-1]^sum[j],将所有sum值插入树中枚举一个点,另一个利用之前的sum xor的思想,但是这样是错的,我们要取sum的下标,但数据量大的时候存在相同 阅读全文
posted @ 2021-01-02 09:01 acmloser 阅读(161) 评论(0) 推荐(0)
摘要:原题链接 Trie+位运算 错误思路: 枚举数组里每一个数与询问的数异或,利用桶排序求最小值.时间复杂度O(n^2),TLE 正确思路: 想AC本题首先要明确几个性质: x^y^z = x^(y^z) 0~n位二进制数与n位二进制数异或的结果仍然在0~n位二进制数内,且不存在不同数取相同值的结果 3 阅读全文
posted @ 2021-01-01 22:31 acmloser 阅读(116) 评论(0) 推荐(0)
摘要:原题链接 Trie的基本运用 错误思路: 将要查找前缀的字符串构建字典树,这样的结果是每个字符串都要重新构建一次树,并且我们需要预先保存要匹配前缀的单词,但题目单词数目没有讲明,所以我们必须将建树的字符串互换.(这样建树会导致MLE) 正解思路: 将前缀建树,如果达到一个结点有单词就+1,如果没有单 阅读全文
posted @ 2021-01-01 16:12 acmloser 阅读(147) 评论(0) 推荐(0)