【树状数组】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; }
相关文章推荐
- POJ 2057 The Lost House [树状DP]
- pku 2057 The Lost House 树形DP
- POJ 2057 The Lost House 树状DP
- pku 2057 The Lost House 树形dp+背包dp 解题报告
- POJ 2057 The Lost House 树形DP+贪心
- poj2057--The Lost House(树状dp,求期望)
- poj 2057 The Lost House
- POJ 2057 The Lost House 经典树形DP+贪心
- POJ 2057 The Lost House
- POJ 2057 The Lost House
- POJ 2057 The Lost House
- POJ 2057 The Lost House
- poj 2057 The Lost House
- POJ 2057 The Lost House
- 【树形DP】【poj 2057】The Lost House
- POJ 2057 The Lost House
- POJ 2057 The Lost House
- POJ-2057 The Lost House 贪心在动态规划中的应用
- poj 2057 The Lost House 贪心思想在动态规划上的应用
- POJ 2057 The Lost House (经典树形dp)