[POJ 1988] Cube Stacking
我们需要新增两种属性cnt[i]cnt[i]与s[i]s[i],分别表示ii之下的块数和ii所在堆的数量。在路径压缩时,cnt[i] += cnt[f[i]] ,另外在连接操作时,需要动态更新cnt[find(u)]和s[find(v)]的信息。
1 #include <iostream> 2 #define lson l,m,rt<<1 3 #define rson m+1,r,rt<<1|1 4 #define clo std::ios::sync_with_stdio(false) 5 using namespace std; 6 const int maxn=1e5+5; 7 const int N=300004; 8 int f[N],cnt[N],s[N]; 9 void init(){ 10 for(int i=1;i<=N;i++){ 11 //初始化每个的根都是自己,然后所在堆只有一个 12 f[i]=i; 13 s[i]=1; 14 } 15 } 16 17 int find(int x){ 18 int rt; 19 //在路径压缩的时候更新cnt的值,根就是每堆最下面的那个 20 if(f[x]!=x){ 21 int fa=f[x]; 22 f[x]=find(f[x]); 23 cnt[x]+=cnt[fa]; 24 } 25 //都没用路径压缩 26 return f[x]; 27 } 28 int main(){ 29 std::ios::sync_with_stdio(false); 30 int p;cin>>p; 31 init(); 32 while(p--){ 33 //cout <<"p=="<<p<<endl; 34 char c; 35 cin>>c; 36 if(c==‘M‘) 37 { 38 int a,b;cin>>a>>b; 39 int fa=find(a);int fb=find(b); 40 if(fa!=fb){ 41 f[fa]=fb; 42 cnt[fa]=s[fb]; 43 s[fb]+=s[fa]; 44 } 45 } 46 else 47 { 48 int u; 49 cin>>u; 50 find(u); 51 cout <<cnt[u]<<endl; 52 } 53 } 54 return 0; 55 }
原文地址:https://www.cnblogs.com/Msmw/p/11249955.html
时间: 2024-10-29 20:12:54