华师一附中OI组
标题:
P2342 叠积木
[打印本页]
作者:
admin
时间:
2018-7-27 22:45
标题:
P2342 叠积木
https://www.luogu.org/problemnew/show/P2342
题目描述
约翰和贝西在叠积木。共有30000块积木,编号为1到30000。一开始,这些积木放在地上,自然地分成N堆。贝西接受约翰的指示,把一些积木叠在另一些积木的上面。一旦两块积木相叠, 彼此就再也不会分开了,所以最后叠在一起的积木会越来越高。约翰让贝西依次执行P条操作,操作分为两种:
第一种是移动操作,格式为“移动X到Y的上面”。X和Y代表两块积木的编号,意思是将X所的那堆积木,整体叠放到Y所在的那堆积木之上;
第二种是统计操作,格式为“统计Z下方的积木数量”。Z代表一块积木的编号,意思是贝西需要报告在编号为Z的积木之下还有多少块积木
请编写一个程序,帮助贝西回答每条统计问题。
输入输出格式
输入格式:
第一行:单个整数:P,1 ≤ P ≤ 10^5
第二行到第P + 1行:每行描述一条命令,如果这行开头的字母是 M,代表一条移动命令,后面的两个整数代表上文中的X和Y;如果开头字母是 C,代表一条统计命令。后面的整数代表上文中的Z,保证所有的移动命令都有意义,X和Y不会已经出现在同一堆积木里
输出格式:
对每一个统计命令,输出正确回答,用换行符分开每个查询的结果
输入输出样例
输入样例#1:
6
M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
输出样例#1:
1
0
2
说明
第一次查询时, 1 下面只有一个 6;第二次查询时, 3 下面没有任何积木;第三次查询时,4 下面有两块积木:1 和 6
作者:
zhwang
时间:
2018-7-28 00:19
#include<cstdio>
const int N=30000;
int sum[N+1];
int under[N+1];
int f[N+1];
int p;
int cnt;
int ans[1000001];
int getf(int num)
{
if(num==f[num])
{
return num;
}
int t=getf(f[num]);
under[num]+=under[f[num]];
f[num]=t;
return f[num];
}
void merge(int a,int b)
{
int t1=getf(a);
int t2=getf(b);
if(t1!=t2)
{
f[t2]=t1;
under[t2]=sum[t1];
sum[t1]+=sum[t2];
}
}
int main()
{
freopen("testdata.in","r",stdin);
freopen("testme.out","w",stdout);
for(int i=1;i<=N;i++)
{
sum[i]=1;
under[i]=0;
f[i]=i;
}
scanf("%d",&p);
for(int i=1;i<=p;i++)
{
char miao;
scanf("%c",&miao);
scanf("%c",&miao);
if(miao=='M')
{
int x,y;
scanf("%d%d",&x,&y);
merge(y,x);
}
else
{
if(miao=='C')
{
int x;
scanf("%d",&x);
getf(x);
printf("%d\n",under[x]);
}
}
}
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-7-28 09:22
#include<iostream>
using namespace std;
int const maxn=30000+1;
int p,par[maxn],under[maxn],sum[maxn];
int f(int x)
{
if(x==par[x])return x;
int t=f(par[x]);
under[x]+=under[par[x]];
par[x]=t;
return par[x];
}
void merge(int x,int y)
{
int r1=f(x);
int r2=f(y);
if(r1==r2)return ;
else
{
par[r1]=r2;
under[r1]=sum[r2];
sum[r2]+=sum[r1];
}
}
int main()
{
cin>>p;
char ch;
int a,b;
for(int i=1;i<maxn;i++)par[i]=i,under[i]=0,sum[i]=1;
for(int i=1;i<=p;i++)
{
cin>>ch;
if(ch=='M')
{
cin>>a>>b;
merge(a,b);
}
else if(ch=='C')
{
cin>>a;
f(a);
cout<<under[a]<<endl;
}
}
return 0;
}
复制代码
作者:
吴语林
时间:
2018-7-28 19:03
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
using namespace std;
int x,y,t,fa[310010],sum[310010],num[310010],all[310010];
char a[100];
int getf(int u)
{
if(u==fa[u]) return u;
int k=getf(fa[u]);
sum[u]+=sum[fa[u]];
return fa[u]=k;
}
int main()
{
scanf("%d",&t);
for(int i=1;i<=310010;i++)
fa[i]=i,num[i]=1;
while(t--)
{
scanf("%s",a);
if(a[0]=='M')
{
scanf("%d%d",&x,&y);
int t1=getf(x),t2=getf(y);
fa[t1]=t2;
sum[t1]=num[t2];
num[t2]+=num[t1];
}
else
{
scanf("%d",&x);
getf(x);
printf("%d\n",sum[x]);
}
}
return 0;
}
复制代码
作者:
walk_alone
时间:
2018-7-29 20:39
不知道为什么只有18分
作者:
walk_alone
时间:
2018-7-29 20:39
#include <cstdio>
int front[30001],sum[30001],father[30001];
int getfather(int x)
{
if(father[x]==x)
return x;
int ans=getfather(father[x]);
front[x]+=front[father[x]];
return father[x]=ans;
}
int main()
{
int t,count=0;
scanf("%d",&t);
for(int i=1;i<=30000;i++)
{
father[i]=i;
front[i]=0;
sum[i]=1;
}
int x,y;
char ch;
while(count<t)
{
scanf("%c",&ch);
if(ch=='M')
{
count++;
scanf("%d%d",&x,&y);
x=getfather(x);
y=getfather(y);
father[x]=y;
front[x]=sum[y];
sum[y]+=sum[x];
}
if(ch=='C')
{
count++;
scanf("%d",&x);
printf("%d\n",front[x]);
}
}
}
复制代码
作者:
张笑宇
时间:
2018-7-30 20:00
#include<iostream>
using namespace std;
int p;
const int mx=30010;
int par[mx],i,s[mx],under[mx];
int getpar(int a)
{
if (a!=par[a])
{
int x=getpar(par[a]);
under[a]+=under[par[a]];
par[a]=x;
}
return par[a];
}
int check(int a,int b)
{
if (getpar(a)!=getpar(b))
return -1;
return max(under[a],under[b])-min(under[a],under[b]);
}
bool union_(int a,int b)
{
if ((a=getpar(a))==(b=getpar(b)))
return 0;
par[a]=b;
under[a]+=s[b];
s[b]+=s[a];
return 1;
}
int main()
{
cin>>p;
for (i=1;i<=mx-1;i++) par[i]=i,s[i]=1;
while (p--)
{
string s;
int a,b;
cin>>s>>a;
if (s[0]=='M')
{
cin>>b;
union_(a,b);
}
if (s[0]=='C')
{
cout<<check(a,getpar(a))<<endl;
}
}
return 0;
}
复制代码
作者:
ZMQ
时间:
2018-8-7 21:28
提示:
作者被禁止或删除 内容自动屏蔽
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2