LOJ2014 SCOI2016 萌萌噠 並查集、ST表優化連邊
阿新 • • 發佈:2019-03-01
優化 fin 區間 class 如果 getc sco namespace forall
的,但是查詢就比較麻煩了,因為我們並查集只能查詢大小為\(1\)的區間,而不能混入這些奇奇怪怪的區間。
傳送門
一個樸素的做法就是暴力連邊並查集,可是這是\(O(n^2)\)的。發現每一次連邊可以看成兩個區間覆蓋,這兩個區間之間一一對應地連邊。可線段樹對應的兩個節點的size可能不同,這會導致“一一對應”的條件在線段樹上失效。所以我們需要使用ST表來完成連邊。
對原序列建好ST表,對於每一個修改將兩個區間覆蓋到ST表上然後兩兩之間連邊。註意在ST表上連邊的兩個區間要對應,即如果ST表上對應\([l,r]\)的區間與對應\([L,R]\)的區間連了邊,意味著對於\(\forall i \in [0 , r - l],\)有邊\((l + i , L + i)\)。
這樣連邊的復雜度是\(O(nlogn)\)
但是我們可以把每一層ST表對應的並查集向下傳,直到傳到最底層。具體來說從上往下遍歷每一層ST表對應的並查集,找到第\(i\)個點和它在這一層並查集上的根。這兩個點在下一層的ST表中分別對應兩個點,而連邊的時候又是對應的,所以將它們的左兒子之間連邊、右兒子之間連邊即可。
總復雜度\(O(nlogn)\)
#include<iostream> #include<cstdio> #include<cctype> #include<algorithm> //This code is written by Itst using namespace std; inline int read(){ int a = 0; char c = getchar(); while(!isdigit(c)) c = getchar(); while(isdigit(c)){ a = a * 10 + c - 48; c = getchar(); } return a; } const int MAXN = 100007 , MOD = 1e9 + 7; int ST[19][MAXN]; int N , M , cnt , logN , head[MAXN << 3] , dir[MAXN * 20] , fa[MAXN * 20]; void init(){ for(logN = 0 ; 1 << logN <= N ; ++logN) for(int j = 1 ; j + (1 << logN) - 1 <= N ; ++j){ ST[logN][j] = ++cnt; dir[cnt] = j; fa[cnt] = cnt; } --logN; } int find(int a){return fa[a] == a ? a : (fa[a] = find(fa[a]));} void merge(int a , int b){fa[find(a)] = find(b);} inline void add(int a , int b , int len){ for(int i = 18 ; i >= 0 ; --i) if(len & (1 << i)){ merge(ST[i][a] , ST[i][b]); a += 1 << i; b += 1 << i; } } int main(){ #ifndef ONLINE_JUDGE freopen("in","r",stdin); //freopen("out","w",stdout); #endif N = read(); M = read(); init(); for(int i = 1 ; i <= M ; ++i){ int a = read() , b = read() , c = read(); read(); add(a , c , b - a + 1); } for(int i = logN ; i ; --i) for(int j = 1 ; j + (1 << i) - 1 <= N ; ++j){ int t = find(ST[i][j]); if(t != ST[i][j]){ int x = dir[t]; merge(ST[i - 1][j] , ST[i - 1][x]); merge(ST[i - 1][j + (1 << i - 1)] , ST[i - 1][x + (1 << i - 1)]); } } bool f = 0; int ans = 1; for(int i = 1 ; i <= N ; ++i) if(fa[i] == i){ ans = ans * (9ll + f) % MOD; f = 1; } cout << ans; return 0; }
LOJ2014 SCOI2016 萌萌噠 並查集、ST表優化連邊