您的位置:首页 > 其它

【树状数组】PKU-2057-The Lost House

2012-03-16 12:45 337 查看
这里有挺完整的题解:/article/8825349.html

题目

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<stack>
using namespace std;
#define FRE freopen("in.txt","r",stdin);
#define inf 999999999
#define N 1005
int wr
,su
,fa
,le
;
vector<int> v
;
bool cmp(int x,int y)
{
return le[y]*(fa[x]+2)<le[x]*(fa[y]+2);
}
void dfs(int u)
{
if(v[u].empty())
{
le[u]=1;
return;
}
int len=v[u].size();
for(int i=0;i<len;i++)dfs(v[u][i]);
for(int i=0;i<len;i++)
{
int e=v[u][i];
le[u]+=le[e];
if(!wr[u])fa[u]+=fa[e]+2;
}
int mp
;
for(int i=0;i<len;i++)mp[i]=v[u][i];
sort(mp,mp+len,cmp);
for(int i=0,j=0;i<len;i++)
{
su[u]+=(j+1)*le[mp[i]]+su[mp[i]];               //这里看了很久才看懂
j+=fa[mp[i]]+2;
}
}
int main()
{
//FRE;
int n;
while(scanf("%d",&n)&&n)
{
memset(wr,0,sizeof(wr));
for(int i=0;i<n;i++)v[i].clear();
for(int i=0;i<n;i++)
{
int x;
char c;
scanf("%d %c",&x,&c);
if(c=='Y')wr[i]=1;
if(x==-1)continue;
else v[x-1].push_back(i);
}
memset(su,0,sizeof(su));
memset(fa,0,sizeof(fa));
memset(le,0,sizeof(le));
dfs(0);
printf("%.4f\n",su[0]*1.0/le[0]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: