luogu P 5092[USACO 2004 OPEN]Cube Stackingキューブゲーム
4819 ワード
タイトルの説明
ジョンとベシーはブロックゲームをしています.1...n 1ldots n 1...nと番号付けされたn n n(1≦n≦30000 1leq nleq 30000 1≦n≦30000)個のブロックが地面に置かれ、各立方柱が構成されている.
ゲーム開始後、ジョンはベシーにP P P(1≦P≦100000 1leq Pleq 100000 1≦P≦100000)個の命令を出す.命令は2種類あります.移動(M):Xを含む立方柱をYを含む立方柱に移動します. 統計(C):Xを含む立方柱のXの下のブロック数を統計します.
プログラムを書いてベシーのゲームを完成させる.
入力フォーマット
1行目には、P P Pが入力され、その後、P P P行には、「MX Y」または「CX」という形式の命令が入力される.
立方柱を自分の頭に置く命令がないことを保証します.
出力フォーマット
合計P P P P行を出力し、統計指令毎にその結果を出力する.
入出力サンプル
入力#1コピー
出力#1コピー
ジョンとベシーはブロックゲームをしています.1...n 1ldots n 1...nと番号付けされたn n n(1≦n≦30000 1leq nleq 30000 1≦n≦30000)個のブロックが地面に置かれ、各立方柱が構成されている.
ゲーム開始後、ジョンはベシーにP P P(1≦P≦100000 1leq Pleq 100000 1≦P≦100000)個の命令を出す.命令は2種類あります.
プログラムを書いてベシーのゲームを完成させる.
入力フォーマット
1行目には、P P Pが入力され、その後、P P P行には、「MX Y」または「CX」という形式の命令が入力される.
立方柱を自分の頭に置く命令がないことを保証します.
出力フォーマット
合計P P P P行を出力し、統計指令毎にその結果を出力する.
入出力サンプル
入力#1コピー
6
M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
出力#1コピー
1
0
2
code:
//
#include
using namespace std;
int n,p;
#define maxnn 40100
int f[maxnn],dis[maxnn],cnt[maxnn];
int gf(int v,int num)
{
if(f[v]==v)
{
cnt[v]+=num;
return v;
}
else
{
int fx=f[v];
f[v]=gf(f[v],num);
if(f[v]!=fx)
dis[v]=dis[v]+dis[fx];
return f[v];
}
}
int main()
{
char a;
cin>>p;
int x,y;
for(int i=1;i<=40000;i++)
f[i]=i,dis[i]=0,cnt[i]=1;
for(int i=1;i<=p;i++)
{
cin>>a;
if(a=='M')
{
cin>>x>>y;
int fy=gf(y,0);
if(gf(y,0)!=gf(x,0))
{
dis[gf(y,0)]=cnt[gf(x,0)];
f[gf(y,0)]=gf(x,0);
cnt[gf(x,0)]+=cnt[fy];
}
}
else
{
cin>>x;
{
gf(x,0);
cout<0)])-1<<endl;
}
}
}
}