標籤:amp size 輸入 表示 ati 並且 network strong scan
·一些很可愛的詢問和修改,放鬆地去用並查集解決。
·英文題,述大意:
輸入n(5<=n<=20000)表示樹有n個節點,並且會EOF結束地讀入不超過 20000個操作,一共有兩種:
①I v u:表示將v的父親節點設定為u(在這之前v沒有爸爸),邊權設定為abs(v-u)%1000。
②E u:表示詢問u到當前它所在樹的根節點的距離。
·分析:
為了記錄當前一系列加邊操作後所有的點的位置情況(因為你隨時可能回答詢問啊),根據這道題的點關係特點[只在乎點和其根節點的資訊],我們選擇並查集來加以維護。
然後我們只需要在標準的FindFather函數的回溯過程裡面加入邊權的累積,這樣一次函數就可以既完成路徑壓縮,又維護了沿途所有點各自到根節點的距離(就是邊權和)。
然後這麼短的題解讓我想起了網路上的人們常常使用的一句題解推託之詞:“哎呀,其他的搞一搞就出來了”。但是這道題真是這麼單純。OK。
1 #include<stdio.h> 2 #define go(i,a,b) for(int i=a;i<=b;i++) 3 int T,n,fa[20004],d[20004];char c; 4 int A(int a){return a>0?a:-a;} 5 int find(int u) 6 { 7 if(u==fa[u])return u;int Fa=find(fa[u]); 8 d[u]+=d[fa[u]];return fa[u]=Fa; 9 }10 int main()11 {12 scanf("%d",&T);while(T--&&scanf("%d",&n))13 {14 go(u,1,n)d[fa[u]=u]=0;int u,v;15 while(scanf(" %c",&c),c!=‘O‘)16 {17 if(c==‘I‘)scanf("%d%d",&v,&u),fa[v]=u,d[v]=A(v-u)%1000;18 if(c==‘E‘)scanf("%d",&u),fa[u]=find(u),printf("%d\n",d[u]);19 }20 }21 return 0;22 }//Paul_Guderian
明天當孤獨襲來時我不會再流一滴淚,
我會用歌聲抹去那創痛的灰燼。—————汪峰《明天》
【LA 3027 Corporative Network】