标签:++ font std problem str input cin and 0ms
6 M 1 6 C 1 M 2 4 M 2 6 C 3 C 4
1 0 2
M x y把x的管放在y管的上面
C x求x的下面有多少个砖块
down[i]表示i到根节点之间有多少块砖,再维护一个sum[x]数组,表示管x上一共串有多少个砖块
find每次更新down数组;
#include<iostream> #include<stdio.h> using namespace std; int par[30005]; int sum[30005];//上面有多少; int down[30005]; int findi(int x) { if(x==par[x]) return x; int p=findi(par[x]); down[x]=down[par[x]]+down[x]; return par[x]=p; } void unioni(int x,int y) { int xx=findi(x); int yy=findi(y); if(xx!=yy) { par[xx]=yy; down[xx]=sum[yy]; sum[yy]=sum[yy]+sum[xx]; } } int main() { int n; for(int i=0;i<30005;i++) sum[i]=1; for(int i=0;i<30005;i++) down[i]=0; for(int i=0;i<30005;i++) par[i]=i; scanf("%d",&n); while(n--) { char a; cin>>a; if(a==‘M‘) { int b,c; scanf("%d%d",&b,&c); unioni(b,c); } if(a==‘C‘) { int d; scanf("%d",&d); findi(d); printf("%d\n",down[d]); } } return 0; }
标签:++ font std problem str input cin and 0ms
原文地址:http://www.cnblogs.com/2014slx/p/7220836.html