首页 > 其他 > 详细

微软编程之美初赛第一场第二题树

时间:2014-04-20 07:59:32      阅读:570      评论:0      收藏:0      [点我收藏+]

第二题一直wa,无语了。

思路写一下吧,

1.先用图的方式保存这个树 比如2的父节点为1则d[1][2]=1;d[i][j]表示j的父节点为i。

2.计算每个节点的深度

3.对树进行操作

bubuko.com,布布扣
#include<iostream>
#include<string.h>
#define  N 1001
using namespace std;
int d[N][N];
int depth[N];
long long w[N];
int n;
void calucatedepth(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(d[i][j])
                depth[j]=1+depth[i];
        }
    }
}
void operatree(int u,int l,int r,int delta){
    if(depth[u]>r)
        return;
    if(depth[u]>=l&&depth[u]<=r){
        w[u]+=delta;
    }
    for(int i=1;i<=n;i++)
        if(d[u][i])
            operatree(i,l,r,delta);
    
}
void printhash(){
    long mod=1000000007;
    long magic=12347;
    long long Hs=0;
    for(int i=1;i<=n;i++){
        Hs=(Hs*magic+w[i])%mod;
    }
    cout<<Hs<<endl;
}
int main(){
    int T;
    cin>>T;
    for(int Case=1;Case<=T;Case++){
        memset(d,0x0,sizeof(d));
        memset(depth,0x0,sizeof(depth));
        memset(w,0x0,sizeof(w));
        cin>>n;
        int temp,Q,u,l,r,delta;
        depth[1]=1;
        for(int i=2;i<=n;i++){
            cin>>temp;
            d[temp][i]=1;
        }
        calucatedepth();
        cin>>Q;
        while(Q--){
            cin>>u>>l>>r>>delta;
            operatree(u,l,r,delta);
        }
        cout<<"Case "<<Case<<": ";
        printhash();
    }
}
bubuko.com,布布扣

不知道错在哪里,求指导啊。

微软编程之美初赛第一场第二题树,布布扣,bubuko.com

微软编程之美初赛第一场第二题树

原文:http://www.cnblogs.com/royjwy/p/3675656.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!