[Comet OJ - #13] [DQ] [并查集] B C
C 给定1000*1000的矩阵,每次将一个子矩阵内全部值赋值为1,问四联通块数量 Q 3e4 首先考虑复杂度,3e4次操作的合并暴力肯定不行,并且要考虑已经为1的块不应该再次考虑 1.考虑合并操作,对于一个0点,当他变为1对答案的影响只有几种情况 周边都是0,总联通联通块数量加1 周边有(1 - 4)个不同联通块,ans -= 不同联通块个数+1 对于相同的联通块通过当前0点合并没有意义,不用计算。 所以对于每个0点的合并可以快速计算并用并查集合并(映射下标) 2.然后考虑第二个问题,如何让每个0点只被操作一次 可以用并查集维护每行当前点的下一个0点,这样在区间上跳动速度飞快并且每次跳的都是0点 或者用set维护当前行内还有0的下标并操作erase(比并查集常数大) /* Zeolim - An AC a day keeps the bug away */ //#pragma GCC optimize(2) //#pragma GCC ("-W1,--stack=128000000") #include <bits/stdc++.h> using namespace std; #define mp(x, y) make_pair(x, y) #define fr(x, y, z) for(int x = y; x < z; ++x) #define pb(x) push_back