标签:树形结构-线段树
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 4465 | Accepted: 1966 |
Description
Input
Output
Sample Input
2 2 2 0.9 0.9 1 0.9 0 0 0
Sample Output
0.972
每个节点记录这个区间每个队赢的概率。
#include <iostream> #include <cstdio> using namespace std; const int maxn = 200; const double eps = 0.0001; struct tree{ int l , r; double win[maxn]; }a[4*maxn]; double P[maxn][maxn]; int N[10] = {1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 , 512}; int n; void initial(){ for(int i = 0; i < 4*maxn; i++){ for(int j = 0; j < maxn; j++){ a[i].win[j] = 0.0; } } } void build(int l , int r , int k){ a[k].l = l; a[k].r = r; if(l == r){ a[k].win[l] = 1.0; }else{ int mid = (l+r)/2; build(l , mid , 2*k); build(mid+1 , r , 2*k+1); int i = l; while(i <= mid){ for(int j = mid+1; j <= r; j++){ a[k].win[i] += a[2*k].win[i]*a[2*k+1].win[j]*P[i][j]; } i++; } while(i <= r){ for(int j = l; j <= mid; j++){ a[k].win[i] += a[2*k].win[j]*a[2*k+1].win[i]*P[i][j]; } i++; } } } void readcase(){ for(int i = 0; i < N[n]; i++){ for(int j = 0; j < N[n]; j++){ scanf("%lf" , &P[i][j]); } } } void computing(){ build(0 , N[n]-1 , 1); int ans = 0; for(int i = 1; i < N[n]; i++){ if(a[1].win[i] - a[1].win[ans] > eps){ ans = i; } } printf("%d\n" , ans+1); } int main(){ while(scanf("%d" , &n) && n != -1){ initial(); readcase(); computing(); } return 0; }
poj 2151 Check the difficulty of problems(线段树+概率),布布扣,bubuko.com
poj 2151 Check the difficulty of problems(线段树+概率)
标签:树形结构-线段树
原文地址:http://blog.csdn.net/u011836218/article/details/32931701