hdu 5877

#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <string>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL __int64
#define eps 1e-8
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define MAXN 400020
#define clr(x) memset(x,0,sizeof(x))
#define clr2(x) memset(x,INF,sizeof(x))
#define clr3(x) memset(x,-INF,sizeof(x))
#define clr4(x) memset(x,-1,sizeof(x))


const int maxn = 400000 + 5;

struct Node {
    LL h;
    int  pos;
    bool operator < (const Node tmp) const {
        return h < tmp.h;
    }
} a[maxn];
struct Section {
    int L , R ;
    LL H;
    int index;
    bool operator < (const Section tmp) const {
        return H < tmp.H;
    }
} s[maxn];
int cnt[maxn << 2] , ans[maxn];
void PushUp(int rt)
{
    cnt[rt] = cnt[rt << 1] + cnt[rt << 1 | 1];
}
void build()
{
    memset(cnt , 0 , sizeof(cnt));
}
void update(int p , int l , int r , int rt)
{
    if(l == r) {
        cnt[rt]++;
        return;
    }
    int m = (l + r) >> 1;
    if(p > m)
        update(p , rson);
    else
        update(p , lson);
    PushUp(rt);
}
int query(int L , int R , int l , int r , int rt)
{
    if(L <= l && R >= r) {
        return cnt[rt];
    }
    int m = (l + r) >> 1;
    if(L > m)
        return query(L , R , rson);
    else if(R <= m)
        return query(L , R , lson);
    else
        return query(L , R , lson) + query(L , R , rson);
}


struct Edge
{
    int to,next;
}edge[MAXN];
int head[MAXN],cnte;
int in[MAXN],out[MAXN],t;

void init()
{
    clr(edge);
    memset(head,-1,sizeof(head));
    clr(in);
    clr(out);
    cnte=0;
}

void add(int u,int v)
{
    edge[cnte].to=v;
    edge[cnte].next=head[u];
    head[u]=cnte++;
}
void dfs(int u)
{
    in[u]=++t;
    for (int i=head[u];~i;i=edge[i].next)
    {
        int v=edge[i].to;
        dfs(v);
    }
    out[u]=t;
}


LL tark;
int deg[MAXN];
LL b[MAXN];
int main()
{
    int T , i , j , n , m;
    cin >> T;
    for(int k = 1 ; k <= T ; k++)
    {
        build();
        scanf("%d%I64d",&n,&tark);
        for(i = 1 ; i <= n ; i++) {
            scanf("%d" , &b[i]);
        }

       init();
       clr(deg);
       int u,v;
       for (int i=1;i<n;i++)
       {
           scanf("%d%d",&u,&v);
           add(u,v);
           deg[v]++;
       }
       int st;
       for (int i=1;i<=n;i++)
        if (deg[i]==0)
       {
           st=i;
           break;
       }
       t=0;
       dfs(st);

       m=n;
        for(i = 1 ; i <= n ; i++)
        {
            s[i].L=in[i];
            s[i].R=out[i];
            a[in[i]].h=b[i];
            a[in[i]].pos=in[i];

            if (b[i]!=0)
            s[i].H=tark  / b[i];
            else
            s[i].H=1e9+233;
            s[i].index = i;

        }
        sort(a + 1 , a + n + 1);
        sort(s + 1 , s + m + 1);
        for(i = j = 1 ; i <= m ; i++) {
            while(a[j].h <= s[i].H && j <= n) {
                update(a[j++].pos , 1 , n , 1);
            }
            if (s[i].L+1 <= s[i].R)
            ans[s[i].index] = query(s[i].L + 1 , s[i].R  , 1 , n , 1);
            else
            ans[s[i].index] = 0;
        }
        long long  sum = 0;
        for(i = 1 ; i <= m ; i++)
                   sum+=ans[i];

        cout<<sum<<endl;
    }
    return 0;
}
發佈了44 篇原創文章 · 獲贊 3 · 訪問量 7969
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章