hdu 5877

来源:互联网 发布:莫比乌斯环戒指知乎 编辑:程序博客网 时间:2024/06/09 19:02
#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;}
0 0
原创粉丝点击