HDU 5877 Weak Pair

A得十分心虚,在自己机子上跑得太慢了,而且没考虑啊a[I]=0的情况

#include<conio.h>
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
const int maxn=1e5+5;
struct rec
{
    long long kinva;
    int id;
    rec(){}
    rec(long long x,int y):kinva(x),id(y){}
    bool operator < (const rec& a)const{return kinva>a.kinva;}
}inv[maxn];
int n;
long long k;
vector<int> tree[maxn];
int a[maxn],f[maxn],Ftree[maxn],ask[maxn];
inline int lowbit(int x)
{
    return x&(-x);
}
void add(int i,int k)
{
    while(i<maxn){Ftree[i]+=k;i+=lowbit(i);}
}
int sum(int i)
{
    int ret=0;
    while(i){ret+=Ftree[i];i-=lowbit(i);}
    return ret;
}
int ans;
void dfs(int p,int u)
{
    ans+=sum(ask[u]);
    add(f[u],1);
    int sz=tree[u].size();
    for(int i=0;i<sz;++i)
    {
        if(tree[u][i]==p)continue;
        dfs(u,tree[u][i]);
    }
    add(f[u],-1);
    //printf("%d->%d,ask[%d]=%d,ans=%d
",p,u,u,ask[u],ans);
}
int main()
{
    //freopen("Input.txt","r",stdin);
    int T;scanf("%d",&T);
    while(T--)
    {
        memset(Ftree,0,sizeof Ftree);for(int i=1;i<=n;++i)tree[i].clear();
        scanf("%d%lld",&n,&k);
        for(int i=1;i<=n;++i){scanf("%d",a+i);inv[i]=rec(k/a[i],i);}
        sort(inv+1,inv+n+1);
        for(int i=1;i<=n;++i)f[inv[i].id]=i;
        for(int i=1,j=n;j>0;j--){while(i<=n&&a[inv[j].id]<=inv[i].kinva)i++;ask[inv[j].id]=i-1;}
        int root,note[maxn];memset(note,0,sizeof note);
        for(int i=1;i<n;++i){int u,v;scanf("%d%d",&u,&v);tree[u].push_back(v);tree[v].push_back(u);note[v]=1;}
        for(root=1;note[root];root++);
        ans=0;dfs(0,root);
        printf("%d
",ans);
    }
}
原文地址:https://www.cnblogs.com/maoruimas/p/9643068.html