SCOI2016 萌萌噠 並查集 倍增

2021-10-02 09:04:28 字數 1242 閱讀 4378

傳送門

一開始是想賭一把,把節點乙個乙個的unite,然後懷著wa的心情wa了。

然後又準備用離散去優化,然後又懷著wa的心情wa了。

萬般無奈去查題解,發現竟然要使用倍增?(倍增是啥,我多少年沒有用過了)

複習了一波倍增,原來倍增也可以用在並查集上,我對並查集又有了新的理解,這個資料結構,好強啊!

#include

#define ll long long

using

namespace std;

const

int mx=

1e5+9;

const

int mod=

1e9+7;

int n,m,l1,r1,l2,r2;

int fa[20]

[mx]

;int

fin(

int k,

int x)

void

chuli

(int k,

int a,

int b)

intmain()

for(

int i=

0; i<=

19; i++

)for

(int j=

1; j<=n ; j++

) fa[i]

[j]=j;

// 倍增並查集的更新,意為,以j為開始,2的i次方為長度,j~j+2^i內的老大,

while

( m--

)int len=r1-l1+1;

int k=

log2

(len)

;// 因為len不一定是2的次方,使用要從前和往後,都更新一次。

chuli

(k,l1,l2)

;chuli

(k,r1-(1

<,r2-(1

<);

}int sum=0;

for(

int i=

1; i<=n ; i++)if

(fin(0

,i)==i )

sum++

; ll ans=9;

for(

int i=

1; i<=sum-

1; i++

)printf

("%lld\n"

,ans)

;return0;

}

SCOI2016 萌萌噠 倍增 並查集

乙個長度為n的大數,用s1s2s3.sn表示,其中si表示數的第i位,s1是數的最高位,告訴你一些限制條件,每個條件表示為四個數,l1,r1,l2,r2,即兩個長度相同的區間,表示子串sl1sl1 1sl1 2.sr1與sl2sl2 1sl2 2.sr2完全相同。比如n 6時,某限制條件l1 1,r...

SCOI2016 萌萌噠 題解

題目大意看原題面。我們首先考慮,對於每個相等的數,我們用並查集將其並起來,那麼由於不能有前導0,令最後集合的個數為c cc,所以答案就是9 1 0c 1 9 times 10 9 10c 1,除了開頭不能選0,只有9中選擇方案外,其餘的每個數字都有10種選擇方案 只有一位數字的時候需要特判,因為此時...

SCOI2016 萌萌噠 解題報告

scoi2016 萌萌噠 有乙個長度為 n 的大數,有 m 個形如l1,r1,l2,r2的限制,表示區間 l1,r1 和 l2,r2 完全相等,求滿足這些限制的數的個數,不能含有前導零.1 le n,m le 10 5 暴力 直接 o nm 把相等的數合成乙個並查集,最後若並查集的數量為 k 則答案...